Pywin32操作Outlook使用Restrict筛选邮件后保存附件报Restrict.Attachments错误
问题原因
你的代码存在两处核心错误,直接触发了报错:
- 循环内遍历附件时错误引用了过滤后的邮件集合对象
messages的Attachments属性,而Attachments是**单封邮件实例message**的属性,集合对象本身没有该属性,这是触发Restrict.Attachments报错的直接原因 - 路径拼接函数拼写错误,把
os.path.join写成了os.pah.join - 可选修正:
SaveASFile的标准写法为SaveAsFile,部分环境对大小写敏感也会触发报错;你提前定义的近5小时过滤参数received_dt没有用到,可按需添加过滤规则
修正后代码
import win32com.client as clt import os from datetime import datetime, timedelta outlook = clt.Dispatch('outlook.application') mapi = outlook.GetNamespace("MAPI") inbox = mapi.GetDefaultFolder(6) messages = inbox.Items # 过滤指定发件人,邮箱地址加单引号适配Restrict语法规则 messages = messages.Restrict("[SenderEmailAddress] = 'testmail@testemail.com'") # 按需启用近5小时接收的邮件过滤规则,使用你提前定义的参数 received_dt = datetime.now() - timedelta(hours=5) received_dt = received_dt.strftime('%m/%d/%Y %H:%M %p') messages = messages.Restrict("[ReceivedTime] >= '" + received_dt + "'") save_path = "C:/Users/me/Desktop/" # 提前判断保存目录是否存在,避免路径不存在报错 if not os.path.exists(save_path): os.makedirs(save_path) for message in list(messages): try: # 遍历当前单封邮件的附件,不是邮件集合的附件 for attachment in message.Attachments: attachment.SaveAsFile(os.path.join(save_path, attachment.FileName)) print(f"附件{attachment.FileName}保存成功") except Exception as e: print(f"邮件{message.Subject}处理失败,错误:{e}")
额外注意事项
- 如果发件人是Exchange内部账号,
SenderEmailAddress可能返回的不是标准邮箱格式,可换成判断SenderName属性 - 若Outlook是32位版本,和64位Python存在兼容性问题,也会触发异常报错,需保证两者位数一致
内容的提问来源于stack exchange,提问作者Daniel Daneil
相关产品推荐
相关产品推荐

