如何用Python搜索整个Outlook邮箱提取指定主题的邮件
Outlook全邮箱任意层级文件夹搜索提取特定主题邮件实现方案
核心思路是通过递归函数遍历所有层级的文件夹,无需提前指定各级文件夹名称,可覆盖任意深度的子文件夹,同时兼容仅遍历收件箱或遍历整个邮箱两种需求。
完整实现代码
import win32com.client import os import re # 配置项 save_path = 'C:/working path' target_subject_prefix = 'Report on X' # 设为True则遍历整个邮箱,设为False仅遍历收件箱下所有文件夹 scan_entire_mailbox = False os.chdir(save_path) # 初始化Outlook客户端 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") user_mail = outlook.Application.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress # 处理文件名非法字符的工具函数 def sanitize_filename(filename): return re.sub(r'[\\/*?:"<>|]', "_", filename) # 递归遍历文件夹的核心函数 def traverse_folder(folder): # 第一步:处理当前文件夹内的所有邮件 print(f"正在扫描文件夹:{folder.Name}") for message in folder.Items: # 跳过非邮件类对象(比如日历邀请、任务等) if message.Class != 43: continue if message.Subject and message.Subject.startswith(target_subject_prefix): print(f"找到匹配邮件:{message.Subject}") safe_title = sanitize_filename(str(message.Subject)) save_full_path = os.path.join(os.getcwd(), f"{safe_title}.msg") message.SaveAs(save_full_path) # 不需要的话可以注释掉跳过的打印,减少日志输出 else: print("跳过非匹配邮件") # 第二步:递归遍历当前文件夹下的所有子文件夹 for sub_folder in folder.Folders: traverse_folder(sub_folder) # 确定遍历的根节点 if scan_entire_mailbox: root_folder = outlook.Folders[user_mail] else: root_folder = outlook.Folders[user_mail].Folders["Inbox"] # 启动遍历 traverse_folder(root_folder)
关键改动说明
- 新增递归函数
traverse_folder,每进入一个文件夹优先处理当前层级邮件,再自动遍历所有子文件夹,可支持无限层级的目录结构 - 新增了非邮件对象过滤、文件名非法字符替换逻辑,避免运行时报错
- 保留了遍历范围配置开关,可根据需求选择仅扫描收件箱或扫描整个邮箱所有文件夹(包括已发送、已删除、自定义文件夹等)
内容的提问来源于stack exchange,提问作者eduardo2111
相关产品推荐
相关产品推荐

