如果邮箱中有未读项目,我怎样才能运行Outlook宏?

时间:2015-06-25 11:09:46

标签: vba email events outlook automation

所以,我目前正在编写一个脚本,它以某种方式接收电子邮件并处理它们。我希望它在没有任何人为干预的情况下完全自动工作,因为大多数情况下我都是这样做的。

我遇到的问题是,如果邮箱在Outlook关闭时收到电子邮件,我就无法通过该电子邮件启动该程序。如果我使用

Private Sub Application_Startup() 'Runs at application start
    Call ProcessCode
End Sub

然后它运行得太早,但尚未收到消息,因此无法处理。

我试过了

Private Sub Application_NewMail() 'Runs whenever a new mail item is recieved
    Call ProcessCode
End Sub

但由于某种原因,这不会在这种情况下运行(正常收到邮件时运行)

我也尝试了Application_ItemLoadApplication_MAPILogonComplete,但这些似乎都不起作用。

我理想的是,只要邮件箱中存在未读邮件,就会运行代码,无论它是如何到达的。

提前致谢

Alex Spicer

1 个答案:

答案 0 :(得分:0)

您可以考虑使用计时器来定期检查未读电子邮件。有关详细信息,请参阅Outlook VBA - Run a code every half an hour。在计时器的刻度线事件中,您可以使用带有"[UnRead] = true"条件的Items类的Find / FindNextRestrict方法获取所有未读电子邮件。请阅读以下文章中有关这些方法的更多信息:

另外,我建议处理NewMailEx事件,而不是NewMail事件。

对于Microsoft Outlook处理的每个接收项,都会触发此NewMailEx次事件。该项可以是几种不同项类型之一,例如,MailItem,MeetingItem或SharingItem。 EntryIDsCollection字符串包含与该项对应的条目ID。请注意,当EntryIDCollection包含自上次触发事件以来收件箱中收到的所有项目的逗号分隔条目ID列表时,此行为已从事件的早期版本更改。

当新邮件到达收件箱时以及客户端规则处理发生之前,会触发NewMailEx事件。您可以使用EntryIDCollection数组中返回的条目ID来调用NameSpace.GetItemFromID方法并处理该项。请谨慎使用此方法,以尽量减少对Outlook性能的影响。但是,根据客户端计算机上的设置,在新邮件到达收件箱后,垃圾邮件过滤和将新邮件从收件箱移动到另一个文件夹的客户端规则等过程可能会异步发生。您不应该假设在这些事件发生后,您将始终获得收件箱中项目数量的一项增加。