Python decode_header拆分原始字符串

时间:2017-06-13 10:59:33

标签: python string email parsing email-headers

使用Python 3,我试图解析mbox文件中的电子邮件。

for message in mailbox.mbox('file'):
    sender = message['From']
    c = decode_header(sender)

原始电子邮件具有此唯一From:标题

From: "=?UTF-8?Q?Mark_from_Site?=" <info@site.com>

无论如何,c

[(b'"', None), (b'Mark from Site', 'utf-8'), (b'" <info@site.com>', None)]

在这种情况下,该行意外地在多个元素中的引号"之后拆分。

处理这个可能很麻烦,因为根据"的数量,列表中可能存在未定义数量的元素(并不总是如上所述),并且可能还有其他原因需要拆分。

如果没有字符串编码(即标题为纯ascii时),则表示没有拆分,c"Mark from Site" <info@site.com>

对于非ascii编码,有没有办法避免这种分裂?

或者,否则,如何正确解析这种标题?

3 个答案:

答案 0 :(得分:1)

做最简单的事情,即。将所有部分转换为Unicode,然后将它们粘合在一起:

from = ''.join(t[0].decode(t[1] if t[1] else 'UTF-8') for t in decode_header(sender))

答案 1 :(得分:0)

您可以通过使用字符串创建email.header的实例以及应编码的字符集来为您设置email.header.Header模块句柄编码。

from email.header import Header

for message in mailbox.mbox('file'):
    sender = Header(message['From'], "utf-8")
    c = decode_header(sender)

答案 2 :(得分:0)

str(email.header.make_header(email.header.decode_header(encoded_string)))

不太明显,但这应该解码并正确重建标头并将其转换为字符串。我也在 StackOverflow 上的某个地方找到了这个。

不确定这是否是最优雅的方式,但似乎对我有用。

有关这些函数的文档,请参阅 https://docs.python.org/3/library/email.header.html