Outlook退信邮件正文保存至CSV乱码问题求助
解决Outlook退信正文保存CSV乱码及HTMLBody报错问题
核心问题分析
- HTMLBody属性报错:系统退信属于Outlook生成的特殊邮件,多数仅支持纯文本或RTF格式,不存在HTMLBody属性,直接调用会触发
AttributeError。 - 乱码问题:Outlook返回的正文是Unicode编码,若保存CSV时未用正确编码(如不带BOM的UTF-8),会导致亚洲字符在Excel等工具中显示为乱码。
解决步骤
1. 兼容获取邮件正文
优先用Body属性获取纯文本内容,同时通过BodyFormat判断邮件格式,避免属性不存在的报错:
olFormatPlain(1):纯文本格式,直接取BodyolFormatHTML(2):HTML格式,确认存在HTMLBody属性后再调用olFormatRichText(3):RTF格式,通过Body获取转换后的纯文本
2. 正确编码保存CSV
保存CSV时必须指定utf-8-sig编码,该编码带BOM头,能被Excel、WPS等工具正确识别,避免亚洲字符乱码。
修改后的代码示例
import win32com.client import csv # 连接Outlook客户端 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") inbox = outlook.GetDefaultFolder(6) # 6对应收件箱,可切换到退信专属文件夹 messages = inbox.Items # 打开CSV文件,指定utf-8-sig编码 with open("bounced_emails.csv", "w", newline="", encoding="utf-8-sig") as csvfile: writer = csv.writer(csvfile) writer.writerow(["邮件主题", "退信正文"]) for msg in messages: # 筛选退信邮件(可根据主题关键词调整) if "Undeliverable" in msg.Subject or "投递失败" in msg.Subject: # 安全获取正文内容 try: if msg.BodyFormat == 2: body_content = msg.HTMLBody else: body_content = msg.Body except AttributeError: body_content = msg.Body # 写入CSV writer.writerow([msg.Subject, body_content])
额外优化建议
- 若退信包含原始邮件内容,可通过字符串分割提取关键退信信息,比如截取
-----Original Message-----之前的内容。 - 部分退信的
Body含大量换行符,csv模块会自动处理格式,无需手动转义。
内容的提问来源于stack exchange,提问作者Patrik Fodor
相关产品推荐
相关产品推荐

