在Django中发送电子邮件的困惑

时间:2013-01-29 10:01:04

标签: django

我的Django应用程序需要以HTML格式发送电子邮件。根据{{​​3}}:

  

在内容中包含多个版本的内容会很有用   电子邮件;经典的例子是发送文本和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文档。< / p>

我在这里做错了什么?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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')