Python 属性错误:';str';对象没有属性';复印件';解析多部分电子邮件消息时
Python 3.6电子邮件模块因以下错误而崩溃:Python 属性错误:';str';对象没有属性';复印件';解析多部分电子邮件消息时,python,email,mime,multipart,eml,Python,Email,Mime,Multipart,Eml,Python 3.6电子邮件模块因以下错误而崩溃: Traceback (most recent call last): File "empty-eml.py", line 9, in <module> for part in msg.iter_attachments(): File "/usr/lib/python3.6/email/message.py", line 1055, in iter_attachments parts = self.get_pa
Traceback (most recent call last):
File "empty-eml.py", line 9, in <module>
for part in msg.iter_attachments():
File "/usr/lib/python3.6/email/message.py", line 1055, in iter_attachments
parts = self.get_payload().copy()
AttributeError: 'str' object has no attribute 'copy'
我认为这与内容类型为
multipart/mixed
以及电子邮件内容为空有关,这导致get\u payload
返回str
。但是,我不确定,如果标准禁止使用此类EML(但我有很多这样的示例),这是电子邮件模块中的一个错误,还是我使用了错误的代码。如果您将策略更改为严格
:
Parser(policy=policy.strict).parse(eml_file)
解析器引发email.errors.StartBoundaryNotFoundDefect
,如中所述:
StartBoundaryNotFoundDefect
–在内容类型标头中声明的开始边界从未找到
如果使用policy.default
解析消息,然后检查其缺陷
,则它包含两个缺陷:
[StartBoundaryNotFoundDefect(), MultipartInvariantViolationDefect()]
MultipartnVariantViolationDefect
–一条声称是多部分的消息,但未找到子部分。请注意,当消息存在此缺陷时,其is_multipart()方法可能返回false,即使其内容类型声明为multipart
StartBoundaryNotFoundDefect
的一个结果是解析器终止解析,并将消息有效负载设置为到目前为止已捕获的主体—在本例中为nothing,因此有效负载为空字符串,导致在运行代码时出现异常
可以说,Python在调用copy()
之前没有检查负载是否是列表是一个bug
实际上,您必须通过将附件的迭代包装在try/except
中,并根据msg.defects
的内容调整迭代来处理这些消息,或者使用策略进行解析。严格并丢弃所有报告缺陷的邮件。我不鼓励您使用电子邮件模块,因为它将从3.8中弃用,并从3.10中删除。考虑使用另一个电子邮件模块。来源:谢谢,我不知道,但是,在你发布的源代码中,有如下声明:替换:电子邮件(非传统API)
,这意味着,据我所知,电子邮件
模块仍将被使用,仅用于非传统内容。无论如何,我不喜欢重构我的整个电子邮件解析平台,并替换基本解析模块的想法,因为这个错误(我甚至不确定是否有像电子邮件
模块这样的Python解析电子邮件的强大解决方案)。事实上,我发布的代码使用了新的email.message.EmailMessage
,即,事实上,这是对遗留代码的替换,因此我使用的代码没有什么不推荐的地方。
Parser(policy=policy.strict).parse(eml_file)
[StartBoundaryNotFoundDefect(), MultipartInvariantViolationDefect()]