从邮件中删除(不明确)附件

1 投票
1 回答
43 浏览
提问于 2025-04-12 22:21

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)

撰写回答