我正在使用 Items_ItemAdd
处理传入的电子邮件,但有时它会停止工作,我正在尝试找出原因。
与此同时,我想了解如何处理收件箱中的电子邮件,但未使用 Items_ItemAdd
程序处理,而无需再将其重新发送到收件箱
答案 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)
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。