2016-10-11 220 views
0

我正在处理与Items_ItemAdd收到的电子邮件,但有时停止工作,我试图找出原因。处理未通过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 
+0

我想知道有多大 - 我的代码在使用规则移动到文件夹后几秒内用来处理100多封电子邮件,但之后决定停止工作,除非我手动移动它们。 –

0

Items.ItemAdd,就像所有基于MAPI的事件,被设计用于UI目的,不应该被用于任何类型的信息处理。

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

另请注意,当太多(“太多”取决于提供者的定义)通知时,会引发TABLE_CHANGED或TABLE_RELOAD MAPI通知。 Outlook对象模型默默地吃掉了那个通知。如果使用Redemption是一个选项,它会公开RDOItems .CollectionModified事件。

如果是Exchange邮箱,也可以使用ICS(Incremental Change Synchronization)API--这是Outlook自身使用的API将OST文件文件夹与远程邮箱同步的API。 API是扩展的MAPI,因此,您需要C++或Delphi来使用它。赎回通过RDOFolderSynchronizer对象暴露该API。