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

Rog*_*ger 4 django

我的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()
Run Code Online (Sandbox Code Playgroud)

这项工作如预期.但是,在某些情况下,我需要包含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')
Run Code Online (Sandbox Code Playgroud)

虽然这有效 - 所有PDF文档都正确附加到电子邮件 - 但不必要的副作用是电子邮件的HTML内容现在已经消失,而且我留下了一个空的电子邮件正文,其上附有PDF文档.

我在这做错了什么?

Rog*_*ger 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()
Run Code Online (Sandbox Code Playgroud)