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ý
相关产品推荐
相关产品推荐

