使用MAPI与pywin32提取Outlook已发送文件夹指定邮件数据求助
解决方案
你可以通过自定义主题匹配规则+内置属性提取实现需求,优先推荐用Restrict方法预先过滤邮件,避免遍历全量已发送邮件提升运行效率,完整可运行代码如下:
import win32com.client from datetime import datetime, timedelta # 初始化Outlook客户端 outlook = win32com.client.Dispatch('outlook.application') mapi = outlook.GetNamespace("MAPI") sent_folder = mapi.GetDefaultFolder(5) messages = sent_folder.Items # 按发送时间倒序排序,优先匹配最新发送的同主题邮件(可选) messages.Sort("[SentOn]", True) # -------------------------- # 配置你的筛选条件 # -------------------------- # 要匹配的目标邮件主题 TARGET_SUBJECT = "替换为你要查找的特定邮件主题" # 可选:添加时间范围筛选,比如只查最近30天的邮件,进一步缩小范围 # DATE_FILTER = (datetime.now() - timedelta(days=30)).strftime('%m/%d/%Y') # messages = messages.Restrict(f"[SentOn] >= '{DATE_FILTER}'") found = False for msg in messages: # 跳过非邮件类型的项(比如会议邀请、任务等,避免属性调用报错) if msg.Class != 43: continue # 匹配规则可按需调整,以下3种二选一即可 # 1. 精确匹配主题 if msg.Subject.strip() == TARGET_SUBJECT.strip(): # 2. 模糊匹配:只要主题包含目标字符串就匹配 # if TARGET_SUBJECT.strip() in msg.Subject.strip(): # 3. 正则匹配:调用你引入的regex库实现自定义规则匹配 # if re.search(r'你的正则表达式', msg.Subject): print("找到匹配的已发送邮件:") print(f"* 主题:{msg.Subject}") # SentOn返回原生datetime类型,可直接按需求格式化输出 sent_time = msg.SentOn.strftime("%Y-%m-%d %H:%M:%S") print(f"* 发送时间:{sent_time}") found = True # 如果只需要找第一个匹配的邮件,找到后直接跳出循环 break if not found: print("已发送文件夹中未找到符合条件的邮件")
核心逻辑说明
- 类型过滤:通过
msg.Class == 43过滤掉已发送文件夹里非邮件类的内容,避免调用邮件专属属性时报错 - 规则灵活:可以根据自己的需求替换匹配逻辑,也可以叠加发件人、收件人、正文关键字等其他筛选条件
- 性能优化:如果已发送邮件数量非常多,可打开代码中的时间范围筛选注释,预先过滤历史邮件,大幅提升查询速度
- 拓展性强:除了主题和发送时间,还可以直接调用
msg.To(收件人)、msg.Body(正文)、msg.Attachments(附件)等属性提取其他需要的内容
内容的提问来源于stack exchange,提问作者member8766
相关产品推荐
相关产品推荐

