-1

这是我的测试邮件。命名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']

谁能为此提出解决方案(没有正则表达式)?谢谢大家。

4

1 回答 1

1

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

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

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

RFC 要求display_name部分是包含原子引用字符串的短语。而且原子不能包含特殊字符,例如. 因此,标题字段应该写为:@From:

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

这个可以被Python库成功解析。

无论如何,它对我来说看起来很接近一个错误,因为库默默地忽略了有问题的字段,没有错误或警告,我找不到检测问题的选项。

于 2019-10-11T08:32:43.800 回答