如何从电子邮件标题中获取详细信息?

时间:2019-10-11 07:43:29

标签: python email-parsing

这是我的测试电子邮件。名为aa.eml

Received: from abcd
 Thu, 26 Sep 2019 07:31:55 +0000
Message-ID:<123>
From: TEST@ <abc-def.com donotreply@abc-def.com>
To: TEST <test@test.com>
Subject: Spam Test for Wednesday, September 25, 2019
Date: Thu, 26 Sep 2019 07:31:19 +0000
Reply-To: TEST <abc-def.com donotreply@abc-def.com>
MIME-Version: 1.0
Content-type: Multipart/related; charset=Windows-1252;
 boundary="00B105B8_message_boundary"

我正在使用email.parser.BytesParser()获取EmailMessage对象。

我的代码:

>>>from email import policy, parser
>>>aa_email = parser.BytesParser(policy=policy.default).parse(open("aa.eml", 'rb'))
>>>aa_email['from']
'<>'
>>>aa_email['reply-to']
'TEST <"abc-def.com donotreply"@abc-def.com>'

我使用此BytesParser的原因是我可以获得标头的特定信息,例如:

>>>aa_email['reply-to'].addresses
(Address(display_name='TEST', username='abc-def.com donotreply', domain='abc-def.com'),)

您可以看到['from']['reply-to']@符号上只是不同,使我无法获得['from']之类的['reply-to']信息。

有人可以为此建议一个解决方案(不使用正则表达式)吗?谢谢大家。

1 个答案:

答案 0 :(得分:1)

不是真正的答案,但评论太久了。

我没有直接的解决方法(手动解析除外),因为测试电子邮件既不符合RFC 2822(在Python标准库中引用)也不符合最新的RFC5322。Python库要求符合标头。 / p>

根据RFC,From头字段包含一个地址(或一组地址)。这里的内容假装为简单的地址,格式为 display_name angle_addr angle_addr 部分(<abc-def.com donotreply@abc-def.com>)看起来有效,但 display_name 部分(TEST@)无效。

RFC要求 display_name 部分为包含原子引号字符串短语。原子不能包含@之类的特殊字符。因此,From:标头字段应写为:

From: "TEST@" <abc-def.com donotreply@abc-def.com>

此库可以由Python库成功解析。

无论如何,这对我来说似乎是一个错误,因为该库在无任何错误或警告的情况下默默地忽略了有问题的字段,并且我找不到检测该问题的选项。