如何用Redemption获取邮件回执偏好并规避Outlook安全提示?附终端疑问
问题描述
我使用Redemption库(版本5.27.0.6916),希望通过在收件箱创建新MailItem来获取ReadReceiptRequested和OriginatorDeliveryReportRequested的默认偏好设置。但通过Outlook对象模型(OOM)互操作访问这些属性时,会触发Outlook安全补丁的确认对话框/安全提示——奇怪的是,这个问题仅在终端服务器会话中出现。我试过用SafeMailItem,但它没有实现这两个属性。我目前有读取注册表的备选方案,但想知道:
- 能否通过Redemption实现该需求?
- 为何问题仅在终端服务器会话中发生?
当前代码(基于OOM的实现):
var mailItem = Folders.NewItem<MailItem>(Stores.Get(accountId), DefaultFolders.Inbox); try { return new CMailPreferences { DeliveryReceiptRequested = mailItem.OriginatorDeliveryReportRequested, ReadReceiptRequested = mailItem.ReadReceiptRequested, }; } finally { Marshal.ReleaseComObject(mailItem); }
解决方案与解释
1. 通过Redemption实现需求
完全可以用Redemption实现,且不会触发Outlook安全提示。Redemption的RDOMail原生支持ReadReceiptRequested和OriginatorDeliveryReportRequested属性,且它绕过了OOM的对象模型安全限制,无需依赖注册表读取。
实现代码
直接使用Redemption的RDOSession和RDOMail对象来获取默认偏好:
using Redemption; public CMailPreferences GetMailPreferences(string accountId) { var session = new RDOSession(); // 登录目标账号(若已关联Outlook实例,也可通过MAPIOBJECT直接绑定) session.Logon(accountId); var inbox = session.GetDefaultFolder(rdoDefaultFolders.olFolderInbox); var rdoMail = inbox.Items.Add("IPM.Note"); try { return new CMailPreferences { DeliveryReceiptRequested = rdoMail.OriginatorDeliveryReportRequested, ReadReceiptRequested = rdoMail.ReadReceiptRequested, }; } finally { // 清理资源 rdoMail = null; inbox = null; session.Logoff(); session = null; } }
关键说明
- 新创建的
RDOMail会自动继承用户在Outlook中设置的默认回执偏好,无需额外配置。 - Redemption直接与MAPI层交互,不会触发OOM的安全提示,无论本地还是终端服务器环境都适用。
2. 终端服务器会话触发安全提示的原因
这个差异通常由终端服务器的安全配置和Outlook运行模式导致:
- 组策略限制:终端服务器上可能通过组策略启用了更严格的Outlook对象模型保护(比如
Outlook Security Mode设置为Use Outlook Security Group Policy),而本地环境可能未启用或配置了信任应用程序例外。 - 终端服务模式的安全补丁行为:部分Outlook安全补丁在终端服务器会话中会强化对象模型访问验证,因为多用户环境下的安全风险更高。
- 信任应用程序列表差异:本地环境可能将你的应用加入了Outlook的信任程序列表,而终端服务器上未配置该例外,导致访问OOM属性时触发提示。
内容的提问来源于stack exchange,提问作者ENOTTY
相关产品推荐
相关产品推荐

