Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 仅当选定文件夹时,才会激发IMAP文件夹上的Outlook ItemAdd事件_Vba_Outlook - Fatal编程技术网

Vba 仅当选定文件夹时,才会激发IMAP文件夹上的Outlook ItemAdd事件

Vba 仅当选定文件夹时,才会激发IMAP文件夹上的Outlook ItemAdd事件,vba,outlook,Vba,Outlook,我在Outlook VBA编程方面遇到了一个小问题,我想知道是否有解决方案,或者这只是另一个“已知问题” 上下文: 我已配置Outlook电子邮件帐户,以便通过IMAP访问我的web电子邮件提供商。在Outlook中,我可以正确查看我的web电子邮件文件夹。我的提供商的垃圾邮件过滤器将垃圾邮件移动到垃圾邮件文件夹中 我想自动将放入垃圾邮件文件夹的邮件移动到本地pst文件中的另一个文件夹中 我让它工作99%(通过下面提供的代码供参考) 问题: 我可以看到垃圾邮件文件夹中有邮件(文件夹名称旁边有

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


上下文

我已配置Outlook电子邮件帐户,以便通过IMAP访问我的web电子邮件提供商。在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
Public,事件myItems作为Outlook.Items
公共子应用程序_启动()
将myNameSpace设置为Outlook.NameSpace
Const mailboxName As String=“Mail.com”
Const子文件夹名称为String=“Spam”
'引用MAPI垃圾邮件文件夹中的项目
'因为myOlItems声明为“WithEvents”,ItemAdd事件将在下面触发。
设置myNameSpace=Application.GetNamespace(“MAPI”)
错误转到noSpamFolder
设置myItems=myNameSpace.Folders(mailboxName).Folders(subfolderName).Items
错误转到0
出口接头
noSpamFolder:
MsgBox“找不到文件夹”
端接头
私有子myItems\u ItemAdd(ByVal项作为对象)
将可疑文件夹设置为Outlook.MAPIFolder
'检查以确保它是Outlook邮件,否则
'根据类型,后续代码可能会失败
"当然是。
如果TypeName(Item)=“MailItem”,则
'将邮件移动到“可疑”文件夹
转到noSuspectFolder时出错
Set suspectFolder=Outlook.Session.GetDefaultFolder(olFolderInbox.Folders)(“可疑”)
错误转到0
项目。移动可疑文件夹
如果结束
出口接头
noSuspectFolder:
MsgBox“无法找到作为默认收件箱文件夹的子文件夹的文件夹”
端接头

这很有意义-只有在通过Outlook对象模型选择或访问文件夹时,Outlook中的IMAP提供程序才会同步该文件夹。

我认为除了每隔一段时间轮询文件夹(并在点击之间释放MAPIFolder对象)之外,您没有什么可以做的。

我遇到了一个类似的问题,即在邮件发送后移动邮件,并使用您的代码执行此任务(thx!)。还有几个问题需要解决

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

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

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


Peter

我是这么想的,但未读计数确实会更新,这一事实告诉我Outlook知道有新邮件,尽管它实际上还没有获取它们。有没有办法钩住该信息?是否在父文件夹上触发MAPIFolder.FolderChange事件?您可以在OutlookSpy中看到事件(选择父文件夹,单击OutlookSpy工具栏上的文件夹按钮,选择文件夹属性,单击浏览,转到事件选项卡)?我无法按照您的说明进行操作,我似乎没有得到您所期望的。以下是我所做的:1)下载并安装了OutlookSpy 2.15(不是最新的,因为我正在运行Outlook 2002)2)如果我选择垃圾邮件文件夹的父文件夹,单击Outlook spy上的文件夹项目不会产生任何操作。父文件夹是该帐户的主文件夹,在Outlook主窗口中,我收到消息“无法显示该文件夹。这是IMAP存储的根目录。根目录不包含邮件,但可能包含子文件夹…”3)如果我先选择我的垃圾邮件文件夹,请单击OutlookSpy的文件夹按钮生成“MAPIFolder”对话然后点击浏览。。。似乎只是产生了另一个对话框的副本。两者都没有“事件”选项卡,它们只有“属性”、“功能”和“脚本”选项卡。单击“文件夹”按钮后,选择“文件夹”(注意复数形式)属性,然后单击“浏览”。脚本正常工作了吗?我正在试图找到一种方法,以便在创建日历事件后触发事件,我想这可能与Outlook.MAPIFolder.itemsAdd类似,但我不能完全确定。我基本上没有使用VBscript的经验,也许你可以给我指出正确的方向…我的初始描述没有任何改进,这意味着我仍然需要单击IMAP文件夹