在 Outlook 中加密 BIG 电子邮件导致 C# 中的低资源异常

Encrypting BIG emails in Outlook cause Low Ressources Exception in C#

我正在开发一种工具,它可以在 Outlook 2013 中使用 S/MIME 批量加密电子邮件。到目前为止它可以正常工作,但是当我尝试加密一封非常大的电子邮件时(在测试用例中它是关于60MB 原始)。我收到 COMException,说明资源不足。

我可以通过直接使用 EWS 和 MimeKit(这很有魅力!谢谢@jstedfast)来解决这个问题,但我想找到一种方法在 Outlook 中工作,出于网络流量方面的考虑。我知道这些更改最终会同步到 Exchange,但在这个过程中,它与带宽无关。

我也在看 MapiEx,但如果有比另一个依赖项(以及 MFC 也)更简单的解决方案,我会很高兴!也许有一些设置,我必须先做。

一点代码。它在其他地方捕获的异常。

public void String SetEncryption(MailItem mailItem)
{
    PropertyAccessor pa = null;
    try
    {
        pa = mailItem.PropertyAccessor;
        Int32 prop = (int)pa.GetProperty(_PR_SECURITY_FLAGS);
        Int32 newprop = prop | 1; 
        pa.SetProperty(_PR_SECURITY_FLAGS, newprop);
    }
    finally
    {
        Marshal.FinalReleaseComObject(pa);
        pa = null;
    }
}

编辑:设置加密时不会出现异常,但在设置加密后保存结果时。

SetEncryption(mailItem);
mailItem.Save();

检查是否安装了 KB 2480994:http://support.microsoft.com/kb/2480994

我自己解决了。 由于我在 Outlook 本身有问题,我正在尝试 MAPIEx 访问电子邮件中的原始 S/MIME 附件,并使用 MimeKit/BouncyCastle.[=11= de-/encrypt 它]

出现了同样的问题,但错误消息不同,这将我带到了以下站点:ASN.1 value too large

总结一下:Crypto API 有两个签名。一个接受字节数组,一个接受流。第一个有 1 亿字节的任意强加 (!!!) 限制。由于封装的CMS有double base64,所以这100MB的比例是9/16,大约是56MB。

我假设 Outlook 使用相同的 API-Call,因此有此限制。 我知道这不是事实,但证据有力地支持了这一理论。 :)