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

如何用Python从Outlook的REPORT.IPM.Note.NDR提取错误码(非正则方式)

解决方案:直接获取Outlook退信错误码的MAPI属性方法

问题分析

你调用0x1001F001(PR_REPORT_TAG)时出现类型不匹配错误,是因为该属性为二进制类型(PT_BINARY),直接用PropertyAccessor.GetProperty读取会因类型解析失败报错。下面提供两种更可靠的直接获取方式:


1. 优先使用PR_SMTP_RESPONSE(0x007D001E)

这个属性是字符串类型(PT_STRING8),直接存储SMTP服务器返回的完整响应信息,包含明确的错误码(如550 5.1.1),无需解析二进制。

Python 代码示例(win32com)

import win32com.client

# 连接Outlook
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)  # 6对应收件箱文件夹
messages = inbox.Items

# 遍历邮件筛选退信
for msg in messages:
    # 仅处理退信邮件(MessageClass为IPM.Note.NDR)
    if msg.MessageClass == "IPM.Note.NDR":
        try:
            # 获取SMTP响应属性
            smtp_resp = msg.PropertyAccessor.GetProperty(
                "http://schemas.microsoft.com/mapi/proptag/0x007D001E"
            )
            if smtp_resp:
                # 提取错误码(如从"550 5.1.1 User unknown"中取"550 5.1.1")
                error_code = ' '.join(smtp_resp.split()[:2])
                print(f"退信错误码: {error_code}")
                print(f"完整响应: {smtp_resp}")
        except Exception as e:
            print(f"读取属性失败: {str(e)}")

2. 解析PR_REPORT_TAG(0x1001F001)二进制数据

如果需要更底层的投递状态通知(DSN)信息,可以读取该二进制属性后解析:

Python 代码示例

import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items

for msg in messages:
    if msg.MessageClass == "IPM.Note.NDR":
        try:
            # 读取二进制属性
            report_tag_bin = msg.PropertyAccessor.GetProperty(
                "http://schemas.microsoft.com/mapi/proptag/0x1001F001"
            )
            # 转换为十六进制字符串或尝试解码为文本
            report_tag_hex = report_tag_bin.hex()
            report_tag_text = report_tag_bin.decode('ascii', errors='ignore')
            print(f"PR_REPORT_TAG 十六进制: {report_tag_hex}")
            print(f"PR_REPORT_TAG 文本解析: {report_tag_text}")
        except Exception as e:
            print(f"读取PR_REPORT_TAG失败: {str(e)}")

关键提示

  • 退信邮件的MessageClass固定为IPM.Note.NDR,筛选后再处理可避免无效请求。
  • PR_SMTP_RESPONSE是最易用的属性,直接返回人类可读的错误信息和代码,无需复杂解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:17:27