这是我的测试电子邮件。名为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']
信息。
有人可以为此建议一个解决方案(不使用正则表达式)吗?谢谢大家。
答案 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库成功解析。
无论如何,这对我来说似乎是一个错误,因为该库在无任何错误或警告的情况下默默地忽略了有问题的字段,并且我找不到检测该问题的选项。