处理Items_ItemAdd过程未处理的电子邮件

时间:2016-10-11 10:22:26

标签: vba outlook outlook-vba

我正在使用 Items_ItemAdd 处理传入的电子邮件,但有时它会停止工作,我正在尝试找出原因。

与此同时,我想了解如何处理收件箱中的电子邮件,但未使用 Items_ItemAdd 程序处理,而无需再将其重新发送到收件箱

2 个答案:

答案 0 :(得分:0)

“当一次将大量项目添加到文件夹时,此事件不会运行。” https://msdn.microsoft.com/en-us/library/office/ff869609.aspx

Sub ProcessUnprocessed
' Counting backwards in case items are moved or deleted in ItemAdd code
' Count backwards always. Never use For Each (Notes to self.)
For i = ActiveExplorer.Selection.count to 1 step -1

    watchedFolderItems_ItemAdd(ByVal ActiveExplorer.Selection(i) As Object)

Next
End Sub 

答案 1 :(得分:0)

与所有基于MAPI的事件一样,

Items.ItemAdd是为UI目的而设计的,它永远不应该用于任何类型的消息处理。

话虽如此,请确保您的事件处理程序尽可能少 - 理想的做法是将新项的条目ID添加到列表中并立即退出事件处理程序。然后可以单独处理消息列表。请记住,OOM不能在Outlook地址空间内的辅助线程上使用,您需要Extended MAPI(C ++或Delphi)或Redemption(任何语言,其RDO系列可以在辅助线程上使用对象。

另请注意,当有太多(“太多”的定义取决于提供程序)通知时,会引发TABLE_CHANGED或TABLE_RELOAD MAPI通知。 Outlook对象模型以静默方式播放该通知。如果使用Redemption是一个选项,它会公开RDOItems。CollectionModified事件。

如果是Exchange邮箱,您还可以使用ICS(Incremental Change Synchronization)API - 这是Outlook自身用于将OST文件文件夹与远程邮箱同步的API。 API是扩展MAPI,因此,您需要C ++或Delphi才能使用它。 Redemption通过RDOFolderSynchronizer对象公开API。