在Django/Python中将生成的PDF附加到Mailgun消息中

7 投票
2 回答
2025 浏览
提问于 2025-04-29 11:59

我正在尝试把我们的应用从使用 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]

撰写回答