Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 属性错误:';str';对象没有属性';复印件';解析多部分电子邮件消息时_Python_Email_Mime_Multipart_Eml - Fatal编程技术网

Python 属性错误:';str';对象没有属性';复印件';解析多部分电子邮件消息时

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

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_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()]