如何用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)
解决方案
问题出在两个核心点:
- 固定文件名导致冲突:所有无附件邮件都使用同一个
testfile.msg保存,若存在多封无附件邮件,后一封会覆盖前一封,甚至可能因文件被占用导致保存失败。 - 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
相关产品推荐
相关产品推荐

