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

如何用Python保存无附件的Outlook邮件?解决脚本无法保存问题

问题

需要实现逻辑:将Outlook指定文件夹中的邮件及附件保存到桌面文件夹,若邮件包含附件则保存附件,无附件则保存邮件本身。

当前脚本可正常保存带附件邮件的PDF附件,但无附件的邮件无法生成保存文件。已确认无附件判断条件触发,能正常输出邮件正文,尝试改为.html格式仍未解决。

问题代码
import os
import datetime
import win32com.client #pip install pywin32
from win32com.client import constants


#output folder
path = r'C:\Users\SJF2\Desktop\Bank'

filename = r'\testfile.msg'

fullpath = path + filename

print(fullpath)

#create output folder
os.makedirs(path, exist_ok=True)

#connect to outlook 
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

#Get inbox
inbox = outlook.GetDefaultFolder(6)

#Get specific folder contents
email_folder = inbox.Folders['Test']

#Get items from folder
emails = email_folder.Items

for email in emails:

    subject = email.Subject
    attachments = email.Attachments
    body = email.Body

    if email.Attachments.Count == 0: # check if the email has attachments
        email.SaveAs(fullpath)
        
    else:

        for attachment in attachments:
            fullpath = path + "\\" + str(attachment)
            attachment.SaveAsFile(fullpath)
            #print(attachment)
            print(fullpath)
解决方案

问题出在两个核心点:

  1. 固定文件名导致冲突:所有无附件邮件都使用同一个testfile.msg保存,若存在多封无附件邮件,后一封会覆盖前一封,甚至可能因文件被占用导致保存失败。
  2. SaveAs未指定格式参数:Outlook的SaveAs方法需要明确指定保存类型,默认格式不匹配会导致文件无法生成。

修改后的代码如下:

import os
import win32com.client
from win32com.client import constants


# 输出文件夹
path = r'C:\Users\SJF2\Desktop\Bank'

# 创建输出文件夹(不存在则创建)
os.makedirs(path, exist_ok=True)

# 连接Outlook客户端
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

# 获取默认收件箱
inbox = outlook.GetDefaultFolder(6)

# 获取指定子文件夹
email_folder = inbox.Folders['Test']

# 获取文件夹内所有邮件
emails = email_folder.Items

for email in emails:
    subject = email.Subject
    # 过滤邮件标题中的非法字符,避免文件名报错
    safe_subject = "".join([c for c in subject if c not in r'\/:*?"<>|'])
    
    if email.Attachments.Count == 0:
        # 无附件时保存为MSG格式,指定olMSG常数(对应数值3)
        save_path = os.path.join(path, f"{safe_subject}.msg")
        email.SaveAs(save_path, constants.olMSG)
        print(f"已保存无附件邮件:{save_path}")
    else:
        # 有附件时逐一保存附件
        for attachment in email.Attachments:
            attach_path = os.path.join(path, str(attachment))
            attachment.SaveAsFile(attach_path)
            print(f"已保存附件:{attach_path}")

修改说明

  • 用邮件标题生成唯一文件名,同时过滤标题中的非法字符(如\/:*?"<>|),避免路径错误或文件覆盖。
  • 调用SaveAs时明确传入constants.olMSG,指定保存为标准Outlook邮件格式,确保文件正常生成。
  • 使用os.path.join拼接路径,避免手动拼接斜杠时的错误,代码更规范。

内容的提问来源于stack exchange,提问作者Sophie Fraser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:21:07