在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本身有问题,我正在尝试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