Vba 仅当选定文件夹时,才会激发IMAP文件夹上的Outlook ItemAdd事件
我在Outlook VBA编程方面遇到了一个小问题,我想知道是否有解决方案,或者这只是另一个“已知问题”Vba 仅当选定文件夹时,才会激发IMAP文件夹上的Outlook ItemAdd事件,vba,outlook,Vba,Outlook,我在Outlook VBA编程方面遇到了一个小问题,我想知道是否有解决方案,或者这只是另一个“已知问题” 上下文: 我已配置Outlook电子邮件帐户,以便通过IMAP访问我的web电子邮件提供商。在Outlook中,我可以正确查看我的web电子邮件文件夹。我的提供商的垃圾邮件过滤器将垃圾邮件移动到垃圾邮件文件夹中 我想自动将放入垃圾邮件文件夹的邮件移动到本地pst文件中的另一个文件夹中 我让它工作99%(通过下面提供的代码供参考) 问题: 我可以看到垃圾邮件文件夹中有邮件(文件夹名称旁边有
上下文: 我已配置Outlook电子邮件帐户,以便通过IMAP访问我的web电子邮件提供商。在Outlook中,我可以正确查看我的web电子邮件文件夹。我的提供商的垃圾邮件过滤器将垃圾邮件移动到垃圾邮件文件夹中 我想自动将放入垃圾邮件文件夹的邮件移动到本地pst文件中的另一个文件夹中 我让它工作99%(通过下面提供的代码供参考)
问题: 我可以看到垃圾邮件文件夹中有邮件(文件夹名称旁边有一个粗体的未读邮件计数),但ItemAdd甚至只有在我单击该文件夹时才会触发。此时,我看到垃圾邮件文件夹的内容,然后看到所有新的垃圾邮件被移动到我的本地文件夹 除了ItemAdd之外,是否还有其他触发器源可以用来运行代码而不必单击文件夹?文件夹的未读计数更改时是否会触发事件
技术细节:
- Windows 8操作系统
- 使用Outlook 2002(是的,我知道…)
- 我是一名经验丰富的C/C++开发人员,但在VBA方面的经验很少,而且没有Outlook方面的经验
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文件夹