使用Redemption恢复Exchange类型MSG发送方信息后Outlook显示异常
异常根因
你遇到的Outlook显示异常,核心是两处逻辑偏差:
- 赋值发件人时生成的EntryID结构携带了Exchange内部目录的DN路径标识,Outlook解析时识别到EX类型地址,会自动把规范名拼接在显示名后的尖括号里
- 多余的
SentOnBehalfOf赋值触发了代理发送的UI渲染分支,进一步放大了异常显示效果
MFCMAPI仅校验字段是否存在、值是否正确,不会模拟Outlook的UI渲染逻辑,因此之前的校验结果和实际Outlook打开效果有差异。
具体遗漏的配置&修复步骤
- 移除
oRdoMail.SentOnBehalfOf = ID的赋值逻辑:普通邮件无代理发送关系,设置和发件人完全一致的代理属性,会直接触发代理发送的UI渲染规则 - 生成OneOffEntryID时强制固定地址类型为
SMTP:不要沿用传入的p_FromAddressType变量,避免生成的EntryID匹配到本地Exchange目录的用户对象,自动写入DN路径 - 手动覆盖两个Outlook用于判断发件人渲染逻辑的核心属性:
PR_SENDER_ENTRYID(属性tag0x0C190102):将自定义生成的纯SMTP类型OneOffEntryID二进制值直接写入,避免Redemption根据自动生成的Sender对象写入带EX路径的EntryIDPR_SENDER_SEARCH_KEY(属性tag0x0E050102):写入发件人SMTP地址转成的小写ASCII字节流,Outlook识别到该SMTP匹配规则后,不会主动拉取AD中的Exchange路径做拼接
- 所有发件人地址类型相关的字段统一固定为
SMTP:避免残留的EX类型字段值触发Outlook的Exchange地址解析逻辑
调整后的核心参考代码
// 固定SMTP类型生成一次性EntryID,规避EX目录匹配逻辑 var f_EntryID = oRdoSession.CreateOneOffEntryID( p_FromDisplayName, "SMTP", p_FromSmtpAddress, Type.Missing, Type.Missing); var ID = oRdoSession.GetAddressEntryFromID(f_EntryID); oRdoMail.Sender = ID; // 手动覆盖核心EntryID属性,避免自动生成带EX路径的二进制值 oRdoMail.Fields[0x0C190102].Value = f_EntryID; // 设置发件人搜索键为SMTP小写字节流 oRdoMail.Fields[0x0E050102].Value = System.Text.Encoding.ASCII.GetBytes(p_FromSmtpAddress.ToLower()); // 基础字段统一使用SMTP类型赋值 SetFieldValue(sfItem, PR_SENDER_ADDRTYPE_W, "PR_SENDER_ADDRTYPE_W", "SMTP", 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_FromSmtpAddress, ref f_Changed); oRdoMail.Save();
内容的提问来源于stack exchange,提问作者Owais Parkar
相关产品推荐
相关产品推荐

