邮件主题的编码是如何工作的?(Django/Python)
我正在用EmailMessage对象给Gmail邮箱发送邮件。
邮件的主题大概是这样的:
u"你收到了来自Daėrius ęėįęėįęįėęįę---reply3_433441"
当我收到邮件时,查看邮件信息,发现主题行是这样的:
主题: =?utf-8?b?WW91IGdvdCBhIGxldHRlciBmcm9tIERhxJdyaXVzIMSZxJfEr8SZxJfEr8SZ?=
=?utf-8?b?xK/El8SZxK/EmS0tLXJlcGx5M180MzM0NDE=?=
我该如何解码这个主题行呢?
我已经成功用以下方法解码了邮件正文(text/plain):
for part in msg.walk():
if part.get_content_type() == 'text/plain':
msg_encoding = part.get_content_charset()
msg_text = part.get_payload().decode('quoted-printable')
msg_text = smart_unicode(msg_text, encoding=msg_encoding, strings_only=False, errors='strict')
3 个回答
0
主题行是用UTF-8编码的,但你却把它当成ASCII来读取。最安全的做法是全部都用UTF-8来读取,因为ASCII其实只是UTF-8的一部分。
3
你应该看看Python标准库里的email.header
模块。特别是在文档的最后,有一个decode_header()
函数,可以帮你完成大部分复杂的工作。
4
要了解国际化电子邮件头的格式,可以参考RFC 2047。它的基本格式是 "=?" 字符集 "?" 编码 "?" 编码文本 "?="
。在你的例子中,你有一个用 base-64 编码的 UTF-8 字符串。
你可以使用email.header.decode_header
和 str.decode
这两个函数来解码它,从而得到一个正确的 Unicode 字符串:
>>> import email.header
>>> x = email.header.decode_header('=?utf-8?b?WW91IGdvdCBhIGxldHRlciBmcm9tIERhxJdyaXVzIMSZxJfEr8SZxJfEr8SZ?=')
>>> x
[('You got a letter from Da\xc4\x97rius \xc4\x99\xc4\x97\xc4\xaf\xc4\x99\xc4\x97\xc4\xaf\xc4\x99', 'utf-8')]
>>> x[0][0].decode(x[0][1])
u'You got a letter from Da\u0117rius \u0119\u0117\u012f\u0119\u0117\u012f\u0119'