2016-10-11 65 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。