2016-06-21 77 views
0

我的Outlook由3个用户邮箱(缓存)和10个共享邮箱(在线)组成。如何为所有“已发送邮件”文件夹收听“ItemAdd”?

我需要捕捉这些邮箱中的邮件发送时,所以我搜索了一下,我应该听“ItemAdd”事件。

问题是,ItemAdd事件未被触发。

这里是我的测试代码:

Imports System.Runtime.InteropServices 

Public Class ThisAddIn 

    Private sentFolders As New List(Of Outlook.Folder) 


    Private Sub ThisAddIn_Startup() Handles Me.Startup 
     Call InitSentFolders() 
    End Sub 


    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown 
    End Sub 


    Private Sub InitSentFolders() 
     Dim ns As Outlook.NameSpace = Application.GetNamespace("MAPI") 
     Dim stores As Outlook.Stores = ns.Stores 
     For i As Integer = 1 To stores.Count 
      Try 
       Dim store As Outlook.Store = stores(i) 
       Try 
        Dim sentFolder As Outlook.Folder = TryCast(store.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderSentMail), Outlook.Folder) 
        AddHandler DirectCast(sentFolder.Items, Outlook.Items).ItemAdd, AddressOf ItemAdd 
        sentFolders.Add(sentFolder) 
       Catch ex As Exception 
       End Try 
       Marshal.ReleaseComObject(store) 
      Catch ex As Exception 
      End Try 
     Next 
     Marshal.ReleaseComObject(stores) 
     Marshal.ReleaseComObject(ns) 
    End Sub 


    Private Sub ItemAdd(ByVal ItemObject As Object) 
     If TypeOf (ItemObject) Is Outlook.MailItem Then 
      Dim item As Outlook.MailItem = CType(ItemObject, Outlook.MailItem) 
      MsgBox(item.Sender.ToString) 
      Marshal.ReleaseComObject(item) 
     End If 
    End Sub 

End Class 

任何想法,为什么它没有被解雇?

感谢

回答

0

这对于初学者来说是广泛分布的错误...

您需要在全球范围内声明的源对象(例如,在加载类),并保持它活着得到事件。或者垃圾收集器滑动堆并且源对象将被销毁。

在你的情况下,定义一个Outlook文件夹列表,你可以保留所有的引用。

相关问题