如何提取Outlook邮件附件至下载文件夹?解决WinError 2报错
问题分析与解决方案
错误原因
- 文件路径错误:
os.listdir(c)仅返回文件名,不是完整路径,直接使用会导致系统找不到文件(对应WinError 2)。 - 拼写错误:
os.starfile是笔误,正确应为os.startfile,但即便修正,这种方式也无法获取邮件对象来提取附件。 - 对象类型错误:循环变量
f是字符串类型的文件名,不是Outlook邮件对象,无法直接调用.Attachments属性。 - 未过滤文件类型:没有筛选
.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
相关产品推荐
相关产品推荐

