首页 > 解决方案 > 如何正确设置交换地址类型的发件人信息

问题描述

在某些 msg 文件中,发件人信息被意外删除。我想在 msg 文件中恢复发件人信息。我正在使用 Redemption 库来恢复信息。

信息正在正确恢复。我已经使用 MFCMAPI 实用程序验证了信息。单击以使用 Mapi 查看发件人信息

但是,当我用 Outlook 打开固定消息时,发件人的交换规范名称会在 UI 中与发件人的显示名称一起显示。例如,“John</O=Exchange/OU=ExchangeAdmin....>”在好消息中只显示“John”。 点击查看UI显示差异

我正在使用以下代码来恢复发件人信息。

        var PR_SENDER_ADDRTYPE_W = 0x0C1E001F;
        var PR_SENDER_NAME_W = 0x0C1A001F;
        var PR_SENDER_EMAIL_ADDRESS_W = 0x0C1F001F;
        var PR_SENDER_SMTP_ADDRESS = 0x5D01001F;


        Redemption.RDOSession oRdoSession = null;
        RDOMail oRdoMail = null;
        SafeMailItem sfItem = null;
        

           oRdoSession = Redemption.RedemptionLoader.new_RDOSession(); // session = New Redemption.RDOSession
            oRdoMail = oRdoSession.GetMessageFromMsgFile(sFilePath);

            sfItem = Redemption.RedemptionLoader.new_SafeMailItem(); // CreateObject("redemption.safemailitem")
            sfItem.Item = oRdoMail;
            bool f_Changed = false;
            var f_EntryID = oRdoSession.CreateOneOffEntryID(p_FromDisplayName, p_FromAddressType, p_FromEmailAddress, Type.Missing, Type.Missing);

            var ID = oRdoSession.GetAddressEntryFromID(f_EntryID);
            oRdoMail.Sender = ID;
            oRdoMail.SentOnBehalfOf = ID;

            //SetFieldValue is nothing but  sfItem.Fields[PR_SENDER_ADDRTYPE_W] = p_FromAddressType 
            SetFieldValue(sfItem, PR_SENDER_ADDRTYPE_W, "PR_SENDER_ADDRTYPE_W", p_FromAddressType, ref f_Changed);
            SetFieldValue(sfItem, PR_SENDER_NAME_W, "PR_SENDER_NAME_W", p_FromDisplayName, ref f_Changed);
            SetFieldValue(sfItem, PR_SENDER_SMTP_ADDRESS, "PR_SENDER_SMTP_ADDRESS", p_FromSmtpAddress, ref f_Changed);
            SetFieldValue(sfItem, PR_SENDER_EMAIL_ADDRESS_W, "PR_SENDER_EMAIL_ADDRESS_W", p_FromEmailAddress, ref f_Changed);

            oRdoMail.Save();

你能告诉我我错过了什么吗?

有关已发送信息的更多属性,请查看屏幕截图。点击查看截图

标签: exchange-serveroutlook-redemptionsendermsg

解决方案


Outlook 实际显示PR_SENT_REPRESENTING_xyz属性。

绝对没有理由创建的实例SafeMailItem- 只需使用RDOMail返回的对象RDOSession.GetMessageFromMsgFile

p_FromAddressTypep_FromEmailAddress变量的值是什么?如果您知道 SMTP 地址,只需将其传递给CreateOneOffEntryID

var f_EntryID = oRdoSession.CreateOneOffEntryID(p_FromDisplayName, "SMTP", p_FromSmtpAddress, Type.Missing, Type.Missing);

推荐阅读