【问题标题】:Working with large amount of mail in Outlook在 Outlook 中处理大量邮件
【发布时间】:2015-03-12 09:08:43
【问题描述】:

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 保存此项目的副本,即使 document.WordOpenXML 包含我从中获得检查器的项目的正确 xml。

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

更新2:

在发布邮件项目后,我得到“当前进程已使用其所有系统允许的窗口管理器对象句柄”。 使用 MailItem.Close(OlInspectorClose.olDiscard) 会导致 Outlook 崩溃。

【问题讨论】:

  • BTW 为什么需要使用文字编辑器?
  • 两个原因。使用选择并转换为具有适当编码支持的 html(MailItem.SaveAs 无法正确处理某些代码页)。

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


【解决方案1】:

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

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

【讨论】:

  • 我已经尝试过了,只是在同一点上得到了一堆其他异常。这就是为什么我要询问如何处理 Outlook 检查员,当您连续打开数百个检查员时,对于选择中的每封邮件。
  • 我已经更新了我的答案。还尝试了无效化+GC.Collect。一切都发生在主 vsto 线程。
  • 我没有看到你释放所有对象的完整代码。
  • 将所有内容收集在一起。这就是它现在在我的代码中的样子。
  • 你在哪里释放一个邮件项目对象?
【解决方案2】:

Outlook.Inspector 遇到了完全相同的问题,

解决方法是:需要在Outlook.Inspector上调用Close方法,并带有OlInspectorClose.olDiscard参数...

我只是设置了 null,它没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多