【问题标题】:How does encoding in email subjects work? (Django/ Python)电子邮件主题中的编码如何工作? (Django/Python)
【发布时间】:2011-07-17 14:58:02
【问题描述】:

我正在向 Gmail 邮箱发送带有 EmailMessage 对象的电子邮件。
电子邮件的主题如下所示: u"你收到了一封来自 Daėrius ęėįęėįęįėęįę---reply3_433441"

当我收到一封电子邮件时,查看邮件信息我可以看到主题行如下所示:

主题:=?utf-8?b?WW91IGdvdCBhIGxldHRlciBmcm9tIERhxJdyaXVzIMSZxJfEr8SZxJfEr8SZ?= =?utf-8?b?xK/El8SZxK/EmS0tLXJlcGx5M180MzM0NDE=?=

如何解码此主题行?

我已经成功解码了电子邮件正文(tex/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') 

【问题讨论】:

标签: python django email encoding


【解决方案1】:

有关国际化电子邮件标头格式的完整说明,请参阅RFC 2047。基本格式为"=?" charset "?" encoding "?" encoded-text "?="。所以在你的情况下,你有一个 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'

【讨论】:

  • 非常感谢。奇迹般有效。我只需要手动将主题行分成几个部分,因为每个部分都必须手动解码。用你的例子在不到 15 分钟内完成了我的任务。
【解决方案2】:

您应该查看 Python 标准库中的 email.header module。特别是,在文档的末尾,有一个 decode_header() 函数,您可以使用它来完成大部分艰苦的工作。

【讨论】:

  • 我不知道,听起来不错
【解决方案3】:

主题行是 utf8,但您将其读取为 ASCII,您最安全地将其全部读取为 utf8,因为 ASCII 实际上仅作为 utf8 的子集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2014-05-24
    • 2011-11-20
    • 1970-01-01
    • 2011-09-02
    • 2014-06-14
    相关资源
    最近更新 更多