在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
相关产品推荐
相关产品推荐

