Python电子邮件模块:表单标题“From”,带有一些unicode名称+电子邮件

时间:2012-05-11 13:05:08

标签: python email

我在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 one:

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,p.3.6.2)。它告诉:

发起者字段指示源的邮箱    信息。 “发件人:”字段指定邮件的作者,    即,负责人或系统的邮箱    用于撰写信息。 “发件人:”字段指定    邮箱的代理负责实际的传输    信息。例如,如果秘书要发送消息    另一个人,秘书的邮箱会出现在    “发件人:”字段和实际作者的邮箱将出现在    “发件人:”字段。如果可以指示消息的发起者    由单个邮箱和作者和发射器相同,    “发件人:”字段不应该被使用。否则,两个字段都应该    出现。

这是否意味着我应该合并这两个标题? (来自和发件人)。我有点困惑,因为我注意到我的Gmail中有很多电子邮件(通过“显示原始文件”查看),其中显示了来自字段名称和电子邮件。

感谢您的帮助。

1 个答案:

答案 0 :(得分:34)

您需要使用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

我希望这会有所帮助。