使用Python保存Outlook邮件为.msg文件时遇com_error错误求助
问题描述
我尝试用Python代码将Outlook文件夹中的邮件下载到本地并保存为.msg文件,代码如下:
messages = source_folder.Items for message in messages: # 估算邮件大小 size = message.Size if size < 5 * 1024 * 1024: # 5MB # 将邮件保存为.msg文件 subject = message.Subject.replace(":", "").replace("\\", "").replace("/", "").replace("*", "").replace("?", "").replace("\"", "").replace("<", "").replace(">", "").replace("|", "") received_time = message.ReceivedTime.strftime("%Y%m%d%H%M%S") file_name = f"{subject}.msg" file_path = os.path.join(email_dir, file_name) time.sleep(10) message.SaveAs(file_path) # 3对应.msg格式 print(f"Emails have been saved to {email_dir}")
运行时触发com_error错误,堆栈跟踪信息如下:
--------------------------------------------------------------------------- com_error Traceback (most recent call last) Cell In[17], line 12 10 file_path = os.path.join(email_dir, file_name) 11 time.sleep(10) ---> 12 message.SaveAs(file_path) # 3对应.msg格式 13 if i == 0: 14 break File <COMObject <unknown>>:2, in SaveAs(self, Path, Type) com_error: (-2147352567, 'Exception occurred.', (4096, 'Microsoft Outlook', 'The operation failed.', None, 0, -2147287037), None)
解决方案
以下是针对该错误的有效排查和解决方法:
明确指定保存格式参数
代码注释提到3对应.msg格式,但实际调用SaveAs时未传入Type参数,Outlook可能无法正确识别格式。修改调用代码:message.SaveAs(file_path, 3) # 3为OlSaveAsType.olMSG的枚举值也可以导入官方枚举常量提升可读性:
from win32com.client import constants message.SaveAs(file_path, constants.olMSG)处理重复文件名与无效路径
即使清理了主题中的非法字符,仍可能出现重复文件名导致保存失败。建议将收到时间加入文件名避免冲突:file_name = f"{received_time}_{subject}.msg"同时确保目标目录存在,提前创建:
import os if not os.path.exists(email_dir): os.makedirs(email_dir)跳过无法访问的异常邮件
部分邮件(如已删除、权限不足的邮件)无法被SaveAs处理,加入异常捕获跳过这类邮件:try: message.SaveAs(file_path, 3) except Exception as e: print(f"无法保存邮件 {subject}: {str(e)}") continue检查Outlook安全设置
Outlook的安全策略可能阻止外部程序操作邮件:- 打开Outlook,进入
文件 > 选项 > 信任中心 > 信任中心设置 > 程序访问 - 确保允许Python程序(python.exe)访问Outlook数据
- 打开Outlook,进入
确认Outlook运行状态与权限
确保Outlook已启动,当前登录账号有权限访问目标文件夹,避免在Outlook初始化未完成时执行代码。
内容的提问来源于stack exchange,提问作者Prakhar Rathi
相关产品推荐
相关产品推荐

