【问题标题】:Check for sent mail when Outlook isn't fully loaded在 Outlook 未完全加载时检查已发送邮件
【发布时间】:2020-05-21 06:38:49
【问题描述】:

我现在在检查电子邮件是否已发送时遇到问题。到目前为止,我已经尝试了这三种订阅此类事件的方法:

  • application.ItemSend += ApplicationOnItemSend;
  • application.Session.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderOutbox).Items.ItemAdd += ItemsOnItemAdd;
  • application.Session.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderSentMail).Items.ItemAdd += ItemsOnItemAdd2;

当 Outlook 完全打开时,所有这三个都很好,当您打开一个 msg 文件而 Outlook 没有在后台打开时,我的问题就出现了。在这些情况下,您看到的只是“新消息”窗口,当您从那里发送邮件时,这些事件都不会触发。即使选中了在有网络连接时应尽快发送邮件的选项,邮件也会被放入发件箱,并且在 Outlook 的下一次完全启动时,仍有一封邮件已放入发件箱但未完全发送。即使在我的同事计算机上,没有安装我的 Outlook 插件和设置相同的选项(应该是标准的),邮件只是被放入发件箱时也会出现同样的问题。
我还检查了我尝试订阅这些事件的方式,并且我的事件处理程序都不包含任何阻止后台线程的代码(例如当我使用MessageBox.Show() 进行调试时)。因此,我的任何代码都没有明显的原因阻止发送邮件。
我订阅这些事件的地方似乎也没有什么不同。通常我会在插件启动时订阅,但是在打开 msg 文件时不会调用该方法。因此,我将订阅移至功能区的加载事件。 load 事件打印了我的调试消息,表明该方法已被调用,但 ItemSend/ItemAdd 事件在按下“send”时仍未触发。
所有这些只是 Outlook 出现故障还是有办法检查从“新邮件”窗口发送的邮件?

【问题讨论】:

    标签: c# email outlook vsto outlook-addin


    【解决方案1】:

    首先,最后两个偶数处理程序不起作用 - 引发事件的对象必须保持活动状态。在您的情况下,您正在一个隐式变量上设置事件处理程序,该变量将在几秒钟内下次运行时购买垃圾收集器。引发事件的 Items 集合必须保存在单独的 gloab l(class level) 变量中。

    其次,不要触摸发件箱文件夹中的邮件 - 这样做会中止提交。

    【讨论】:

    • 你的第一点是对的,我忘记了。我现在删除了与发件箱文件夹有关的任何内容,并将对已发送文件夹的引用放在私有静态成员中,但没有成功。
    • 您是否摆脱了发件箱文件夹中的事件处理程序?
    • 是的,只剩下已发送邮件文件夹的处理程序。我还删除了应用程序上的 ItemSend 事件处理程序。
    • 请记住,消息提交是异步的,因此如果您尝试发送消息并且 Outlook 关闭,则消息不会发出。
    • 这很可能是问题所在,也是我说的原因,Outlook 一定不能在后台打开,我的问题才会出现。单击“发送”后,Outlook 会立即关闭,不会留下任何痕迹。在那之后,我什至无法在任务管理器中发现一个 Outlook 进程
    猜你喜欢
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多