【发布时间】:2018-07-10 22:04:03
【问题描述】:
好的,好像有人以前遇到过这个问题,但我没有看到任何进一步的 cmets 或解决方案。请参阅this question 的已接受答案中的编辑。
我的情况是这样的。
我正在使用 Exchange 电子邮件帐户在 Win10 x64 下运行 Outlook 2013。我有时一次运行 Outlook 几天到一周或更长时间而没有关闭它。
我想在将新项目添加到“已发送邮件”文件夹时引发一个事件。这需要在 Application ItemSend 事件之后发生,因为假设我想在消息发送后删除消息,而您无法在 ItemSend 事件处理程序中执行此操作。
所以我有以下代码:
Public WithEvents goSent As Outlook.Items
Private Sub Application_Startup()
'Establish the global object for the folder we want to monitor.
Set goSent = Session.GetDefaultFolder(olFolderSentMail).Items
End Sub
Private Sub goSent_ItemAdd(ByVal Item As Object)
'Do stuff here.
End Sub
在一天或更长时间内一切正常,但最终ItemAdd 事件处理程序停止触发。如果我进入 VBA 编辑器并手动运行Application_Startup,它就会重新开始工作。
[编辑:]另外一点信息:“内置”事件,如 Application ItemSend,无论 Outlook 运行了多长时间,似乎总是可靠地触发。
[编辑 2:] 这一次,我在事件停止触发后放了一天。我打开了 VBA 编辑器并在Application ItemSend 过程中放置了一个断点。当它停止时,我查询 goSent 对象并发现 (a) 它仍然存在(而不是 Nothing),但是 (b) 它只包含昨天存在的项目,大概当时从“已发送邮件”项目集合中“不受束缚”。当我在“立即”窗口中提交新的Set 语句时,它立即又开始工作了。
[编辑 3:] 我注意到 MSDN 文档说要将自定义对象的事件处理程序(例如我的 ItemAdd 事件)放入 类模块。我在 ThisOutlookSession 中有我的,但我的理解是 ThisOutlookSession 是一个类模块。这有什么问题吗?
知道为什么会发生这种情况以及如何处理吗?我考虑为Application ItemSend 添加一个事件处理程序,并在每次触发时重新分配goSent 对象,但这并不能解决根本问题。
[编辑 4:] 一段时间以来,我在 Application ItemSend 处理程序中有一个 Set 语句,这似乎 大部分 处理了一些事情,即使它是一种解决方法,而不是真正的解决方案。当我长时间延迟已发送项目的交付时,它似乎失败了,同时我没有发送任何进一步的消息。然后goSent 对象与已发送邮件集合断开连接,并且在该点之后和Application ItemSend 再次触发之前,邮件实际上是从发件箱发送的。
谢谢!
[Edit 5:] 与原始问题无关:我发现我的宏无法使用处于 online 模式的 Exchange 服务器完成我想要的(即,未缓存模式)如果我的发件箱中有邮件延迟传递,并且在传递时间过去后 Outlook 已关闭。在联机模式下,Exchange 本身会发送这些邮件并将它们添加到服务器上的“已发送邮件”文件夹中,因此当 Outlook 重新打开时,这些邮件已经在“已发送邮件”集合中,并且不会触发任何事件。这是有道理的。见讨论here。看来我需要在我的 Application_Startup 宏中添加一些内容,以查找自 Outlook 上次关闭以来发送的邮件。
【问题讨论】:
-
在一天或更长时间内一切正常 - 为什么?晚上离开时尝试关闭 Outlook,第二天早上来时打开它。
-
实际上,我曾经有充分的理由让 Outlook 一直处于打开状态。让我们假装我仍然这样做。因此,关闭并重新打开 Outlook 可能会“解决”问题,就像在
ItemSend事件处理程序中重新分配goSent对象可能会起作用一样。两者都没有真正解决根本问题。 -
这可能与暂时失去与 Exchange Server 的连接有关吗?
-
那是在线的还是缓存的 Exchange 配置文件?