Python 电子邮件模块 : form header "From" with some unicode name + email

标签 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==--' 

如您所见,这里一切正常,发件人字段包含电子邮件 Ant ,这很酷。但是如果我想在电子邮件前添加一些名字怎么办?特别是 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 部分)。
所以,我的问题是:我如何告诉电子邮件模块让我的“发件人” header 变得漂亮,例如:
From: =?UTF-8?B?0JLQmtC+0L3RgtCw0LrRgtC1?= <admin@notify.vk.com> ?

此外,我还学习了一些 RFC2822(http://www.faqs.org/rfcs/rfc2822.html,p.3.6.2)。它告诉:

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

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

感谢您的帮助。

最佳答案

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

我希望这会有所帮助。

关于Python 电子邮件模块 : form header "From" with some unicode name + email,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10551933/

相关文章:

Linux crontab 查找并通过电子邮件发送结果接收 EOF

ruby-on-rails - 在Rails中,为什么仅在测试中我的邮件正文为空?

php - 是否有工具可以帮助我弄清楚为什么我的电子邮件被标记为垃圾邮件?

python - 在 Python 3.6+ 中按值对字典排序

Python:集合和set.intersection - 输出的随机顺序?

c# - 为什么发送电子邮件需要这么长时间?

javascript - 如何用 JavaScript 发送电子邮件?

python - pandas 的非常具体的任务

python - 通过 IDLE gui 运行 pytest

python - Django Rest Framework 提示 CSRF