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

如何用Python通过Outlook提取嵌套邮件中的深层附件?

解决Outlook嵌套邮件附件提取问题

原代码仅能处理顶层邮件的附件,无法遍历“外层邮件→作为附件的邮件→目标附件”这种嵌套结构。要批量提取所有层级的附件,需要通过递归遍历识别并处理内嵌的邮件附件。

修改后的完整代码

from pathlib import Path
import win32com.client

# 创建输出根目录
output_dir = Path.cwd() / "Output"
output_dir.mkdir(parents=True, exist_ok=True)

# 连接Outlook
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)  # 6对应收件箱
messages = inbox.Items

def process_attachments(attachments, save_path, outlook_namespace):
    """递归处理所有层级的附件"""
    for attachment in attachments:
        # 附件类型为5时,代表是Outlook项目(比如内嵌邮件)
        if attachment.Type == 5:
            # 获取内嵌的邮件对象
            embedded_msg = attachment.Object
            # 为内嵌邮件创建单独的子文件夹
            embedded_folder = save_path / f"内嵌邮件_{embedded_msg.Subject}"
            embedded_folder.mkdir(parents=True, exist_ok=True)
            # 保存内嵌邮件的正文
            Path(embedded_folder / "EMAIL_BODY.txt").write_text(str(embedded_msg.Body))
            # 递归处理内嵌邮件的附件
            process_attachments(embedded_msg.Attachments, embedded_folder, outlook_namespace)
        else:
            # 普通附件直接保存
            try:
                attachment.SaveAsFile(save_path / str(attachment.FileName))
            except Exception as e:
                print(f"保存附件 {attachment.FileName} 失败: {str(e)}")

# 遍历收件箱中的每一封邮件
for message in messages:
    # 跳过非标准邮件对象(比如已删除的占位项)
    if message.Class != 43:  # 43代表标准MailItem
        continue
    subject = message.Subject
    target_folder = output_dir / str(subject)
    target_folder.mkdir(parents=True, exist_ok=True)
    
    # 保存当前邮件的正文
    Path(target_folder / "EMAIL_BODY.txt").write_text(str(message.Body))
    # 处理当前邮件的所有附件(包括嵌套附件)
    process_attachments(message.Attachments, target_folder, outlook)

关键说明

  • 递归函数process_attachments:核心逻辑,遍历所有附件,识别内嵌邮件后递归处理其附件,普通附件直接保存。
  • 附件类型判断:attachment.Type == 5对应Outlook内置枚举olItemAttachment,用来精准识别作为附件的邮件对象。
  • 异常捕获:避免单个附件保存失败(比如文件名非法、权限不足)导致整个批量任务中断。
  • 邮件过滤:通过message.Class筛选标准邮件对象,跳过无效的系统占位项。

内容的提问来源于stack exchange,提问作者Alec Ric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:15:29