如何用imap_tools基于原邮件创建替换大附件为备注的新邮件
基于imap_tools处理大邮件附件的实现方案
需求说明:遍历邮件,将大于指定大小的附件保存到本地文件夹,用标注该附件存储位置的纯文本备注替换原附件;创建修改后的邮件副本,上传到邮箱后删除原邮件。
完整实现代码
import os from copy import deepcopy from email.mime.text import MIMEText from imap_tools import MailBox, A, U, MailMessage # 配置信息 USER = "your_email@gmail.com" PASSWORD = "your_app_password" # Gmail需使用应用专用密码 TARGET_FOLDER = "[Gmail]/All Mail" ATTACHMENT_SAVE_PATH = "./saved_attachments" LARGE_ATTACHMENT_THRESHOLD = 100_000 # 阈值设置为100KB # 创建附件保存目录(不存在则自动创建) os.makedirs(ATTACHMENT_SAVE_PATH, exist_ok=True) # 登录邮箱并处理邮件 with MailBox("imap.gmail.com").login(USER, PASSWORD, initial_folder=TARGET_FOLDER) as mailbox: msg_id = "30214" # 获取目标邮件 for msg in mailbox.fetch(A(uid=U(msg_id))): print(f"处理邮件: {msg.date}, 主题: {msg.subject}, 附件数量: {len(msg.attachments)}, 大小: {msg.size}") # 1. 保存大附件并记录替换信息 replaced_attachments = [] kept_attachments = [] for att in msg.attachments: if att.size > LARGE_ATTACHMENT_THRESHOLD: # 生成本地保存路径并写入文件 save_path = os.path.join(ATTACHMENT_SAVE_PATH, att.filename) with open(save_path, "wb") as f: f.write(att.payload) print(f"已保存大附件: {save_path}") # 记录替换备注内容 replaced_attachments.append(f"原附件 {att.filename} (大小: {att.size//1024}KB) 已保存至: {save_path}") else: # 保留小附件 kept_attachments.append(att) # 2. 构造修改后的新邮件 # 深拷贝原邮件,避免修改原对象 new_msg = deepcopy(msg) # 清空原有附件列表,重新添加内容 new_msg.attachments = [] # 添加保留的小附件 for att in kept_attachments: new_msg.attachments.append(att) # 添加纯文本备注附件(如果有被替换的大附件) if replaced_attachments: note_content = "\n".join(replaced_attachments) # 构造文本附件对象 note_attachment = MIMEText(note_content, "plain", "utf-8") note_attachment.add_header("Content-Disposition", "attachment", filename="附件替换说明.txt") # 转换为imap_tools可识别的Attachment格式 new_msg.attachments.append(MailMessage.Attachment( filename="附件替换说明.txt", payload=note_attachment.get_payload(decode=True), content_type=note_attachment.get_content_type(), size=len(note_content.encode()) )) # 3. 上传新邮件副本到邮箱 mailbox.append(new_msg.raw, folder=TARGET_FOLDER) print("已创建修改后的邮件副本") # 4. 删除原邮件 mailbox.delete([msg.uid]) print("已删除原邮件")
关键步骤说明
- 附件保存:遍历邮件附件,判断大小后将大附件的二进制内容写入本地文件,同时记录替换所需的备注信息。
- 邮件修改:用
deepcopy深拷贝原邮件对象,清空原有附件列表后,重新添加保留的小附件和纯文本备注附件,确保原邮件内容不受影响。 - 邮箱操作:通过
mailbox.append上传修改后的邮件,再用mailbox.delete移除原邮件,完成替换流程。
注意事项:
- Gmail账号需开启IMAP功能,并使用应用专用密码(而非常规登录密码)进行验证。
- 若需批量处理邮件,可修改
mailbox.fetch的筛选条件,例如A(all=True)遍历所有邮件。 - 附件保存路径可根据实际需求调整,确保目标目录有足够磁盘空间。
内容的提问来源于stack exchange,提问作者divingTobi
相关产品推荐
相关产品推荐

