IMAP文件夹上的Outlook ItemAdd事件仅在选择文件夹时触发

时间:2013-02-15 00:33:38

标签: outlook-vba

我正在使用Outlook VBA编程遇到一个小问题,想知道是否有解决方案,或者这只是另一个“已知问题”。


上下文

我已配置Outlook电子邮件帐户以通过IMAP访问我的网络电子邮件提供商。在Outlook中,我可以正常查看我的Web电子邮件文件夹。我的提供商的垃圾邮件过滤器将垃圾邮件移动到垃圾邮件文件夹中。

我想在我的本地pst文件中自动将放入垃圾邮件文件夹的邮件移动到另一个文件夹中。

我有99%的工作(通过下面提供的代码作为参考)。


问题

我可以看到Spam文件夹中有消息(文件夹名称旁边有一个粗体未读消息计数),但是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

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,在发送邮件后移动邮件并使用你的代码来执行这项任务(thx!)。有几个问题仍有待解决。

首先,项目已移动,但在将它们放入垃圾箱文件夹后立即移动。这似乎是一个IMAP问题(Gmail),可以通过更改邮箱帐户的Internet电子邮件设置从“将已删除的项目移动到服务器上的以下文件夹”更改为“标记要删除的项目但不移动它们”来解决自动”。

第二个挑战是和你的一样,触发代码来完成它的工作。在帐户配置中,“已保存已发送的电子邮件”选项已禁用(因为这是由Gmail服务器自动执行的)。我需要将已发送项目(MAPI)文件夹与发送项目(IMAP)文件夹同步。 我通过为此电子邮件帐户配置“发送/接收”组(在“所有帐户”组中)并选择“已发送邮件”文件夹来实现此目的。

现在同步此文件夹,无需打开文件夹进行同步。我希望这也能解决你的问题。

彼得

答案 1 :(得分:1)

这是有道理的 - 只有在通过Outlook对象模型选择或加入文件夹时,Outlook中的IMAP提供程序才会同步该文件夹。 我不认为你可以做很多事情偶尔轮询文件夹(并在命中之间释放MAPIFolder对象)