4

我的 Django 应用程序需要以 HTML 格式发送电子邮件。根据官方文档

在电子邮件中包含多个版本的内容会很有用;典型的例子是发送消息的文本和 HTML 版本。使用 Django 的电子邮件库,您可以使用 EmailMultiAlternatives 类来执行此操作。EmailMessage 的这个子类有一个 attach_alternative() 方法,用于在电子邮件中包含额外版本的消息正文。所有其他方法(包括类初始化)都直接继承自 EmailMessage。

...我想出了以下代码:

from django.core.mail import EmailMultiAlternatives
msg = EmailMultiAlternatives()
msg.sender = "someone@somewhere.com"
msg.subject = subject
msg.to = [target,]
msg.attach_alternative(content, "text/html")
msg.send()

这项工作符合预期。但是,在某些情况下,我需要包含 PDF 附件,为此我在之前添加了以下代码msg.send()

if attachments is not None:
    for attachment in attachments:
        content = open(attachment.path, 'rb')
        msg.attach(attachment.name,content.read(),'application/pdf')

虽然这可行 - 所有 PDF 文档都正确附加到电子邮件 - 不想要的副作用是电子邮件的 HTML 内容现在已经消失,我留下了一个空的电子邮件正文,其中附加了 PDF 文档。

我在这里做错了什么?

4

2 回答 2

6

我想到了。

如果您使用EmailMultiAlternatives您显然必须同时提供电子邮件正文的文本格式和 HTML 格式,以应对您的电子邮件有附加附件的情况。我只提供了 HTML 格式,这对于没有附件的电子邮件来说是可以的,但是当添加其他附件(如 PDF 文档)时不知何故令人困惑。

最终工作代码:

text_content = strip_tags(content)
msg = EmailMultiAlternatives()
msg.sender = "someone@somewhere.com"
msg.subject = subject
msg.to = [target]
msg.body = text_content
msg.attach_alternative(content, "text/html")
if attachments is not None:
    for attachment in attachments:
        content = open(attachment.path, 'rb')
        msg.attach(attachment.name,content.read(),'application/pdf')
msg.send()
于 2013-01-29T12:02:32.550 回答
3

如果您想提供纯文本和 text/html 版本,将使用 EmailMultiAlternatives。由收件人的电子邮件客户端决定显示哪个版本。您需要的只是:

from django.core import mail

....

msg = mail.EmailMessage(subject, content,
                        to=[target], from_email='someone@somewhere.com')
if attachments is not None:
    for attachment in attachments:
        msg.attach_file(attachment, 'application/zip')
于 2013-01-29T10:35:08.630 回答