如何在VSTO Outlook C#插件中获取加密MailItem的EntryID
VSTO Outlook C#插件读取加密邮件EntryID/MAPIOBJECT的问题
场景与现有代码
需要遍历全为加密MailItem的文件夹,获取其EntryID或MAPIOBJECT用于扩展MAPI,现有遍历代码如下:
foreach (object olObject in folder.Items) { if (olObject is Outlook.MailItem olM) { // olM.EntryID 访问失败 } }
核心问题
当邮件为PKI加密且私钥存储在插入电脑的个人智能卡中时,用户必须至少打开过一封加密邮件,Outlook对象模型(OOM)才能读取MailItem的属性,但遍历文件夹时无法提前确认该条件是否满足。
疑问与尝试
- 发现通过
Outlook.Selection转换为MailItem可以正常获取EntryID,想知道对folder.Items是否有类似可行的处理方法; - 未查看过加密邮件时,访问
mailItem.MAPIOBJECT会抛出异常,且Outlook抛出该异常耗时过长,希望找到快速判断Outlook能否读取加密邮件的方法; - 曾考虑等待加密邮件的检查器窗口打开,但存在用户中途移除智能卡后仍无法读取的问题。
更新:经确认,无法直接实现判断Outlook能否读取加密邮件的功能。当前采用的策略是监听加密MailItem的检查器窗口打开事件——此时用户已输入智能卡PIN,Outlook已获取解密私钥,此后所有MailItem的EntryID、MAPIOBJECT等属性均可正常读取,直到Outlook关闭或智能卡被拔出。目前正在使用Net.Pkcs11Interop检测读卡器、智能卡及证书事件,同时计划研究UWP的Windows.Devices.SmartCards命名空间。
内容的提问来源于stack exchange,提问作者darbid
相关产品推荐
相关产品推荐

