如何使用Python提取Outlook中含指定主题关键词邮件的不同附件
Outlook附件提取代码优化方案
核心修改说明
- 修复原代码未定义
sub_folder的变量错误,调整文件夹路径取值逻辑 - 将主题精确匹配改为关键词模糊匹配,预设匹配关键词列表,同时兼容大小写不同的写法,避免漏匹配
- 新增输出目录自动创建逻辑,避免目录不存在导致的报错
- 优化附件保存规则:仅保存符合格式要求的附件,不会强制给所有文件加
.xlsx后缀避免文件损坏,同时自带序号解决重名覆盖问题
from win32com.client import Dispatch import os # 配置参数 KEYWORDS = ['report', 'weekly report', 'technical report'] # 主题需要包含的关键词 TARGET_FOLDER = 'Folder1' # 目标Outlook文件夹名 OUTPUT_DIR = r"C:\Users\Desktop\Attachments" # 可按需指定要提取的附件后缀,设置为空列表则提取所有附件 ALLOWED_EXT = ['.xlsx', '.xls', '.csv'] # 初始化Outlook对象 outlook = Dispatch("Outlook.Application").GetNamespace("MAPI") root_folder = outlook.Folders.Item(1) T1_folder = root_folder.Folders[TARGET_FOLDER] messages = T1_folder.Items # 自动创建输出目录 os.makedirs(OUTPUT_DIR, exist_ok=True) file_counter = 0 for m in messages: # 主题为空直接跳过 if not m.Subject: continue # 转小写后匹配关键词,不区分大小写 subject_lower = m.Subject.lower() # 只要匹配任意一个关键词就处理 if any(keyword.lower() in subject_lower for keyword in KEYWORDS): # 可按需保留正文读取逻辑,不需要可以直接删除 body_content = m.Body for attachment in m.Attachments: # 过滤指定后缀的附件,不需要过滤可以删除这部分判断 file_ext = os.path.splitext(attachment.FileName)[-1].lower() if ALLOWED_EXT and file_ext not in ALLOWED_EXT: continue file_counter += 1 # 生成不重名的文件名 base_name, ext = os.path.splitext(attachment.FileName) save_name = f"{base_name}_{file_counter}{ext}" save_path = os.path.join(OUTPUT_DIR, save_name) attachment.SaveAsFile(save_path)
可选调整建议
- 如果需要进一步缩小匹配范围,可以在关键词匹配的基础上增加正文内容匹配、附件文件名匹配的逻辑,只需要在
if any(...)的判断条件中额外加对应规则即可 - 如果邮件数量非常大,可以先给
messages按接收时间排序,或者加时间范围过滤,减少不必要的遍历 - 如果需要避免重复提取已经处理过的邮件,可以给处理过的邮件加标记,或者记录已处理邮件的EntryID存在本地文件里,下次运行直接跳过已处理项
内容的提问来源于stack exchange,提问作者Chaa MH
相关产品推荐
相关产品推荐

