【发布时间】:2019-10-16 21:07:48
【问题描述】:
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'
可以使用此 EML 文件重现崩溃,
From: "xxx@xxx.xx" <xxx@xxx.xx>
To: <xx@xxx.xx>
Subject: COURRIER EMIS PAR PACIFICA
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_3181_1274694650.1556805728023"
Date: Thu, 2 May 2019 16:02:08 +0200
还有这段最少的代码:
from email import policy
from email.parser import Parser
from sys import argv
with open(argv[1]) as eml_file:
msg = Parser(policy=policy.default).parse(eml_file)
for part in msg.iter_attachments():
pass
我认为这与 Content-Type 为 multipart/mixed 以及电子邮件内容为空有关,这导致 get_payload 返回 str。但是,我不确定,如果标准禁止这样的 EML(但我有很多这样的示例),这是电子邮件模块中的错误,或者我使用代码错误。
【问题讨论】:
-
我不鼓励您使用
email模块,因为它即将从 3.8 中弃用并从 3.10 中删除。考虑使用另一个电子邮件模块。来源:python.org/dev/peps/pep-0594/#email-legacy-api -
谢谢,我不知道,但是,在您发布的来源中,有以下说明:
Substitute: email (non-legacy APIs)这意味着,据我了解,email模块仍将被使用,仅包含非旧版内容。无论如何,我不喜欢针对这个单一错误重构我的整个电子邮件解析平台并替换基础解析模块的想法(我什至不确定是否有像@ 987654331@模块)。 -
确实,我发布的代码使用的是新的
email.message.EmailMessage,实际上是旧代码的替代品,所以我使用的代码并没有被弃用。
标签: python email mime multipart eml