使用Python获取Outlook邮件并保留原始显示格式的问题咨询
问题原因
你当前的写法本质是把邮件的纯文本字段手动写入文件,手动修改后缀为.msg并不会生成符合Outlook规范的邮件文件,message.body本身就是Outlook自动提取的纯文本正文,天生丢失HTML排版、表格、样式,自然会有格式缺失。
可行解决方案
方案1:保存为原生Outlook .msg格式(完全保留所有邮件属性,包括格式、附件、头信息)
直接调用win32com内置的SaveAs方法生成标准.msg文件,不需要手动拼接内容:
import win32com.client import os import re # 初始化Outlook客户端 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") # 这里替换为你自己的邮件文件夹获取逻辑,和你之前的代码保持一致即可 inbox = outlook.GetDefaultFolder(6) # 6对应收件箱 messages_1 = inbox.Items # 处理文件名非法字符的工具函数 def sanitize_filename(filename): return re.sub(r'[\\/*?:"<>|]', "", filename) # 批量保存msg文件 save_path = "./outlook_mails/msg/" os.makedirs(save_path, exist_ok=True) olMSG = 3 # Outlook常量,代表msg格式 for idx, message in enumerate(messages_1): # 生成合法文件名,用序号+主题+时间避免重名 subject = sanitize_filename(message.Subject) receive_time = message.ReceivedTime.strftime('%Y%m%d_%H%M%S') file_name = f"{idx+1}_{receive_time}_{subject}.msg" full_path = os.path.join(save_path, file_name) # 直接调用SaveAs方法保存为标准msg message.SaveAs(full_path, olMSG)
保存后的.msg文件可以直接用Outlook打开,和你在Outlook里看到的格式完全一致,附件也会保留。
方案2:保存为HTML格式(无需Outlook即可打开,保留所有排版、表格、样式)
如果不需要保留邮件头、附件等元数据,只需要保留正文排版,可以用HTMLBody属性直接保存为HTML文件:
# 其他初始化逻辑和上面一致 save_path = "./outlook_mails/html/" os.makedirs(save_path, exist_ok=True) for idx, message in enumerate(messages_1): subject = sanitize_filename(message.Subject) receive_time = message.ReceivedTime.strftime('%Y%m%d_%H%M%S') file_name = f"{idx+1}_{receive_time}_{subject}.html" full_path = os.path.join(save_path, file_name) # 写入HTML正文,编码用utf-8避免乱码 with open(full_path, 'w', encoding='utf-8') as f: # 可以自定义加上主题、时间等头信息 f.write(f"<h1>{message.Subject}</h1>") f.write(f"<p>收件时间:{message.ReceivedTime.strftime('%Y-%m-%d %H:%M:%S')}</p>") f.write("<hr>") f.write(message.HTMLBody)
保存后的HTML文件可以直接用浏览器打开,所有HTML格式、表格、样式都会完整保留。
注意事项
- 如果邮件里有嵌入式图片,HTML格式保存后本地打开可能看不到图片,需要额外把嵌入式附件导出并替换HTML里的cid引用即可。
- 批量保存时一定要处理文件名的非法字符,不然遇到带特殊符号的邮件主题会报错。
内容的提问来源于stack exchange,提问作者OneTouchForHeight
相关产品推荐
相关产品推荐

