解码utf8邮件头

时间:2012-10-17 12:31:35

标签: python email utf-8

在我的MUA(Thunderbird 15.0.1)中,两个邮件主题都显示如下:

Keine Mail zu "Abschlagsänderung" gefunden

这是一个重现它的片段:

import email

for subject in ['Subject: Re: Keine Mail zu "=?utf-8?q?Abschlags=C3=A4nderung?=" gefunden',
                'Subject: =?utf-8?q?Keine_Mail_zu_=22Abschlags=C3=A4nderung=22_gefunden?=']:
    msg=email.message_from_string(subject)
    print email.Header.decode_header(msg.get('subject'))

输出:

[('Re: Keine Mail zu "=?utf-8?q?Abschlags=C3=A4nderung?=" gefunden', None)]
[('Keine Mail zu "Abschlags\xc3\xa4nderung" gefunden', 'utf-8')]

第一个头不能被python解析,但是thunderbird会解析。它是由KMail / 1.11.4

创建的

如何在Python 2.7中解析带有元音符的第一个标题?

1 个答案:

答案 0 :(得分:2)

根据RFC 2047

  

“编码字”绝不能出现在“引用字符串”中。

根据RFC 822的'quoted-string'是

  

quoted-string =<“> *(qtext / quoted-pair)<”&gt ;;常规qtext或引用的字符。

所以我认为Python库是正确的,如

"=?utf-8?q?Abschlags=C3=A4nderung?="

是带引号的字符串。使用最少报价的更好的替代方案是

=?utf-8?q?=22Abschlags=C3=A4nderung=22?=

"编码为=22

您可以将"替换为=?utf-8?q?=22?=

来解析它们
>>> email.Header.decode_header('=?utf-8?q?=22?= =?utf-8?q?Abschlags=C3=A4nderung?= =?utf-8?q?=22?=')
[('"Abschlags\xc3\xa4nderung"', 'utf-8')]