如何用win32com.client获取Outlook指定发件人的最新邮件以下载附件?
获取Outlook指定发件人最新邮件并下载附件的解决方案
问题说明
需要获取Outlook中指定发件人的最新邮件并下载其附件,但原有的基于接收时间范围筛选的代码因发件时间不固定无法生效,现有代码能列出该发件人所有邮件,需优化为仅提取最新邮件的附件。
优化后的代码实现
import win32com.client as client import os # 连接Outlook并获取收件箱 ol_app = client.Dispatch("Outlook.Application").GetNameSpace("MAPI") inbox = ol_app.GetDefaultFolder(6) # 6对应Outlook的收件箱文件夹 messages = inbox.Items # 筛选指定发件人的邮件 target_sender = 'test@test.com' filtered_messages = messages.Restrict(f"[SenderEmailAddress] = '{target_sender}'") # 按接收时间降序排序,最新邮件排在首位 filtered_messages.Sort("[ReceivedTime]", True) # 处理最新邮件的附件 if filtered_messages.Count > 0: latest_email = filtered_messages.Item(1) print(f"找到目标最新邮件:{latest_email.Subject}") # 设置附件保存目录,可自行修改 save_dir = r"C:\Outlook_Attachments" # 确保保存目录存在,不存在则创建 os.makedirs(save_dir, exist_ok=True) # 遍历并保存附件 for att in latest_email.Attachments: # 处理文件名中的非法字符,避免保存失败 safe_filename = att.FileName.replace('/', '_').replace('\\', '_').replace(':', '_') save_path = os.path.join(save_dir, safe_filename) att.SaveAsFile(save_path) print(f"附件已保存:{save_path}") else: print(f"未找到发件人为 {target_sender} 的邮件")
关键优化点
- 高效筛选发件人:使用
Restrict方法直接过滤指定发件人的邮件,比循环遍历所有邮件效率更高,尤其适合收件箱邮件较多的场景 - 排序取最新:通过
Sort("[ReceivedTime]", True)对筛选后的邮件按接收时间降序排列,确保第一个元素就是最新收到的邮件;若需按发件时间排序,可将[ReceivedTime]替换为[SentOn] - 容错处理:用
os.makedirs确保保存目录存在,同时对附件文件名做非法字符替换,避免因路径问题导致保存失败
内容的提问来源于stack exchange,提问作者Lee Murray
相关产品推荐
相关产品推荐

