如何用Python 3.5获取Outlook会话中的最新邮件并保存?
解决Outlook邮件会话过滤与保存问题
我来帮你搞定这两个头疼的问题!咱们一步步拆解优化:
问题1:只保留每个会话的最新邮件
Outlook里同一会话的邮件共享同一个ConversationID属性,我们可以利用这个特性把邮件按会话分组,然后每组只保留接收时间最晚的那封(也就是最新的回复)。核心思路:
- 先把收件箱邮件按
ConversationID分组 - 对每个分组内的邮件按
ReceivedTime降序排序,直接取第一封就是最新邮件
问题2:修复SaveAs只保存第一封的异常
你原来的循环逻辑里,异常处理和GetNext的调用时机混乱,导致后续邮件处理中断。另外直接用数值3对应olMSG格式更稳妥(避免未定义枚举的问题),还得加个重复文件名判断,防止覆盖已有文件。
修改后的完整代码
import win32com.client from collections import defaultdict import os # 用于判断文件是否存在,避免重复覆盖 # 初始化Outlook连接 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") folder = outlook.Folders("Main") subfolder = folder.Folders("Incoming") inbox = subfolder.Folders("folder1") desktop = "C:\\Users\\YourUsername\\Desktop" # 替换成你的实际桌面路径 # 1. 按会话分组,提取每个会话的最新邮件 conversation_groups = defaultdict(list) messages = inbox.Items messages.Sort("[ReceivedTime]", True) # 先按接收时间降序排序,每组第一个就是最新邮件 for msg in messages: try: conv_id = msg.ConversationID conversation_groups[conv_id].append(msg) except Exception as e: print(f"处理邮件时出错: {str(e)}") continue # 只保留每个会话的第一封(最新)邮件 latest_messages = [group[0] for group in conversation_groups.values()] # 2. 筛选符合主题条件的邮件并保存 for x in IDX: # 假设IDX是你定义的搜索关键词列表 for msg in latest_messages: try: subject = msg.Subject if x in subject: print(f"正在保存: {subject}") # 处理重复文件名,避免覆盖 save_path = f"{desktop}\\{subject}.msg" count = 1 while os.path.exists(save_path): save_path = f"{desktop}\\{subject}_{count}.msg" count += 1 # 用数值3代表olMSG格式,无需额外定义枚举 msg.SaveAs(save_path, 3) except Exception as e: print(f"保存邮件出错: {str(e)}") continue
关键优化点说明
- 会话分组逻辑:通过
ConversationID精准识别同一会话,确保只处理最新邮件 - 排序优化:提前按接收时间降序排列,直接取每组首元素,高效获取最新邮件
- 异常处理:细化错误捕获,避免单个邮件出错导致整个循环中断
- 文件名防重复:自动给同名邮件加序号,防止覆盖已保存的文件
内容的提问来源于stack exchange,提问作者Dantuzzo




