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

Outlook退信邮件正文保存至CSV乱码问题求助

解决Outlook退信正文保存CSV乱码及HTMLBody报错问题

核心问题分析

  1. HTMLBody属性报错:系统退信属于Outlook生成的特殊邮件,多数仅支持纯文本或RTF格式,不存在HTMLBody属性,直接调用会触发AttributeError。
  2. 乱码问题:Outlook返回的正文是Unicode编码,若保存CSV时未用正确编码(如不带BOM的UTF-8),会导致亚洲字符在Excel等工具中显示为乱码。

解决步骤

1. 兼容获取邮件正文

优先用Body属性获取纯文本内容,同时通过BodyFormat判断邮件格式,避免属性不存在的报错:

  • olFormatPlain(1):纯文本格式,直接取Body
  • olFormatHTML(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:37:01