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

2019-02-15 20:31:00 242点赞 2283收藏 81评论

大家好,我是太空铁。

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年)开始学编程,初高中寒暑假都会写个程序,可惜后来上班却没怎么干过编程的工作,这是第一次写编程的文章,请大家给来个一条龙,点赞+收藏+吐槽

展开 收起

WPS超级会员PRO套餐1年pdf转换PPT模板官方正版大会员office办公

WPS超级会员PRO套餐1年pdf转换PPT模板官方正版大会员office办公

254.6元起

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

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

暂无报价

wps超级会员7天周卡PDF编辑器excel工具PPT官方正版

wps超级会员7天周卡PDF编辑器excel工具PPT官方正版

5.99元起

Adobe 奥多比 中国摄影计划 买2年赠1年

Adobe 奥多比 中国摄影计划 买2年赠1年

888元起

宝满 PPT2019视频教程 幻灯片2016演示动画商务office办公课程教学网课

宝满 PPT2019视频教程 幻灯片2016演示动画商务office办公课程教学网课

19.8元起

圈外同学 高效表达训练营7天入门

圈外同学 高效表达训练营7天入门

暂无报价

WPS 2016全套 视频课程

WPS 2016全套 视频课程

暂无报价

圈外同学 数据分析师企业实训项目 GrowingIO增长营销方向1月班

圈外同学 数据分析师企业实训项目 GrowingIO增长营销方向1月班

5999元起

Excel 零基础 2016全套 视频课程

Excel 零基础 2016全套 视频课程

暂无报价

圈外同学 数据分析实战训练营

圈外同学 数据分析实战训练营

1元起

沪江网校 微软MOS认证专业级Word+Excel+PPT【学霸班】

沪江网校 微软MOS认证专业级Word+Excel+PPT【学霸班】

暂无报价

Office办公软件 全套 视频课程

Office办公软件 全套 视频课程

暂无报价

WPS 金山软件 超级会员Pro 4年卡

WPS 金山软件 超级会员Pro 4年卡

678元起
81评论

  • 精彩
  • 最新
  • 张大妈都开始教写代码了吗 [喜极而泣]

    校验提示文案

    提交
    编程是年轻一代必会技能之一,就好像会Office一样

    校验提示文案

    提交
    收起所有回复
  • 天天邮件几百封,规则设置了几十个,就怕不按套路出牌的,标题随便写。找起来也真是费劲。。

    校验提示文案

    提交
    能过滤一些就好,

    校验提示文案

    提交
    收起所有回复
  • 我是真不想用outlook 集团内邮必须用它 没办法

    校验提示文案

    提交
    outlook是比较慢

    校验提示文案

    提交
    那是该更新设备了。十五年outlook用户觉得一点都不慢,而且非常好用。

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • 不懂vba的怎么破

    校验提示文案

    提交
    从我这说起

    校验提示文案

    提交
    VBA挺简单的

    校验提示文案

    提交
    收起所有回复
  • 为什么要把所有发件人都分类出来。。。。每次看到有人这么分我就目瞪口呆。

    校验提示文案

    提交
    你看见过多少次了?

    校验提示文案

    提交
    好几个同事都用的这种方法,每次她们让我帮忙弄电脑,被我看到我都吐槽~ 不过这个只能说个人习惯吧,反正我是觉得效率不高。

    校验提示文案

    提交
    还有10条回复
    收起所有回复
  • 能给个左边工程总览图就好了,因为这些写在一个module里还是分开呢?有几个问题想请教,1,public sub就是定义一个全局sub,但是直接写一个sub好像也可以互相调用,所以走什么区别吗?2,Outlook的vba复用过程比较麻烦,导出导入,如果把其转为控件,如何解决?需用vs吗?3,虽然改了VBe的颜色,但是可以用vs或者vsc开发吗?如何像VBe一样交互?

    校验提示文案

    提交
    工程的树形图有的,在二、1、第三张图就是。1、没区别,两者是等价的,具体可以百度一下。2、转成控件或者宏没弄过,不会,但应该不难弄吧。3、没太明白你的意思,就编辑器来说,自然什么编辑器都行,但是还有个调试的问题,你总不能在VS里写代码,然后把代码拷贝到VBe里,再调试吧?

    校验提示文案

    提交
    收起所有回复
  • 太高深了,请问如何实现自由拖动排序?

    校验提示文案

    提交
    这个不会,得查文档

    校验提示文案

    提交
    收起所有回复
  • 一看到代码,就知道牛*!

    校验提示文案

    提交
    从哪看出来的?

    校验提示文案

    提交
    收起所有回复
  • 请问,outlook收不到交行的账单能解决吗?网上挺多人有这个问题的。

    校验提示文案

    提交
    这跟Outlook有关么?原始邮箱收得到么?

    校验提示文案

    提交
    收起所有回复
  • 大佬,如何获取新建还未发出去的邮件的内容,标题等这些信息?

    校验提示文案

    提交
    这个我没弄过,但是VBA的类库里应该可以遍历当前的窗口,你可以再查查文档。如果不行的话,那就跳出VBA,用VC或者C#之类,遍历当前窗口(可能会用到Windows的API),找这些窗口的信息。

    校验提示文案

    提交
    收起所有回复
  • 大佬,有幸看到帖子。我现在每天处理邮件太多,怎么实现半自动分类发送,你的帖子应该可以满足吧?有没有联系方式? [喜极而泣]

    校验提示文案

    提交
    站内不支持发送联系方式,发了就会被删掉的

    校验提示文案

    提交
    收起所有回复
  • 我们公司现在也需要这个功能,怎么能联系到你***

    校验提示文案

    提交
    微博同名的

    校验提示文案

    提交
    收起所有回复
  • Vb用得好,老婆回家早 [赞一个]

    校验提示文案

    提交
  • 试一下google的inbox,智能分类,太赞了有没有!

    校验提示文案

    提交
    自从第一波用上1g的gmail再也没有碰过杀千刀的outlook。outlook吐槽三天三夜都吐不完。 [喜极而泣]

    校验提示文案

    提交
    gmail能编程么?

    校验提示文案

    提交
    还有7条回复
    收起所有回复
  • 其实不用分类,搜索功能足够了

    校验提示文案

    提交
  • foxmail很不错。,,

    校验提示文案

    提交
    foxmail可能是腾讯为数不多的良心产品。

    校验提示文案

    提交
    foxmail为什么导入gmail老说我邮箱账号密码错误是怎么回事,能开的我都开了 [疑问]

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • 源代码文章最后没找到啊 [皱眉]

    校验提示文案

    提交
  • 你的同事都是狠人啊

    校验提示文案

    提交
  • outlook怎么安装,我的是office是基础版

    校验提示文案

    提交
    我也想知道,难道是企业买?还是盗#版?

    校验提示文案

    提交
    收起所有回复
  • 评论中用Google和outlook比是什么操作?工作中一年需要处理几千封邮件,outlook可以让我处理私人邮件和工作邮件,gmail是没法比的

    校验提示文案

    提交
    只有适不适合,gmail也很强大。

    校验提示文案

    提交
    收起所有回复
提示信息

取消
确认
评论举报

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
2.2K
扫一下,分享更方便,购买更轻松