使用c#打开加密的电子邮件

时间:2014-12-18 20:57:47

标签: c# email outlook-addin public-key-encryption

我正在使用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码。

1 个答案:

答案 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对象。