如何用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
相关产品推荐
相关产品推荐

