在Outlook中加密大邮件会导致c#中的低资源异常

本文关键字:资源 异常 加密 Outlook | 更新日期: 2023-09-27 18:06:21

我正在开发一个工具,可以在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();

在Outlook中加密大邮件会导致c#中的低资源异常

我自己解决了。由于我在Outlook本身有问题,我正在尝试MAPIEx访问电子邮件中的原始S/MIME附件,并使用MimeKit/BouncyCastle对其进行解密/加密。

同样的问题发生了,但有一个不同的错误信息,这导致我到以下站点:ASN.1值太大。

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

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

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