System.Runtime.InteropServices.COMException(0x80004004):操作中止



我们有一个导出实用程序,可以将Outlook中的所有电子邮件导出到本地目录。我们的工具非常好用。但现在我们正在迁移到O365,从那时起,我们看到了该工具的问题。

从技术上讲,它可以读取所有电子邮件及其属性,如主题、发件人、收件人等,还可以保存或移动到Outlook O365中的其他文件夹。

但我得到了一个错误";System.Runtime.InteropServices.COMException(0x80004004(:操作中止(0x8000400(E_ABORT(("只要我执行SAVEAS。

下面是示例代码

public static void ReadEmails()
{
try
{
Outlook.Application oApp = new();
// Get the MAPI namespace.
Outlook.NameSpace oNs = oApp.GetNamespace("MAPI");
oNs.Logon("*****@*****.com", System.Reflection.Missing.Value,
System.Reflection.Missing.Value, System.Reflection.Missing.Value);
Outlook.Folders fols = oNs.Folders;
Outlook.MAPIFolder inboxFolder = fols["****"].Folders["Inbox"];
foreach (Outlook.Folder fol in inboxFolder.Folders)
{
MessageBox.Show(fol.Name);
Outlook.Items items = fol.Items;  
foreach(Outlook.MailItem mailItem in items)
{
MessageBox.Show(mailItem.Subject);
try
{
//mailItem.Move(inboxFolder); -- this works
mailItem.SaveAs("test.msg", Outlook.OlSaveAsType.olMSG);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}                
oNs.Logoff();
}
catch (System.Exception e)
{
Console.WriteLine("{0} Exception caught: ", e);
}
}

那么我需要做什么特别的事情吗?

仅供参考,该工具在用户笔记本电脑上作为用户在自己的电子邮件帐户上执行。

代码看起来不错。我看不出有什么奇怪的地方。但以下异常可能表明存在多个问题:

System.Runtime.InteropServices.COMException(0x80004004(:操作中止(0x8000400(E_ABORT((

很可能您在Outlook中遇到了安全问题"安全性";在本文中指的是所谓的";对象模型保护";触发安全提示并阻止访问某些功能,以防止恶意程序从Outlook数据中获取电子邮件地址并使用Outlook传播病毒和垃圾邮件。这些问题或提示不能简单地关闭,除非在运行防病毒应用程序的Outlook 2007中。

以下策略可用于避免Outlook中的安全提示/问题:

  1. Outlook基于的低级API-Extended MAPI(或该API的任何其他第三方包装器,例如Redemption(。

  2. Outlook安全管理器是一个编程工具,允许您抑制由与Microsoft Outlook 2000-2013交互的应用程序或加载项的代码调用的安全警报。

  3. 在公司环境中,管理员可以选择为部分或所有用户放松Outlook安全。

  4. 开发一个受信任的COM加载项,并调用它来保存电子邮件,而不是直接使用OOM。外接程序可以访问不会触发安全问题的安全应用程序对象。

另一个可能的原因是,Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务(自动化Microsoft Office应用程序,因为在这种环境下运行Office时,Office可能会表现出不稳定的行为和/或死锁。以下是MS在此类情况下的状态:

如果您正在构建一个在服务器端上下文中运行的解决方案,则应该尝试使用那些可以安全执行无人值守的组件。或者,您应该尝试找到至少允许部分代码运行客户端的替代方案。如果使用服务器端解决方案中的Office应用程序,则该应用程序将缺乏成功运行所需的许多功能。此外,您将在整体解决方案的稳定性方面承担风险。

在"Office服务器端自动化注意事项"一文中了解更多信息。

我通过将以下注册表值更改为2(确保以ADMIN的身份打开注册表(解决了这个问题

HKEY_USERS>S-1-5-21-1132323721-62323254-1511918330-144209>软件>政策>Microsoft>办公室>16.0>展望>安全

(Computer\HKEY_USERS\S-5-21-1132323721-62323254-1511918330-144209\SOFTWARE\Policies\Microsoft\office\16.0\outlook\security(

Dword:提示OOMSaveAs

值:2

注意:高于粗体值>您可以通过在命令提示符中运行whoami/user来获得此信息

最新更新