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

如何提取Outlook邮件附件至下载文件夹?解决WinError 2报错

问题分析与解决方案

错误原因

  1. 文件路径错误:os.listdir(c)仅返回文件名,不是完整路径,直接使用会导致系统找不到文件(对应WinError 2)。
  2. 拼写错误:os.starfile是笔误,正确应为os.startfile,但即便修正,这种方式也无法获取邮件对象来提取附件。
  3. 对象类型错误:循环变量f是字符串类型的文件名,不是Outlook邮件对象,无法直接调用.Attachments属性。
  4. 未过滤文件类型:没有筛选.msg格式的邮件文件,会尝试处理下载文件夹中的非邮件文件。

修正后的代码

import os
import win32com.client as win32

# 下载文件夹路径(用原始字符串避免转义问题)
download_path = r"c:\Download"
# 附件保存路径,可根据需求修改
save_path = r"c:\Download\Extracted_Attachments"

# 创建附件保存目录(不存在则自动创建)
os.makedirs(save_path, exist_ok=True)

# 初始化Outlook应用
outlook = win32.Dispatch("Outlook.Application")
namespace = outlook.GetNamespace("MAPI")

# 遍历下载文件夹内的文件
for filename in os.listdir(download_path):
    # 只处理.msg格式的邮件文件
    if filename.lower().endswith(".msg"):
        # 拼接完整文件路径
        full_file_path = os.path.join(download_path, filename)
        try:
            # 通过Outlook加载本地msg文件,获取邮件对象
            mail_item = namespace.OpenSharedItem(full_file_path)
            
            # 遍历并保存所有附件
            for attachment in mail_item.Attachments:
                attachment_full_path = os.path.join(save_path, attachment.FileName)
                attachment.SaveAsFile(attachment_full_path)
                print(f"已保存附件: {attachment.FileName}")
            
            # 关闭邮件对象,不保存修改
            mail_item.Close(0)
        except Exception as e:
            print(f"处理文件 {filename} 时出错: {str(e)}")

关键说明

  • 用os.path.join拼接完整路径,彻底解决文件找不到的问题。
  • 通过namespace.OpenSharedItem加载本地邮件文件,才能获取合法的Outlook邮件对象,进而访问附件属性。
  • 单独创建附件保存目录,避免附件与原邮件文件混放。
  • 增加异常捕获,单个文件处理出错时不会中断整个遍历流程。

内容的提问来源于stack exchange,提问作者Alan Proença

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:55:20