Python邮件头解码(decode_header)在多行头部失败

7

我正在构建一个系统,使用Python的imaplibemail模块从一个Gmail帐户中读取电子邮件并获取主题。有时,从hotmail帐户接收到的电子邮件标题中会有换行符,例如:

In [4]: message['From']
Out[4]: '=?utf-8?B?aXNhYmVsIG1hcsOtYSB0b2Npbm8gZ2FyY8OtYQ==?=\r\n\t<isatocino22@hotmail.com>'

如果我尝试解码该标头,它什么也不做:

In [5]: email.header.decode_header(message['From'])
Out[5]: [('=?utf-8?B?aXNhYmVsIG1hcsOtYSB0b2Npbm8gZ2FyY8OtYQ==?=\r\n\t<isatocino22@hotmail.com>', None)]

然而,如果我用空格替换换行和制表符,它就可以正常工作:
In [6]: email.header.decode_header(message['From'].replace('\r\n\t', ' '))
Out[6]: [('isabel mar\xc3\xada tocino garc\xc3\xada', 'utf-8'), ('<isatocino22@hotmail.com>', None)]

这是decode_header的一个bug吗?如果不是,我想知道还有哪些类似的特殊情况需要注意。

2个回答

5

这是一个在decode_header中的bug,该bug存在于Python2.7中,并在Python3.3中得到了修复。

>>> sys.version_info
sys.version_info(major=3, minor=3, micro=2, releaselevel='final', serial=0)
>>> email.header.decode_header('=?utf-8?B?aXNhYmVsIG1hcsOtYSB0b2Npbm8gZ2FyY8OtYQ==?=\r\n\t<isatocino22@hotmail.com>')
[(b'isabel mar\xc3\xada tocino garc\xc3\xada', 'utf-8'), (b'<isatocino22@hotmail.com>', None)]

vs

>>> sys.version_info
sys.version_info(major=2, minor=7, micro=5, releaselevel='final', serial=0)
>>> email.header.decode_header('=?utf-8?B?aXNhYmVsIG1hcsOtYSB0b2Npbm8gZ2FyY8OtYQ==?=\r\n\t<isatocino22@hotmail.com>')
[('=?utf-8?B?aXNhYmVsIG1hcsOtYSB0b2Npbm8gZ2FyY8OtYQ==?=\r\n\t<isatocino22@hotmail.com>', None)]

谢谢。他们正在为2.7分支修复它吗?我希望如此! - José Tomás Tocino
那么,Python 2.7的解决方案是什么? - Sergius

1

这个错误在一些Python 2.7版本中仍然存在,因此可以使用以下解决方法:

>>> email.header.decode_header('=?utf-8?B?aXNhYmVsIG1hcsOtYSB0b2Npbm8gZ2FyY8OtYQ==?=\r\n\t<isatocino22@hotmail.com>'.replace('\r\n\t', ' '))
[('isabel mar\xc3\xada tocino garc\xc3\xada', 'utf-8'), ('<isatocino22@hotmail.com>', None)]

它将CLRF和制表符替换为空格。这样,decode_header就可以正确解析标题了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接