Python 3.6
我正在尝试存档一些旧邮件,并且我想删除其中一些邮件的附件。
但是,如果我使用
clear()
方法,MIME 部分仍保留在邮件中,只是空的(因此假定其类型为 text/plain
)。我想出了一个非常老套的解决方案,将 EmailMessage
对象转换为文本,然后删除任何后面没有标题的边界线,但肯定有更好的方法。
包含两个 .png 内联附件和两个 .txt 附件的示例邮件。
这是一个示例:
from email import policy
from email.parser import BytesParser
from email.iterators import _structure
with open(eml_path, 'rb') as fp:
msg = BytesParser(policy=policy.SMTP).parse(fp)
print(_structure(msg))
for part in msg.walk():
cd = part.get_content_disposition()
if cd is not None:
part.clear()
print(_structure(msg))
原邮件结构:
multipart/mixed
multipart/alternative
text/plain
multipart/related
text/html
image/png
image/png
text/plain
text/plain
去除附件后的结构:
multipart/mixed
multipart/alternative
text/plain
multipart/related
text/html
text/plain
text/plain
text/plain
text/plain
最后4部分是空的,但我想把它们删除。
根据我的尝试,这会导致 Thunderbird 和 Gmail 中出现一些图形问题。一旦我删除了挥之不去的边界线,它们就会正确显示。
我认为你需要调用
set_payload()
来修改结构:
if msg.is_multipart():
payload = msg.get_payload()
payload = [
part for part in payload
if part.get_content_disposition() is None]
msg.set_payload(payload)