从邮件中删除(不明确)附件
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
最后四个部分是空的,但我想把它们删除掉。
根据我尝试的情况,这在 Thunderbird 和 Gmail 中会导致一些显示问题。一旦我删除了多余的边界行,它们就能正确显示了。
1 个回答
2
我觉得你需要调用 set_payload()
这个函数来修改结构:
if msg.is_multipart():
payload = msg.get_payload()
payload = [
part for part in payload
# optionally fine-tune the condition, e.g.
# you might want to keep the "inline" parts
if part.get_content_disposition() is None]
msg.set_payload(payload)