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

使用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(属性tag 0x0C190102):将自定义生成的纯SMTP类型OneOffEntryID二进制值直接写入,避免Redemption根据自动生成的Sender对象写入带EX路径的EntryID
    • PR_SENDER_SEARCH_KEY(属性tag 0x0E050102):写入发件人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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 05:24:02