You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:15:03