Automating Email Rules in Outlook with VBA

在Outlook中自动化邮件规则是一项可以显著提高工作效率的任务。本文将指导如何使用VBA(Visual Basic for Applications)来实现这一目标。将探讨如何为Exchange和iMap账户设置规则,并确保它们在读取和未读邮件上都能运行。

几个月前,遇到了一个问题:Outlook 2007中的Exchange规则不再在收件箱中运行。即使在全新安装的Outlook 2016中重新创建了规则和配置文件,问题依然存在。不得不手动启动“规则和警报”对话框,选择Exchange账户,点击“立即运行规则”,然后逐个勾选规则并点击“立即运行”。尽管其他人也报告了这个问题,但无论是Microsoft还是托管Exchange提供商都无法提供指导。

经过大量搜索,在OutlookCode.com上找到了Sue Mosher在2006年发表的一篇文章,标题为“Run all rules against inbox”。这正是一直在寻找的解决方案。现在可以通过添加到“开发者”功能区的按钮,或者添加到“快速访问工具栏”的类似按钮来运行规则。

为什么需要宏

标准Outlook配置文件中有八个不同的电子邮件账户。其中一个是Exchange(规则问题的奇怪之处),几个POP3(这些没有规则),还有五个iMap账户(大多数有规则)。顺便说一句,Outlook 2016对iMap的支持比Outlook 2007要好得多。只希望运行非服务器规则也是如此。

为什么想让宏也适用于iMap账户呢?因为经常在平板电脑或手机上查看电子邮件。一旦阅读了邮件,如果忘记将其标记为未读,那么除非手动运行它们并包括未读邮件(这对Exchange收件箱也是如此),否则规则将不会应用。到目前为止,不得不手动对已读邮件进行排序或手动为已读邮件应用规则。现在,有机会通过一个工具栏按钮来实现这一切。

代码使用

下载MyOutlookVBA.zip并解压MyOutlookVBA.bas文件。打开Outlook并按Alt-F11加载VBA编辑器。默认项目名称通常是Project1;重要的是,旁边括号内应显示VbaProject.OTM。右键单击“模块”文件夹,然后从菜单中选择“导入文件...”。当导入文件对话框(实际上是重新利用的文件打开对话框)出现时,浏览到解压MyOutlookVBA.bas的位置,并导入它。然后在VBA编辑器工具栏上点击保存文件图标(或从菜单中选择:文件/保存VbaProject.otm)。

接下来,需要在Outlook的“信任中心”启用宏执行。完成此操作后,有几个选项。如果还没有这样做,可能首先想要在Outlook的功能区上显示“开发者”选项卡。要运行此宏,可以在开发者功能区的左侧按下宏按钮并选择RunAllInboxRules,自定义功能区以在开发者功能区添加一个部分并创建一个按钮来执行RunAllInboxRules,将RunAllInboxRules添加到快速访问工具栏,或者这些选项的某种组合。如果不希望RunAllInboxRules的输出结果输出到选择的目录或文件,请在调用LogInfo时更改它(见下文“附加子程序和跟踪规则执行”)。强烈建议现在和以后检查日志文件。它将告诉是否有任何规则失败,这是Outlook自动执行规则(或通过“立即运行规则”手动执行)所不做的事情。这使其成为一个简单的规则调试工具。在rl.Execute行上放置一个断点将允许检查规则的详细信息,以确定哪里出了问题...祝好运;-)。

要点

使宏工作的关键部分是理解Rules.Execute的工作原理。最终,通过Outlook的规则和警报对话框手动操作规则给了需要的线索。这是Outlook 2016中“立即运行规则”的图片:

注意对话框底部的选项:在文件夹中运行,包括子文件夹,应用规则到。这些分别对应于可以传递给Rule.Execute的4个参数中的3个。这让尝试了以下代码: VB.NET rl.Execute RuleExecuteOption:=OlRuleExecuteOption.olRuleExecuteAllMessages, _ Folder:=st.GetDefaultFolder(olFolderInbox) 注意rl是Outlook.Rule对象,st是当前账户的Outlook.Store对象(确切地说是DeliveryStore)。

对于每个Store使用GetDefaultFolder是指向正确收件箱的关键。否则,它似乎会访问活动Outlook配置文件的默认收件箱(在情况下是Exchange)。

附加子程序和跟踪规则执行

原始宏调用MsgBox来显示已执行规则的列表(该代码仍然存在,尽管被注释掉了)。但是,一旦添加了多个账户(以及定义的规则数量),MsgBox的文本显示限制裁剪了太多数据。另外,不喜欢每次运行规则时MsgBox都会弹出。确实想知道是否有任何规则执行问题(或者记录是否有任何规则被禁用)。这导致添加了LogInfo子程序。这简单地将ruleList文本输出到文本文件(文件夹位置作为参数传递(使用"%USERPROFILE%\My Documents\Email\")。请注意,路径中的尾随反斜杠是必需的。

LogFile将根据需要在路径中创建最终目录。所有父目录必须存在,否则LogFile将出错。

重要说明

当将VBA代码导入Outlook时,非常重要的一点是,需要将代码放入VbaProject.otm下的Modules文件夹中。还需要在Outlook的工具/信任中心中启用宏,对于所有宏启用警告,或使用无安全检查(后者选项是危险的)。

在运行此代码之前,必须确保引用了Office版本的Microsoft Office对象库以及Outlook对象库。从VBA编辑器中,单击工具/引用。对于Outlook 2016,所需的库是: Microsoft Outlook 16.0 Object library Microsoft Office 16.0 Object library

对于配置,还有这些引用: OLE Automation // 需要LogInfo子 Visual Basic for Applications

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485