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

在C# Windows Form中读取未送达邮件正文,咨询获取失败发件人方案

获取Outlook未送达报告(NDR)的发件人方法

嘿,我来帮你搞定这个问题!不用第三方工具,咱们完全基于Outlook的原生MAPI属性就能解决乱码和发件人提取的问题,下面分步骤给你讲清楚:

一、先解决PR_TRANSPORT_MESSAGE_HEADERS的乱码与属性获取问题

你提到的PR_TRANSPORT_MESSAGE_HEADERS对应的属性标签0x0C1A001F是完全正确的,那个失效的链接不用管,直接通过PropertyAccessor调用就行。乱码大多是编码不匹配导致的,Outlook这个属性默认用UTF-8或Windows-1252编码,读取后转码就能解决:

VBA示例代码

Sub ExtractNDRSenderFromHeaders()
    Dim targetMail As Outlook.MailItem
    Dim propAccessor As Outlook.PropertyAccessor
    Dim rawHeaders As String
    Dim decodedHeaders As String
    
    ' 获取选中的未送达报告邮件
    Set targetMail = Application.ActiveExplorer.Selection.Item(1)
    Set propAccessor = targetMail.PropertyAccessor
    
    ' 读取邮件头属性
    rawHeaders = propAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0C1A001F")
    ' 转换编码解决乱码(根据实际情况调整,这里用Unicode转码)
    decodedHeaders = StrConv(rawHeaders, vbUnicode)
    
    ' 从解码后的邮件头中提取发件人
    Dim fromPosStart As Integer, fromPosEnd As Integer
    fromPosStart = InStr(decodedHeaders, "From: ") + 6
    fromPosEnd = InStr(fromPosStart, decodedHeaders, vbCrLf)
    Dim senderInfo As String
    senderInfo = Mid(decodedHeaders, fromPosStart, fromPosEnd - fromPosStart)
    
    MsgBox "原邮件发件人: " & senderInfo
End Sub

二、更高效的方式:直接读取NDR专用属性

未送达报告属于特殊邮件类型,Outlook专门为它提供了存储原发件人信息的属性PR_ORIGINAL_SENDER_EMAIL_ADDRESS,属性标签是0x0065001F,直接读取这个属性比解析邮件头更可靠:

VBA示例代码

Sub GetOriginalSenderDirectly()
    Dim targetMail As Outlook.MailItem
    Dim propAccessor As Outlook.PropertyAccessor
    Dim originalSender As String
    
    Set targetMail = Application.ActiveExplorer.Selection.Item(1)
    Set propAccessor = targetMail.PropertyAccessor
    
    ' 先判断是否是未送达报告
    If targetMail.MessageClass = "REPORT.IPM.Note.NDR" Then
        ' 直接获取原发件人邮箱
        originalSender = propAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0065001F")
        MsgBox "原邮件发件人邮箱: " & originalSender
    Else
        MsgBox "选中的不是未送达报告邮件哦!"
    End If
End Sub

三、乱码问题的通用排查技巧

如果还是遇到乱码,可以试试这两个小方法:

  • 调整StrConv的参数,比如换成StrConv(rawHeaders, vbFromUnicode),根据乱码的实际表现切换编码方向。
  • 检查Outlook的区域语言设置,确保代码的编码逻辑和Outlook默认编码匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:47:28