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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:33:27