gpt4 book ai didi

python - Django EmailMultiAlternatives 和 HTML 电子邮件在 Win2003 上的 Outlook 2003 中显示

转载 作者:太空宇宙 更新时间:2023-11-04 15:26:24 33 4
gpt4 key购买 nike

从我的 Django 应用程序发送电子邮件时,我正在使用 django.core.mail.EmailMultiAlternatives,以确保在电子邮件客户端不支持 HTML 时邮件降级为文本。

这是我的 send_email 方法:

def send_email(self, from_address, to_list, subject, msg_text, msg_html):
subject=subject.replace('\r','').replace('\n',' ')
self.msg = EmailMultiAlternatives(subject, msg_text, from_address, to_list)
self.msg.attach_alternative(msg_html, "text/html")
self.msg.content_subtype = "html"
self.msg.send()

它适用于 Gmail、Hotmail 和许多其他电子邮件客户端 - 可以毫无问题地显示 HTML 内容。但它不会在 Win2003 上运行的 Outlook 2003 中显示 HTML 内容 - 仅显示文本版本。

如果我强行将 HTML 放入 EmailMultiAlternatives 调用中,即使用 msg_html 而不是 msg_text,如下所示:

self.msg = EmailMultiAlternatives(subject, msg_html, from_address, to_list)

然后它在所有客户端中都能正常工作;但这意味着对于不支持 HTML 或(更有可能)已禁用对它的支持的客户端,没有文本回退。

我认为值得一提的是,电子邮件是在 Mac OS X 上运行的 django 应用程序上生成的(以防万一它与操作系统之间的行终止符差异有关)。

我看到了 people using other languages outlook也遇到过类似的问题...

我想知道是否有人知道为什么 outlook 的行为会有所不同,是否有可以在我的代码中应用的简单修复?

最佳答案

我没有 Outlook 安装可用于对此进行测试,所以我想知道您函数中第五行的原因。

self.msg.content_subtype = "html"

我不太了解多部分电子邮件的内部结构,但在我的系统上,该行导致邮件的两部分都具有文本/html 的内容类型。将其保留在第一部分会产生一条消息,其中第一部分为“Content-Type:text/plain”,第二部分为“Content-Type:text/html”。

无论如何,关于 Java 的问题的答案之一提到将字符集更改为 iso-8859-1。我认为您应该能够使用 django.core.mail 做到这一点。

EmailMessage 类(EmailMultiAlternatives 从中继承)有一个名为“encoding”的属性,它设置要使用的字符集。默认情况下它是 None 所以使用默认的 utf-8 字符集(除非在设置中被覆盖)。

换句话说,在问题中列出的函数的发送行之前添加如下内容:

self.msg.content_subtype = "iso-8859-1"

不幸的是,这只会改变第一部分指定的编码(上面函数中的 msg_text)。附加替代内容的函数似乎没有使用编码属性。我不确定这是正确的方法,但我将 EmailMultiAlternatives 子类化以覆盖相关函数,它似乎工作正常。

class EmailMultiAlternativesWithEncoding(EmailMultiAlternatives):
def _create_attachment(self, filename, content, mimetype=None):
"""
Converts the filename, content, mimetype triple into a MIME attachment
object. Use self.encoding when handling text attachments.
"""
if mimetype is None:
mimetype, _ = mimetypes.guess_type(filename)
if mimetype is None:
mimetype = DEFAULT_ATTACHMENT_MIME_TYPE
basetype, subtype = mimetype.split('/', 1)
if basetype == 'text':
encoding = self.encoding or settings.DEFAULT_CHARSET
attachment = SafeMIMEText(smart_str(content,
settings.DEFAULT_CHARSET), subtype, encoding)
# original text being replaced above (not last argument)
# attachment = SafeMIMEText(smart_str(content,
# settings.DEFAULT_CHARSET), subtype, settings.DEFAULT_CHARSET)
else:
# Encode non-text attachments with base64.
attachment = MIMEBase(basetype, subtype)
attachment.set_payload(content)
Encoders.encode_base64(attachment)
if filename:
attachment.add_header('Content-Disposition', 'attachment',
filename=filename)
return attachment

我不确定“smart_str(content, settings.DEFAULT_CHARSET)”部分是否也应该引用“encoding”而不是“settings.DEFAULT_CHARSET”,但这是处理文本的消息正文(django.core.mail. EmailMessage.消息)。

正如我所说,我没有 Outlook,所以我无法实际测试 Outlook 方面,但它似乎确实将两个部分的字符集更改为 iso-8859-1。

关于python - Django EmailMultiAlternatives 和 HTML 电子邮件在 Win2003 上的 Outlook 2003 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/959985/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com