在Django/Python中将生成的PDF附加到Mailgun消息中
我正在尝试把我们的应用从使用 Python 邮件切换到 Mailgun,但在处理带附件的邮件时遇到了麻烦。具体来说,就是应用生成的 PDF 文件(这些文件并没有存储在文件系统中)。
发送没有附件的邮件没有问题。
目前我们是这样生成 PDF 的:
pdf = StringIO()
draw_pdf(pdf, params)
pdf.seek(0)
attachment = MIMEApplication(pdf.read())
attachment.add_header("Content-Disposition", "attachment", filename=filename)
pdf.close()
然后我们是这样附加并发送邮件的:
from django.core.mail import EmailMultiAlternatives
msg = EmailMultiAlternatives(subject, text_content, from_email, to_email)
if html_content:
msg.attach_alternative(html_content, "text/html")
if attachment:
msg.attach(attachment)
msg.send()
这个方法很好用……那么我们该如何转换成 Mailgun 的调用呢?
我尝试了各种方法,包括直接把它作为文件传递(但没有成功):
requests.post(mailgun_url, auth=("api", mailgun_api), data=data, files=attachment)
上面的代码在没有附件的情况下运行得很好。data 包含了收件人、发件人、标签等信息。
任何帮助都非常感谢。谢谢!
编辑
我通过修改我的 PDF 代码并正确构建 requests.post 的结构,让它成功运行了:
filename = "pdf_attachment.pdf"
pdf = StringIO()
draw_pdf(pdf, params)
pdf.seek(0)
attachment = ("attachment", (filename, pdf.read()))
r = requests.post(mailgun_url, auth=("api", mailgun_api), data=data, files=[attachment])
2 个回答
1
根据文档,文件参数应该是一个字典或者一个元组的列表。它应该是在寻找某种名称。
requests.post(
...,
files=[("attachment", open("files/test.jpg"))],
)
3
我通过修改我的PDF代码,并正确设置requests.post的结构,让它成功运行了。
filename = "pdf_attachment.pdf"
pdf = StringIO()
draw_pdf(pdf, params)
pdf.seek(0)
attachment = ("attachment", (filename, pdf.read()))
r = requests.post(mailgun_url, auth=("api", mailgun_api), data=data, files=[attachment]