如何在邮件服务器上替换已接收邮件的原有附件为新.xlsx文件?
替换邮件服务器中已存储邮件的附件方案
看起来你已经搞定了邮件解析和附件提取的关键步骤,替换附件其实核心是重新构建邮件结构——毕竟你提到的这类命名格式的文件(比如1518536813.M362147P20908.domain_name,S=4359863,W=4449393:2,RS),本质是邮件服务器(比如Postfix)存储的符合MIME标准的单封邮件文件,只要拆解后重新组合就能实现需求。我之前处理过类似场景,给你一套可落地的方案:
核心思路
- 读取并解析原始邮件的MIME结构
- 分离出邮件的非附件内容(正文、签名、内嵌图片等你想保留的部分)
- 移除所有原有附件
- 添加新的.xlsx文件作为附件
- 重新组装邮件并写回原文件(记得先备份!)
具体实现(Python示例)
用Python标准库email就能完成所有操作,不需要额外依赖,稳定性高:
import os import email from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart # 1. 读取原始邮件文件 email_file_path = "1518536813.M362147P20908.domain_name,S=4359863,W=4449393:2,RS" with open(email_file_path, 'rb') as f: original_msg = email.message_from_bytes(f.read()) # 2. 分离非附件内容(保留正文、内嵌资源等) non_attachment_parts = [] for part in original_msg.walk(): # 跳过multipart容器本身 if part.is_multipart(): continue # 判断是否为附件:有attachment标识,或为application类型(可根据需求调整规则) content_disposition = part.get("Content-Disposition", "") if "attachment" in content_disposition or part.get_content_maintype() == "application": continue # 保留非附件部分 non_attachment_parts.append(part) # 3. 构建新的邮件容器 new_msg = MIMEMultipart() # 复制原始邮件的所有头部信息(主题、发件人、收件人等) for header_name, header_value in original_msg.items(): new_msg[header_name] = header_value # 4. 添加保留的非附件内容 for part in non_attachment_parts: new_msg.attach(part) # 5. 添加新的.xlsx附件 new_xlsx_path = "your_new_file.xlsx" with open(new_xlsx_path, 'rb') as f: xlsx_content = f.read() # 创建MIME附件对象,设置正确的文件类型 xlsx_part = MIMEApplication( xlsx_content, _subtype="vnd.openxmlformats-officedocument.spreadsheetml.sheet" ) xlsx_part.add_header( 'Content-Disposition', 'attachment', filename=os.path.basename(new_xlsx_path) ) new_msg.attach(xlsx_part) # 6. 备份原文件并写入新邮件(重要!防止数据丢失) os.rename(email_file_path, f"{email_file_path}.bak") with open(email_file_path, 'wb') as f: f.write(new_msg.as_bytes())
关键注意事项
- 备份优先:处理前一定要备份原邮件文件,避免操作失误导致数据丢失
- 附件判断规则:如果你的邮件有需要保留的内嵌资源(比如正文里的图片,Content-Disposition为
inline),可以调整判断条件,只移除attachment类型的附件 - 签名/加密邮件:如果原邮件是S/MIME加密或签名的,替换附件会破坏签名,需要额外处理解密和重新签名的逻辑(如果有这类场景可以再细化)
- Content-Length自动更新:重新生成邮件时,
Content-Length头部会自动计算,不需要手动修改
内容的提问来源于stack exchange,提问作者Jackson_DKMG
相关产品推荐
相关产品推荐

