Outlook 2019插件读取SMIME加密邮件属性时遇异常的咨询
Outlook 2019 OOM读取自发送SMIME邮件属性异常的问题解析
核心原因
当你向自己发送SMIME加密/签名邮件时,Outlook会将该邮件的MessageClass标记为IPM.Note.SMIME,而非普通加密邮件的IPM.Note。此时使用OOM访问非基础属性(如主题、发件人详情等)时,OOM会自动触发邮件解密操作,但在这个特殊场景下,OOM的解密逻辑存在缺陷:它没有正确识别当前账户对应的有效数字ID,导致抛出“Your Digital ID name cannot be found by the underlying security system.”异常。
而Extended MAPI作为底层API,不会自动执行解密操作,而是直接读取邮件的原始MAPI属性,因此不受这个逻辑限制,能正常获取所有属性。
基于OOM的可行解决方案
- 触发手动解密后读取:先调用
MailItem.Open()方法模拟用户打开邮件的操作,触发Outlook的手动解密流程,完成后再读取属性。需注意该操作需在Outlook的UI线程中执行,插件开发时要做好线程上下文的切换处理。 - 用PropertyAccessor直接读取MAPI属性:借助OOM的
PropertyAccessor对象,直接通过MAPI属性标签读取目标内容,绕过OOM的自动解密逻辑。例如:- 读取主题:
PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0037001E") - 读取收件人地址:
PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0E04001E")
- 读取主题:
- 临时修改MessageClass(谨慎使用):如果业务场景允许,可尝试将已发送文件夹中该邮件的MessageClass修改为
IPM.Note,之后再用OOM读取属性。但此操作可能破坏邮件的加密状态,需充分测试后再使用。
是否属于Outlook Bug?
这不属于严格意义上的代码Bug,而是OOM的设计局限性。OOM的定位是简化开发者对Outlook对象的访问,默认会自动处理加密邮件的解密,以提供统一的属性访问体验。但在发件人与收件人为同一账户的特殊场景下,OOM的自动解密逻辑没有适配证书的本地验证流程,导致出现异常。Extended MAPI因为不封装自动解密的上层逻辑,所以能避开这个问题。
内容的提问来源于stack exchange,提问作者hawthorne
相关产品推荐
相关产品推荐

