大家好,我是太空铁。

OUTLOOK是老铁日常使用的邮件客户端,平时收发邮件也比较多。如果所有邮件都混杂在一个邮件箱中,那么在翻查一些特定联系人的往来邮件时会很麻烦,所以OUTLOOK专门提供了“规则”工具用来对收发邮件进行自动分类。

另外,如果OUTLOOK的规则工具不能满足你的日常需求的话,那么还可以通过VBA来实现更加全方位的对邮件的操作,本文将以老铁编写的一个小项目为例,展示一下VBA编写自动化邮件处理工具的方法,方便会使用VBA的朋友快速上手。

本文的提纲如下:

一、利用OUTLOOK规则工具对邮件进行自动分类

二、使用VBA实现邮件处理自动化


一、利用OUTLOOK规则工具对邮件进行自动分类

Outlook邮件很多的时候,默认是按照时间流来排序,实际工作中在回头查找一些工作记录的时候,往往记不清楚发生时间,但能记清楚往来邮件的相对人,所以按照发件人或收件人来分类更为适合。

规则工具设置的逻辑很明确,即是达成某种条件,执行某些动作。

1、建立发件人和收件人目录

收件箱 收件箱

上图是收件箱的分类,可以看到,我的同事程咬金、李逵、李逍遥之类的,他们如果给我发邮件会自动进入这个邮箱,如果要翻查邮件,只要记得谁发的,直接进入他的文件夹就行了。

来看看如何设置吧:

在收件箱上点右键,选择新建文件夹:

新建文件夹 新建文件夹

然后,在弹出的小空格里填入文件夹的名字,可以用同事、事务的名字来命名:

流浪地球的电影还没看 流浪地球的电影还没看

这样,文件夹就建好了。

2、设定规则

点击你想分类的邮件,然后再依次点击:开始——规则——总是移动来自此人的邮件:

总是移动来自此人的邮件 总是移动来自此人的邮件

在弹出的窗口选择要移动到的文件夹:

OUTLOOK邮件自动分类技巧和VBA自动化邮件处理介绍

点击确定,就能把当前邮件和以后来自该发件地址的邮件,全部归类到李逍遥这个目录。

如果你有更高级的诉求,可以点击创建规则:

OUTLOOK邮件自动分类技巧和VBA自动化邮件处理介绍

点击创建规则后,可以看到一个简单的规则定制窗口:

创建规则 创建规则

窗口上半部分可以定制包含的主题、收件人,下半部分是可选的执行操作,显示通知、播放声音、移至文件夹等,如果选择右下角的高级选项按钮,可以看到Outlook提供了丰富的可定制规则。

第一步是选择条件,并且对条件进行编辑,这里面,发件人、主题、目的地址、标记等等都可以进行编辑:

OUTLOOK邮件自动分类技巧和VBA自动化邮件处理介绍

第二步是选择操作,可以移动邮件、删除邮件、打印,转寄等等:

OUTLOOK邮件自动分类技巧和VBA自动化邮件处理介绍

第三步,可以选择例外情况,意味着可以在某种情况下就不执行该操作,例外情况跟第一步的条件是一样的:

OUTLOOK邮件自动分类技巧和VBA自动化邮件处理介绍

第四步,即可以命名和保存规则,保存完后可以选择立即执行规则处理目标邮件,这时候就可以溯及以往的邮件,不只是在新邮件上执行规则:

OUTLOOK邮件自动分类技巧和VBA自动化邮件处理介绍

OK,有关使用规则工具对邮件进行分类的部分就介绍这么多,大家可以自己试验一下,就知道这个功能的强大了。

下面来讲解如何使用VBA实现邮件处理自动化。

二、使用VBA实现邮件处理自动化

VBA是Office内嵌的自动化工具,可以让使用者更灵活的,以相对更底层的方式操作Office的各种功能, 它是面向对象的,也是事件驱动的, 并且以类似basic的语言方式来使用,方便使用者快速上手。

我将以一个实际的例子来介绍如何编写一个Outlook的VBA程序。事情是这样:

老婆在总公司做邮件分拣工作,公司的信息化很差,与下属公司通过邮箱来传递文件,下属公司经常会给总公司发一些PDF报表,老婆需要把这些邮件附件按照不同情况分派给不同的同事去处理,对附件进行重命名并做好登记记录。

公司不愿意为这点事投建信息化系统,但由于邮件的量很大,老婆为这点事就要占几个小时,因为上班时候还有工作,所以通常老婆下班就把这个工作带回家,等孩子们都睡了再做,很是辛苦。

后来,老铁就让老婆跟下属公司的人约定一个固定格式的邮件标题,把与分拣有关的内容都写在标题里(比如订单号,订单类型等),然后编写了一个VBA的程序,半自动化的处理邮件,将几个小时的工作时间缩短到十分钟以内。

这个程序需要实现的核心功能很简单——识别邮件标题并进行归类。程序主要对用户点击的邮件进行识别,把邮件标题上的信息摘取出来,附合一些分配人员的信息,将附件下载归类再登记,基本上把原先拷贝复制的工作都简化成点几下鼠标了。

实现这个需求用了600来行代码,

1、开始编写代码

在Outlook中编写代码非常容易,以前如果没有写过代码可能需要先打开“开发工具选项卡”:依次点击文件—选项—自定义功能区,勾选“开发工具”:

OUTLOOK邮件自动分类技巧和VBA自动化邮件处理介绍

勾选开发工具后,开发工具选项卡会显示在Outlook的界面上,点击开发工具选项卡,再点击Visual Basic,打开代码编写窗口:

OUTLOOK邮件自动分类技巧和VBA自动化邮件处理介绍

在代码编写窗口中,左边的工程窗口内,逐级展开project1,双击 ThisOutlokSession,可以打开代码编写区,我们的代码就是在这个区域编写的:

OUTLOOK邮件自动分类技巧和VBA自动化邮件处理介绍

代码主要分为两个部分,一是通过用户点击邮件,程序提取所点击邮件的相关信息,二是将相关信息显示在一个窗体上,接受用户修改和指定任务承担人的操作,在用户确认后进行登记和转存附件。

2、核心功能1:点击邮件并识别标题

代码的核心功能之一是用户点击邮件,并对所点击的邮件进行一系列的信息识别和提取。

Office的VBA程序都是事件驱动的,点击邮件识别标题就需要在点击邮件这个事件中进行编程,也就是说,点击了邮件就去执行这段代码。

点击邮件的事件即是:Outlook.Explorer 对象的 SelectionChange()事件,顾名思义,这个事件是在选择变化时触发,触发时,Outlook.Explorer 对象的 Selection 属性存储了当前选择的邮件项目的所有信息。

所以,我们要做的就是建立这个事件,并在事件中处理Selection中的有关信息。

A.声明和建立事件

声明事件:

Public WithEvents myOlExp As Outlook.Explorer ‘全局变量

建立事件:

Private Sub myOlExp_SelectionChange()

End Sub

使用这个事件时,还有一点需要注意,SelectionChange在Outlook启动期间会被触发,选中邮件时又会触发两次,所以需要在事件之初做一些判断,能够对所需要的那次触发做出处理,再添加以下代码:

声明触发计数变量:

Public fireSelChange As Integer '全局变量,触发计数器

在 myOlExp_SelectionChange() 事件中添加代码:

Private Sub myOlExp_SelectionChange()

fireSelChange = fireSelChange + 1 '触发计数

If appInit <> True Then '判定初始化是否完成

If fireSelChange Mod 2 = 0 Then '偶数次触发才是选中所需邮件的那次触发

'核心功能在此处实现

'……

fireSelChange = 2 '还原触发计数为2

Else

End If

ElseIf appInit = True And fireSelChange = 2 Then appInit = False '应用处于启动阶段且已触发两次则设定为应用处于已启动阶段

End If

End Sub

B.获取邮件标题

实现核心功能的思路主要是通过正则表达式对标题进行识别,将识别结果存储在变量中,上文说到邮件内容都包含在Outlook.Explorer 对象的 Selection 属性中,下面来看看具体如何获取邮件标题。

Selection属性是一个集合,可能包含多个项目,这个项目可能是邮件,也可能是联系人、任务等其他Outlook支持的对象,在这里只考虑选择一个邮件项目的情况,所以需要将Selection属性强制转换为 Outlook.MailItem 类型。

声明局部变量:

Dim myOlSel As Outlook.Selection 'Selection 属性

Dim strSubject As String '邮件标题

转换类型:

Set myOlSel = myOlExp.Selection '获得Selection 属性

If myOlSel.Count = 1 Then ‘判断是否选择了 1个项目

If myOlSel.Item(1).Class = OlObjectClass.olMail Then '判断所选的项目是否为 邮件

Set oMail = myOlSel.Item(1) '将邮件赋值给局部变量

strSubject = oMail.Subject '提取邮件标题

End If

End If

提取出邮件标题后,还需要提取很多内容,都可以引用MailItem类的有关属性,例如:

MailItem.Body '邮件正文

MailItem.ReceivedTime '邮件接收时间

MailItem.Attachments '邮件附件集合,可以使用For Each 遍历附件集合,获取附件文件名,另存附件等。

C.正则表达式和启动窗体

VBA中使用正则表达式,可以从下面的代码开始:

Set mRegExp = CreateObject("Vbscript.Regexp")

With mRegExp

.Global = False 'True表示匹配所有, False表示仅匹配第一个符合项

.IgnoreCase = True 'True表示不区分大小写, False表示区分大小写

.Pattern = "(b|B|c|C){1}[0-9]{11}" '匹配字符模式

Set mMatches = .Execute(strSubject) '执行正则查找,返回所有匹配结果的集合,若未找到,则为空

‘其他内容

End With

经过一系列字符串提取工作,可以将字符串赋值给一个窗体,然后方便用户在窗体上可视化的操作,这个窗体后面具体讲解,这里只看一下如何赋值和显示窗体:

With MailForm

.IDTB.Text = strID '给窗体中IDTB这个文本框(TB即TextBox)设置编号的字符串

.NameTB.Text = strName '给窗体中NameTB这个文本框设置名称的字符串

'……其他代码

.Show '显示窗体

End With


3、核心功能2:在窗体中显示有关数据,并接受用户操作

由于发来的邮件千差万别,很多邮件标题与约定的格式不能百分百一致,因此需要在提取信息后,给用户(也就是我老婆)一个修改的机会,并请人工指定把任务分配给谁,所以需要一个窗体,显示所有提取的信息,让用户指定任务承担人,并在用户确认这些信息后进行登记和存储邮件附件的操作。

窗体设计如下图:

OUTLOOK邮件自动分类技巧和VBA自动化邮件处理介绍

按照业务需求,窗体上提取出的信息最后都会记录到Excel文件中,同时也会合并到附件的文件名中。

使用VBA可以方便的在程序当中调用Excel或者Word等Office组件,并向文件中写入内容,以下代码可以添加到提交按钮的点击事件里:

Set xlapp = CreateObject("Excel.Application") '创建Excel对象。

Set wb = xlapp.workbooks.Open(recPathTB.Text) '打开记录文件

Set sht = wb.Sheets(1) '获取Excel表格的第一个sheet

i = sht.UsedRange.Rows.Count + 1 '计算单元格行数,i 即是定位到现有内容的最后一行。

sht.Cells(i, 1).Value = recvDateTB.Text

'将内容写入单元格

......

wb.Close True '关闭文件

xlapp.Quit '清理实例

4、其他代码

A.实现程序初始化

一般来说都要在Outlook启动时,做一些初始化的工作,程序初始化的事件是 Application_Startup ,可以在这个程序中添加初始化代码:

Private Sub Application_Startup()

Initialize_handler

End Sub

Initialize_handler 是一个自定义的函数,主要功能是 在Outlook启动之初添加一个类别标签,并用这个标签来标记已经处理的邮件。标签一经添加,下次启动就会存在不需要再添加,程序也会做出相应判断,具体实现如下:

Sub Initialize_handler()

Dim objNameSpace As NameSpace

Dim objCategory As Category 'Outlook中邮件标签对象,存储了当前已有的标签,例如紧急,普通等

Dim ifFinished As Boolean '标记是否已完成邮件处理的变量

Set myOlExp = Application.ActiveExplorer '代表Outlook窗口界面的对象

appInit = True '标志程序已经初始化

fireSelChange = 0 '初始化触发selecttion_change 事件的次数。

'查看是否有已办的标识

Set objNameSpace = Application.GetNamespace("MAPI")

ifFinished = False

For Each objCategory In objNameSpace.Categories

If objCategory.Name = "已办" Then

ifFinished = True

Exit For

End If

Next

'如果没有已办标识则新增已办标识

If ifFinished = False Then objNameSpace.Categories.Add ("已办")

End Sub

B.获取邮件附件相关信息

项目当中需要检查邮件附件的文件名后缀是否为PDF,所以需要获取邮件附件的相关信息:

邮件附件的对应的对象是 Attachment,存储在MailItem.Attachments集合中,可以通过Foreach来遍历邮件附件,另外为了保证能取到准确的文件扩展名,使用系统自带Scripting.FileSystemObject对象的GetExtesion函数获得,代码如下:

Private Function FindAttachName() As String

Dim oAttachment As Attachment '声明Attachment对象

Dim attachName As String '附件文件名字符串

Dim oFso As Object

Set oFso = CreateObject("Scripting.FileSystemObject") '设置FileSystemObject对象

FindAttachName = "" '设置返回值

For Each oAttachment In oMail.Attachments '遍历附件,oMail是全局变量

If LCase(oFso.GetExtensionName(oAttachment.FileName)) = "pdf" Then '判断附件文件名的扩展名是否为pdf

FindAttachName = oAttachment.FileName '设置返回值

Exit For

End If

Next

End Function

主要代码就展示到这里,相关的Outlook运行流程、组件类库等都有所涉及,算是抛砖引玉,源代码可以到文章最后下载。

三、总结

Outlook的邮件分类是一个非常便捷的工具,如果你的工作依赖于邮件系统,那一定要尝试进行分类,会节约很多时间,系统提供的规则工具已经可以进行初步的分类,日常工作足够用了。

如果像老铁一样有特殊的要求,那么花几天时间,照我的例子搞一个程序,也是可以考虑的,毕竟节约的时间都是自己的,而且总做一些机械重复的事情对心情也有不好的影响。

VBA编程对于有编程基础的人也有一些门槛,门槛并不在于VBA本身,而在于一是需要了解VBA程序在Outlook中的运行流程,二是要了解其内建的类库体系。我以前做过在其他代码中操作Excel、Word的程序,写Outlook的VBA程序也是第一次,不过好在相关的开发文档,网上的各种例子也很多,所以开发还算顺利。

就这样,谢谢观赏,老铁从小学(94年)开始学编程,初高中寒暑假都会写个程序,可惜后来上班却没怎么干过编程的工作,这是第一次写编程的文章,请大家给来个一条龙, 点赞+收藏+吐槽

Adobe 奥多比 Photoshop 2023 中国摄影计划 正版套装 PS2023正版软件

Adobe 奥多比 Photoshop 2023 中国摄影计划 正版套装 PS2023正版软件