Outlook插件逐一打开大量(>100)邮件,保存邮件正文并进一步处理。
foreach (MailItemContainer mc in Mails)
{
var inspector = mc.MailItem.GetInspector;
var document = (Document)inspector.WordEditor;
document.SaveAs(tempFilePath, format);
Process(tempFilePath);
//dispose inspector
Marshal.ReleaseComObject(inspector);
Marshal.ReleaseComObject(document);
inspector = null;
document = null;
Marshal.ReleaseComObject(mc.MailItem);
mc.MailItem = null;
}
然而,经过一些处理(通常在80个项目左右),异常开始出现。
System.Runtime.InteropServices.COMException (0xC4104005): Operation failed.
in Microsoft.Office.Interop.Outlook._MailItem.get_GetInspector()
通过Marshal.Release/FinalReleaseComObject释放检查器和文档并不能解决问题。需要使用以下方法关闭检查器:
((_Inspector)inspector).Close(OlInspectorClose.olDiscard);
出现奇怪的行为:从列表中的第二个项目开始,document.SaveAs会保存该项的副本,即使从中获取了正确的xml的项的inspector。
在Outlook中处理多个项目的正确方法是什么?是否需要以某种特殊方式处理检查员?
更新2:
释放邮件项后,我收到“当前进程已使用其窗口管理器对象的系统允许句柄”。使用MailItem.Close(OlInspectorClose.olDiscard)会导致Outlook崩溃。