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

本文关键字:电子邮件 加密 使用 | 更新日期: 2023-09-27 18:34:42

我正在使用Visual Studio 2012为Outlook 2010构建一个相对简单的加载项。 机器是 Win 7 企业版 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。

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

我认为单独使用Outlook对象模型可以做很多事情。OOM 非常努力地将签名或加密的邮件表示为常规IPM.Note项。它甚至从 MailItem.MAPIOBJECT 属性中公开假 IMessage MAPI 对象。

当您设置 PR_SECURITY_FLAGS 属性时,Outlook 知道解密邮件。无法指定解密方式或提供任何参数。该属性只不过是加密/解密Outlook消息的黑客;仅当使用 MailItem.PropertyAccessor.SetProperty 设置属性时,它才有效。

最终,您需要的是加密/签名邮件存储的P7M附件中的数据。您可以在OutlookSpy中看到这一点(我是它的作者(:如果您单击OutlookSpy工具栏上的IMessage按钮(它使用MailItem.MAPIOBJECT(,您将看到常规解密消息。但是,如果您单击IMessage窗口中的IMAPISecureMesage或从IMAPIFolder |GetContentTable 选项卡上,您将看到原始加密邮件及其 P7M 附件。

要提取该附件,您将需要扩展 MAPI(仅限 C++ 或 Delphi(或像 Redemption 这样的包装器(我也是它的作者 - 使用 RDOSession.GetMessageFromID (。Redemption还公开了可用于解密的RDOEncryptedMessage对象。