Python 邮件解析及多个 Received 记录问题

0 投票
1 回答
2062 浏览
提问于 2025-04-16 06:57

我正在尝试用 Python 的 email.parser 来解析电子邮件。当我的邮件里有多个“Received”记录时,email.parser 好像会忽略这些记录。

比如,输入是:

...
Received: from localhost (jalapeno [127.0.0.1])
    by jmason.org (Postfix) with ESMTP id 5C4E816F6D
    for <jm@localhost>; Sun,  6 Oct 2002 22:54:39 +0100 (IST)
Received: from jalapeno [127.0.0.1]
    by localhost with IMAP (fetchmail-5.9.0)
    for jm@localhost (single-drop); Sun, 06 Oct 2002 22:54:39 +0100 (IST)
...

输出是:

...
Received ::: from localhost (jalapeno [127.0.0.1])
    by jmason.org (Postfix) with ESMTP id 5C4E816F6D
    for <jm@localhost>; Sun,  6 Oct 2002 22:54:39 +0100 (IST)
Received ::: from localhost (jalapeno [127.0.0.1])
    by jmason.org (Postfix) with ESMTP id 5C4E816F6D
    for <jm@localhost>; Sun,  6 Oct 2002 22:54:39 +0100 (IST)
...

我使用的 Python 代码是:

import email
f = open('email.txt', 'r')
data = f.read()
e = email.message_from_string(data)
for i in e.keys():
    print i, ':::', e[i]

这是 email.parser 的一个 bug 吗?

你有什么其他的电子邮件解析库推荐吗?

1 个回答

2

Python的文档里关于email.__getitem__()有这么一段话:

注意,如果消息的头部中同一个字段出现了多次,返回的具体哪个字段的值是不确定的。要获取所有存在的同名字段的值,可以使用get_all()方法。

所以,要获取所有的Received:头部的值,应该用e.get_all(i)而不是e[i]。

撰写回答