如何在Outlook 2010中实现多脚本对应多规则自动保存供应商发票附件?
需求与问题
我在Windows 11上使用Outlook 2010担任应付会计,所有发票均通过邮件接收。我有大量供应商,希望创建规则将特定供应商邮件中的附件自动保存至对应文件夹(例如将joeshmo的邮件附件保存至「我的文档\joeshmo」)。
现有两个可用代码:
- 选中邮件后运行的宏:可将所有附件保存至同一文件夹
- 可在规则中调用的脚本
已重新启用Outlook对应版本的脚本功能,但在规则设置中选择「运行脚本」时,下拉列表仅显示ThisOutlookSession中的代码,VBA编辑器的模块代码不显示,且只能在ThisOutlookSession中粘贴一段代码。想为每个供应商创建对应的规则和脚本实现发票附件自动分类保存,询问该需求是否可行?目前只能先将所有附件保存至同一文件夹再整理,或通过规则为供应商邮件分配分类后按字母排序批量处理。
现有脚本代码:
Public Sub saveAttachtoDisk(itm As Outlook.MailItem) Dim objAtt As Outlook.Attachment Dim saveFolder As String Dim dateFormat dateFormat = Format(Now, "yyyy-mm-dd H-mm") saveFolder = "C:\Users\jenny\Documents\Attachments\outlook testing\test number one" For Each objAtt In itm.Attachments objAtt.SaveAsFile saveFolder & "\" & dateFormat & objAtt.DisplayName Set objAtt = Nothing Next End Sub
可行解决方案
这个需求完全可以实现,无需为每个供应商编写单独脚本,只需一个通用逻辑+多个规则入口即可搞定,具体步骤如下:
1. 修改通用脚本(存放于ThisOutlookSession)
将脚本改成可根据供应商名称自动匹配文件夹的版本,既避免重复代码,又能让规则识别到对应入口:
' 通用核心逻辑:根据供应商名称保存附件 Private Sub SaveAttachToSupplierFolder(itm As Outlook.MailItem, supplierName As String) Dim objAtt As Outlook.Attachment Dim saveFolder As String Dim dateFormat As String ' 替换为你的「我的文档」基础路径 saveFolder = "C:\Users\jenny\Documents\" & supplierName ' 自动创建文件夹(如果不存在) If Dir(saveFolder, vbDirectory) = "" Then MkDir saveFolder End If dateFormat = Format(Now, "yyyy-mm-dd H-mm") For Each objAtt In itm.Attachments ' 加时间戳避免文件名重复 objAtt.SaveAsFile saveFolder & "\" & dateFormat & "_" & objAtt.DisplayName Set objAtt = Nothing Next End Sub ' 每个供应商的规则调用入口(必须放在ThisOutlookSession才能被规则识别) Public Sub SaveToJoeShmo(itm As Outlook.MailItem) SaveAttachToSupplierFolder itm, "joeshmo" End Sub Public Sub SaveToABCCompany(itm As Outlook.MailItem) SaveAttachToSupplierFolder itm, "ABCCompany" End Sub ' 可继续添加更多供应商的入口,格式同上
2. 为每个供应商创建规则
- 打开Outlook规则向导→新建规则→选择「对我接收的邮件应用规则」
- 设置触发条件:比如「发件人是joeshmo@xxx.com」或「主题包含[JoeShmo 发票]」
- 设置操作:选择「运行脚本」,下拉列表中会显示对应供应商的入口(如
SaveToJoeShmo) - 完成规则设置并启用
关于模块代码不显示的原因
Outlook规则可调用的脚本必须满足两个硬性条件:
- 必须是
Public修饰的Sub过程,且参数只能为Outlook.MailItem类型 - 必须存放于
ThisOutlookSession模块中,普通模块内的代码不会出现在规则的脚本下拉列表里
通过「通用逻辑放普通模块+入口放ThisOutlookSession」的方式,既能保证代码复用,又能让规则识别到对应脚本。
内容的提问来源于stack exchange,提问作者Jenny Young
相关产品推荐
相关产品推荐

