在 VSTO Outlook C# 插件中,我想循环遍历所有加密邮件项目的文件夹,并获取 EntryID 或 MAPIOBJECT,因为我计划将其发送到扩展 MAPI。
foreach (object olObject in folder.Items)
{
if (olObject is Outlook.MailItem olM)
{
//olM.EntryID fails
}
}
当邮件项目使用 PKI 加密且私钥存储在插入 PC 的个人卡上时,用户必须至少打开 1 个加密邮件项目,OOM 才能读取邮件项目的属性。在查看文件夹项目时,我不知道是否是这种情况。
我发现如果我将
Outlook.Selection
投射到邮件项目上,我就可以获得entryID。有没有办法对folder.Items 做同样的事情?
我还注意到,如果用户没有查看任何加密项目,mailItem.MAPIOBJECT 也会引发异常。
遇到此错误的问题不是捕获它,而是 Outlook 花费太长时间才抛出异常。有什么办法可以快速解决Outlook还无法读取加密内容的问题吗?
我目前看到的唯一选择是等待检查器窗口在加密的邮件上打开。这样做的问题是,如果用户取出卡,则无法读取加密的邮件。
首先尝试检查
MessageClass
属性。加密电子邮件设置了 IPM.Note.SMIME
值。但是,请记住,第三方加载项可能会在不更改消息类别或安全标志的情况下加密消息。它们看起来就像一封普通的电子邮件。在这种情况下,您将必须解析消息正文来检测它们。
您还可以检查 PR_SECURITY_FLAGS 属性值。
Const PR_SECURITY_FLAGS = "http://schemas.microsoft.com/mapi/proptag/0x6E010003"
Const SECFLAG_ENCRYPTED As Long = &H1
Dim SecFlags As Long
' Get current flags value
SecFlags = oItem.PropertyAccessor.GetProperty(PR_SECURITY_FLAGS)