邮件主题的编码是如何工作的?(Django/Python)

3 投票
3 回答
2740 浏览
提问于 2025-04-16 13:54

我正在用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_headerstr.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'

撰写回答