使用Python提取Outlook指定文件夹邮件接收日期时输出重复如何解决
问题根因
- 变量名不匹配:你将目标子文件夹对象赋值给了
pega变量,后续读取邮件列表时误用了未定义的InboxSubfolder,如果你代码能正常运行,说明之前调试时给InboxSubfolder赋值过固定的单封邮件对象,导致一直读取同一封邮件的信息。 - 属性未随遍历更新:
received_date仅在循环外读取了第一封邮件的接收时间,循环内始终打印这个固定值,没有随着遍历新邮件更新属性。
修正后代码
import win32com.client import os from datetime import datetime, timedelta, date outlook = win32com.client.Dispatch("Outlook.Application").GetNameSpace("MAPI") mailbox = outlook.Folders.Item("$OutlookMailbox") inbox = mailbox.Folders.Item("Inbox") # 目标子文件夹对象赋值给pega,后续统一用这个变量 pega = inbox.Folders.Item("InboxSubfolder") # 读取子文件夹下所有邮件,可加排序方便后续筛选,这里按接收时间降序排列 messages = pega.Items messages.Sort("[ReceivedTime]", True) # 第二个参数True为降序,False为升序 # 遍历所有邮件,每次读取当前邮件的接收时间 for message in messages: # 避免遍历到日历、会议邀请等非邮件对象报错,可加类型判断 if message.Class == 43: # 43对应Outlook邮件类型常量olMail received_date = message.ReceivedTime print(received_date) # 也可以在这里直接做日期筛选,比如只取近7天的邮件 # if received_date >= datetime.now() - timedelta(days=7): # print(received_date, message.Subject)
额外注意事项
- 遍历的时候建议增加
message.Class == 43的判断,避免子文件夹内存在会议邀请、日历提醒等非邮件对象时抛出属性不存在的错误。 - 如果文件夹内邮件数量较多,可直接使用Outlook的Restrict方法提前筛选目标日期范围的邮件,不需要全量遍历,效率更高,示例写法:
messages = pega.Items.Restrict("[ReceivedTime] >= '2024-01-01'"),日期格式需要符合Outlook的要求。
内容的提问来源于stack exchange,提问作者user16910936
相关产品推荐
相关产品推荐

