我正在使用Visual Studio 2012为Outlook 2010构建一个相对简单的加载项。计算机是Win 7 Enterprise 32和64.加载项的目的是直接在用户的收件箱中解密电子邮件,以便它们可以在.pst存档中轻松搜索,或者以未加密的.msg文件保存到网络文件夹中。电子邮件使用x.509 PKI加密,私钥存储在智能卡上,每次打开加密电子邮件时都会提示用户输入PIN。这就是我到目前为止所做的:
private void buttonDecrypt_Click(object sender, RibbonControlEventArgs e) {
currentExplorer = Globals.ThisAddIn.Application.ActiveExplorer();
if (currentExplorer.Selection.Count > 0) {
for (int i = 0; i < currentExplorer.Selection.Count; i++) {
Object selObject = currentExplorer.Selection[i+1];
if (selObject is Microsoft.Office.Interop.Outlook.MailItem) {
Microsoft.Office.Interop.Outlook.MailItem mailItem =
(selObject as Microsoft.Office.Interop.Outlook.MailItem);
mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 0);
mailItem.Save();
}
}
}
}
如果我在Outlook中手动打开加密电子邮件,系统会提示我输入PIN,以便电子邮件可以正常打开。然后,如果我关闭电子邮件并点击功能区上的新按钮,它会直接在我的收件箱中重新保存未加密的电子邮件,从而完全符合我的要求。但是,如果我一次选择多个电子邮件,或者不首先手动打开邮件,则mailItem.PropertyAccessor.Setproperty()
上的代码错误会显示消息COMException was unhandled by user code: Your Digital ID name cannot be found by the underlying security system.
这告诉我我需要一种方法来提示用户在尝试打开电子邮件之前,他们的PIN码。
答案 0 :(得分:1)
我不认为只使用Outlook对象模型可以做很多事情。 OOM非常努力地将签名或加密的邮件表示为常规IPM.Note项目。它甚至可以从MailItem.MAPIOBJECT属性中公开伪造的IMessage MAPI对象。
设置PR_SECURITY_FLAGS属性时,Outlook知道要解密该邮件。无法指定解密的完成方式或提供任何参数。该属性只不过是加密/解密Outlook消息的黑客攻击;它仅在使用MailItem.PropertyAccessor设置属性时才有效。
最终您需要的是加密/签名消息存储的P7M附件中的数据。您可以在OutlookSpy中看到这一点:如果单击OutlookSpy工具栏上的IMessage按钮(它使用MailItem.MAPIOBJECT),您将看到常规解密消息。但是,如果单击IMessage窗口中的IMAPISecureMesage或从IMAPIFolder打开消息,请执行以下操作: GetContentsTable选项卡,您将看到原始加密邮件及其P7M附件。
要提取该附件,您需要扩展MAPI(C ++或Delphi)或类似Redemption的包装器(使用RDOSession.GetMessageFromID)。 Redemption还会公开可用于解密的RDOEncryptedMesage对象。