【问题标题】:Outlook Interop Throws Error "Exception from HRESULT: 0x80004004 (E_ABORT)" When Sending EmailOutlook Interop 在发送电子邮件时抛出错误“HRESULT 异常:0x80004004 (E_ABORT)”
【发布时间】:2017-10-11 08:44:12
【问题描述】:

我正在尝试使用 C# 控制台应用程序发送一封自动电子邮件。我正在使用 Outlook 互操作来执行此操作。当我运行下面的代码时,Outlook 是打开的。该代码实际上生成了电子邮件,当代码在 mailItem.Send() 上停止时,该电子邮件处于打开状态。 我怀疑这个问题与我的工作笔记本电脑上的某些访问策略有关,但任何指导都会有所帮助。

    public static void SendEmail(string Body, string Subject, string Recipients)
    {
        Outlook.Application app = new Outlook.Application();
        Outlook.MailItem mailItem = app.CreateItem(Outlook.OlItemType.olMailItem);
        mailItem.Subject = Subject;
        mailItem.To = Recipients;
        mailItem.HTMLBody = Body;
        mailItem.Display(false);
        mailItem.Send();
    }

完全错误:

 System.Runtime.InteropServices.COMException: 'Operation aborted (Exception from HRESULT: 0x80004004 (E_ABORT))'

【问题讨论】:

  • 当您发出新的邮件项目命令时,您尚未检查 Outlook 是否已准备好执行操作 - Outlook 可能需要一段时间才能准备好
  • 似乎可以发送了。我在 Send() 之前放入了 Thread.Sleep(1000) ,但它没有帮助。到达 Send() 时仍然抛出错误
  • 1 秒的睡眠时间不是很长 - 如果你告诉它等待 60000 是出于兴趣,它会起作用吗?
  • 不,不幸的是,这似乎无助于解决问题
  • 那么它会建议outlook需要登录

标签: c# email outlook interop


【解决方案1】:

您似乎遇到了 Outlook 安全问题。本文中的“安全”是指所谓的“对象模型防护”,它触发安全提示并阻止对某些功能的访问,以防止恶意程序从 Outlook 数据中获取电子邮件地址并使用 Outlook 传播病毒和垃圾邮件。

有一些方法可以避免此类问题:

  1. 使用不会触发安全问题或提示的低级 API(扩展 MAPI)。或者只是围绕该 API 的任何其他第三方包装器,例如 Redemption。
  2. 开发 COM 加载项并使用作为参数传递给事件处理程序之一的安全应用程序对象。
  3. 使用Outlook Security Manager 组件在运行时禁止安全检查。

Outlook "Object Model Guard" Security Issues for Developers 文章中阅读有关所有这些选项和其他方式的更多信息。

【讨论】:

    【解决方案2】:

    该代码实际上没有多大意义 - 您正在无模式地显示消息,因此 Display 立即返回,然后您在用户有机会看到屏幕上的任何内容之前调用 Send。您希望用户单击“发送”按钮吗?在这种情况下,只需调用 Display,然后让用户完成其余的工作 - 没有理由调用 Send。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2018-10-17
      • 2018-05-30
      相关资源
      最近更新 更多