Python电子邮件模块:用一些Unicode名称+电子邮件形式的标头“From”

14

我正在使用Python的邮件模块生成电子邮件。
这里是几行代码,展示了我的问题:

msg = email.MIMEMultipart.MIMEMultipart('alternative')

msg['From'] = "somemail@somedomain.com"

msg.as_string()

Out[7]: 'Content-Type: multipart/alternative;\n boundary="===============9006870443159801881=="\nMIME-Version: 1.0\nFrom: somemail@somedomain.com\n\n--===============9006870443159801881==\n\n--===============9006870443159801881==--' 

你可以看到,这里一切正常,发件人字段包含电子邮件并且很酷。但是如果我想在电子邮件之前添加一些名称呢?特别是Unicode名称:

In [8]: u.get_full_name()
Out[8]: u'\u0414\u0438\u043c\u0430 \u0426\u0443\u043a\u0430\u043d\u043e\u0432'

In [9]: msg = email.MIMEMultipart.MIMEMultipart('alternative')

In [10]: msg['From'] = "%s <%s>" % (u.get_full_name(), "email@at.com")

In [11]: msg.as_string()
Out[11]: 'Content-Type: multipart/alternative;\n boundary="===============5792069034892928634=="\nMIME-Version: 1.0\nFrom: =?utf-8?b?0JTQuNC80LAg0KbRg9C60LDQvdC+0LIgPGVtYWlsQGF0LmNvbT4=?=\n\n--===============5792069034892928634==\n\n--===============5792069034892928634==--'

从这里可以看到,所有的字符串(名称、电子邮件)都被编码为 base64(这甚至很合理,因为 MIMEMultipart 怎么知道字符串包含 Unicode 和非 Unicode 部分呢)。
我的问题是:我该如何告诉邮件模块给我创建一个漂亮的“发件人”标题,比如:
From: =?UTF-8?B?0JLQmtC+0L3RgtCw0LrRgtC1?= <admin@notify.vk.com> ?

此外,我学了一点 RFC2822(http://www.faqs.org/rfcs/rfc2822.html,第3.6.2页)。它说:

源地址字段指示消息源的邮箱。 "From:" 字段指定消息的作者,即编写消息的人或系统的邮箱。 "Sender:" 字段指定实际传输消息的代理的邮箱。例如,如果秘书为另一个人发送一条消息,则秘书的邮箱将出现在 "Sender:" 字段中,实际作者的邮箱将出现在 "From:" 字段中。如果消息的发件人可以用单个邮箱表示,而作者和发件人相同,则不应使用 "Sender:" 字段。否则,两个字段都应该出现。

这是不是意味着我应该合并这两个标题?(From 和 Sender)。我有点困惑,因为我通过 Gmail 查看“显示原始邮件”时发现很多邮件中的 From 字段呈现为名称和电子邮件地址。

感谢帮助。

1个回答

39

您需要使用email.header.Header单独对名称部分进行编码:

from email.MIMEMultipart import MIMEMultipart
from email.header import Header
from email.utils import formataddr

author = formataddr((str(Header(u'Alał', 'utf-8')), "somemail@somedomain.com"))
msg = MIMEMultipart('alternative')
msg['From'] = author
print msg

我希望这可以帮助到你。


我已经试了几个小时了,还是没搞清楚!谢谢! - Ofir
1
感谢您的阅读。对于那些对formataddr函数中第二个括号表示元组感到困惑的人,这里给予解释。 - Hui-Yu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接