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

使用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初始化未完成时执行代码。

内容的提问来源于stack exchange,提问作者Prakhar Rathi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:30:57