在Outlook中处理大量邮件

时间:2015-03-12 09:08:44

标签: c# outlook office-interop outlook-addin

Outlook addin逐个打开大量(> 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中的第二项开始保存此项的副本,即使document.WordOpenXML包含我从中获取检查器的项目的正确xml。

在Outlook中处理多个项目的正确方法是什么?检查员是否需要以某种特殊方式处理?

UPD2:

在发布邮件项目之后,我得到了"当前进程已经使用了Window Manager对象的所有系统允许句柄"。 使用MailItem.Close(OlInspectorClose.olDiscard)会导致Outlook崩溃。

2 个答案:

答案 0 :(得分:0)

  

通过Marshal.Release / FinalReleaseComObject处理检查器和文档没有帮助。

我不这么认为。您需要立即释放所有底层COM对象,而不仅仅是其中一些。完成使用后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放Outlook对象。然后在Visual Basic中将变量设置为Nothing(C#中为null)以释放对该对象的引用。您可以在Systematically Releasing Objects文章中详细了解相关内容。

答案 1 :(得分:0)

我在使用Outlook.Inspector时遇到了完全相同的问题,

解决方案是:您需要使用Outlook.Inspector参数在OlInspectorClose.olDiscard上调用Close方法...

我只是设置为null,这没有帮助。