You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python编辑EML文件:如何删除EML格式邮件中的指定附件

实现EML邮件删除附件的解决方案

核心思路

  • 用Python标准库email完成EML文件的解析、修改和回写,不需要额外依赖
  • 解析原始EML得到消息对象后,过滤所有非附件的内容(邮件头、纯文本/富文本正文),丢弃标记为附件的部分
  • 最终将处理后的消息对象重新序列化为EML格式保存即可,可支持按需保留指定附件

可直接运行的实现代码

import email
from email import policy
from email.parser import BytesParser
from email.message import MIMENonMultipart

# 1. 解析原始EML文件
with open('message.eml', 'rb') as fp:
    msg = BytesParser(policy=policy.default).parse(fp)

# 2. 创建新的消息对象,保留原始邮件头
new_msg = MIMENonMultipart()
# 复制所有原始邮件头,排除跟内容格式相关的头信息
for k, v in msg.items():
    if k.lower() not in ['content-type', 'content-transfer-encoding']:
        new_msg[k] = v

# 3. 保留邮件正文,丢弃附件
# 先获取纯文本和HTML正文
plain_body = msg.get_body(preferencelist=('plain'))
html_body = msg.get_body(preferencelist=('html'))

# 设置正文,优先保留HTML格式,如果没有就用纯文本
if html_body:
    new_msg.set_content(html_body.get_content(), subtype='html')
elif plain_body:
    new_msg.set_content(plain_body.get_content(), subtype='plain')

# 按需保留指定附件逻辑(需要时放开注释即可)
# keep_attachment_names = ['需要保留的附件1.pdf', '需要保留的附件2.xlsx']
# for part in msg.iter_attachments():
#     current_fname = part.get_filename()
#     if current_fname and current_fname in keep_attachment_names:
#         new_msg.add_attachment(
#             part.get_content(), 
#             filename=current_fname, 
#             maintype=part.get_content_maintype(), 
#             subtype=part.get_content_subtype()
#         )

# 4. 将处理后的内容写入新的EML文件
with open('message_no_attachments.eml', 'wb') as f:
    f.write(new_msg.as_bytes(policy=policy.default))

补充说明

  • 你原有代码中attachments变量未定义,正确遍历附件的方法是调用msg.iter_attachments()
  • 代码默认会删除所有附件,如果你需要保留部分已知文件名的附件,放开注释的白名单过滤逻辑调整即可
  • 处理后的邮件会完整保留原始发件人、收件人、主题、发送时间等元信息,仅移除附件内容

内容的提问来源于stack exchange,提问作者Patrik Novotný

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:54:02