【发布时间】: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