2013-02-15 45 views
3

我在Outlook VBA編程中遇到了一些小問題,並且想知道是否有解決方案,或者這只是另一個「已知問題」。只有當選擇了文件夾時,IMAP文件夾上的Outlook ItemAdd事件纔會觸發


語境

我已經配置了Outlook電子郵件帳戶通過IMAP訪問我的網站的電子郵件服務提供商。在Outlook中,我可以正常看到我的Web電子郵件文件夾。我的提供商的垃圾郵件過濾器將垃圾郵件移入垃圾郵件文件夾。

我想自動將放入垃圾郵件文件夾的郵件移動到我本地pst文件中的另一個文件夾中。

我讓它工作了99%(通過下面提供的代碼以供參考)。


問題

我可以看到,有在垃圾郵件文件夾中的郵件(有文件夾名稱旁邊有一個大膽的未讀郵件數),但ItemAdd甚至只會火當我點擊在文件夾上。到那時,我看到了垃圾郵件文件夾的內容,然後看到所有新的垃圾郵件都被移到了我的本地文件夾中。

除ItemAdd外還有另一個觸發源嗎?我可以用它來運行我的代碼而無需點擊文件夾?當文件夾的未讀計數發生變化時是否觸發事件?


技術細節

  • 的Windows 8操作系統
  • 使用Outlook 2002(是的,我知道...)
  • 我是一個經驗豐富的C/C++開發者,但VBA最少的經驗,而沒有Outlook。

VBA代碼:

Public WithEvents myItems As Outlook.Items 

Public Sub Application_Startup() 

    Dim myNameSpace As Outlook.NameSpace 
    Const mailboxName As String = "Mail.com" 
    Const subfolderName As String = "Spam" 


    ' Reference the items in the MAPI spam folder 
    ' Because myOlItems is declared "WithEvents" the ItemAdd event will fire below. 
    Set myNameSpace = Application.GetNamespace("MAPI") 

    On Error GoTo noSpamFolder 
    Set myItems = myNameSpace.Folders(mailboxName).Folders(subfolderName).Items 
    On Error GoTo 0 

    Exit Sub 

noSpamFolder: 
    MsgBox "Unable to find folder <" & mailboxName & "/" & subfolderName & ">" 

End Sub 


Private Sub myItems_ItemAdd(ByVal Item As Object) 

    Dim suspectFolder As Outlook.MAPIFolder 

    ' Check to make sure it is an Outlook mail message, otherwise 
    ' subsequent code will probably fail depending on what type 
    ' of item it is. 
    If TypeName(Item) = "MailItem" Then 

     ' Move message to the 'suspect' folder 
     On Error GoTo noSuspectFolder 
     Set suspectFolder = Outlook.Session.GetDefaultFolder(olFolderInbox).Folders("suspect") 
     On Error GoTo 0 

     Item.Move suspectFolder 

    End If 

    Exit Sub 

noSuspectFolder: 
    MsgBox "Unable to find folder <suspect> as a sub-folder of default inbox folder" 
End Sub 
+0

您是否已經獲得腳本工作?我試圖找到一種事件的方式來創建一個日曆事件時,我想這將沿着'Outlook.MAPIFolder.itemsAdd'的行,但我不完全確定。我基本上沒有使用VBscript的經驗,也許你可以指點我正確的方向... – Silentdarkness 2013-09-06 06:12:06

+0

從我的初始描述沒有改善,這意味着我仍然需要點擊IMAP文件夾來處理它的項目。我可以忍受這一點。 – 2013-09-07 10:26:22

回答

2

我一直在努力與類似的問題,以移動郵件項目在它們被髮送並使用你的代碼來執行這個任務之後(thx!)。有幾個問題仍有待解決。

首先,物品被移動,但是在它們被放入垃圾箱之後立即被移動。這似乎是IMAP問題(Gmail),可以通過將郵箱帳戶的Internet電子郵件設置從「將已刪除項目移動到服務器上的以下文件夾」更改爲「標記要刪除的項目但不要移動項目自動」。

第二個挑戰就是像你一樣觸發代碼來完成它的工作。在帳戶配置中,保存發送的電子郵件選項被禁用(因爲這是由Gmail服務器自動執行的)。我需要將已發送郵件(MAPI)文件夾與發送郵件(IMAP)文件夾同步。 我通過爲此電子郵件帳戶(在所有帳戶組中)配置「發送/接收」組並選擇已發送郵件文件夾來實現此目的。

現在該文件夾是同步的,無需打開文件夾進行同步。我希望這也能解決你的問題。

Peter

+0

這是缺失的項目,謝謝!將IMAP帳戶中的垃圾郵件文件夾添加到發送/接收組後, ItemAdd事件在刷新時被觸發。:) – 2013-11-25 23:04:14

1

這是有道理的 - 在Outlook中的IMAP提供同步,只有當它被選擇或通過Outlook對象模型accesed的文件夾。
我不認爲有很多你可以做短暫輪詢文件夾每隔一段時間(並釋放MAPIFolder對象之間的命中)

+0

這就是我的想法,但未讀計數更新的事實告訴我,Outlook知道有新消息,即使它尚未實際提取它們。任何方式來鉤住這些信息? – 2013-02-15 22:25:10

+0

MAPIFolder.FolderChange事件在父文件夾上觸發嗎?您可以在OutlookSpy中查看事件(選擇父文件夾,單擊OutlookSpy工具欄上的文件夾按鈕,選擇文件夾屬性,單擊瀏覽,轉至事件選項卡)? – 2013-02-16 02:55:07

+0

我無法遵循您的指示,我似乎沒有得到我相信您期待的內容。這是我做的: 1)下載和安裝OutlookSpy 2.15(不是最新的,因爲我運行Outlook 2002) 2)如果我選擇我的垃圾郵件文件夾的父文件夾,單擊前景間諜不會產生任何行動。父文件夾是該帳戶的主文件夾,並且在主Outlook窗口中顯示「無法顯示文件夾」消息,這是IMAP存儲的根目錄。根目錄不包含消息,但可能有子文件夾...「 – 2013-02-17 13:01:12

相關問題