自动转发邮件

时间:2018-12-30 19:43:33

标签: outlook-vba

我收到主题为“ ###自动传真”的电子邮件,其中“ ###”是可变数字位数。这些电子邮件中的每一个都必须转发到“ ###@mail2fax.com”。我正在寻找有关如何使其自动化的想法。

1 个答案:

答案 0 :(得分:1)

您的补充“并且需要我在办公室”可能是一个问题。我是Outlook的家庭用户。如果我想在外出时执行Outlook的任何操作,则需要打开计算机。我假设您是Outlook Exchange用户。即使计算机已切换,您也可以留下在离开时也要遵守的说明。但是,出于安全原因,默认设置是您不能留下将邮件转发到公司外部的说明。据我了解,您需要将“自动传真”电子邮件转发给同事。由于我们希望使流程自动化,因此这不应该强加给您的同事。您需要创建规则和宏的版本并将其安装在同事的计算机上,但是如果我对这项功能的理解正确的话,这应该不会太困难。关键是,这不会成为答案的一部分。

VBA的一个困难是通常有几种方法可以达到相同的效果。如果您开发自己的VBA没关系;选择您喜欢的达到效果的方式并进行实验,直到您完全了解该喜欢的方式为止。但是,如果您寻求帮助或寻找有用的代码片段,则必须对实现效果的每种方法都有基本的了解,因为其他人不会共享您的收藏夹。您可能会发现必须先了解摘要的功能,然后再按照自己的方式进行重写。这段代码是使用我最喜欢的技术编写的。

编写宏来处理电子邮件时,您遇到两个问题:

  • 您如何选择要处理的电子邮件?
  • 您如何处理选定的电子邮件?

有四种选择电子邮件的方法:

  1. 用户选择一封或多封电子邮件,然后运行处理宏。
  2. 宏会扫描一个或多个文件夹以查找具有特定特征的电子邮件,然后对其进行处理。
  3. 您指示Outlook监视特定文件夹,并在每次新电子邮件到达该文件夹时运行一个宏。
  4. 您设置了一个规则以选择电子邮件作为到达邮件,并将宏链接到该规则以进行处理。

我相信方法4将是实现您的要求的最简单方法。但是,它可能不可用。它在我的系统上可以正常运行,但是显然负责Outlook Exchange安装的人员可以禁止它。如果方法4对您不起作用,我相信方法3将是次佳的方法。但是,此答案将使用方法1。

每当我开发一个新的电子邮件处理宏时,我都会使用方法1。如果可以完全控制以什么顺序处理哪些电子邮件。我可以从简单的电子邮件开始,然后可以一次又一次地针对同一封电子邮件运行宏,直到使宏按照我想要的方式工作。对宏满意后,可以切换到其他最合适的方法。

这是我的处理宏的第一个版本:

Public Sub ForwardAndMoveEmail(ByRef ItemCrnt As Object)

  Dim FaxNum As String
  Dim ItemNew As MailItem
  Dim Subject As String

  If ItemCrnt.Class <> olMail Then
    ' Ignore item if it is not an email
    Exit Sub
  End If

  Subject = ItemCrnt.Subject
  If LCase(Right$(Subject, 9)) = " auto fax" Then
    ‘ Only process email if the subject ends with case-insensitive " auto fax"
    FaxNum = Mid$(Subject, 1, Len(Subject) - 9)
    With ItemCrnt
      Subject = "Fax from " & .Sender & " (" & .SenderEmailAddress & ")"
      Set ItemNew = .Forward
    End With
    With ItemNew
      .Subject = Subject
      ' Clear existing recipient(s)
      Do While .Recipients.Count > 0
        .Recipients.Remove (1)
      Loop
      .Recipients.Add FaxNum & "@mail2fax.com"
      .Save
    End With
  End If

  ItemCrnt.Move ItemCrnt.Parent.Parent.Folders("Faxed")

End Sub

要处理的项目是此宏的参数。请注意,我已将其键入为对象而不是MailItem。然后注意,宏的第一条语句检查该项目是否为MailItemClass = olMail)。使用方法1,用户可以选择MailItem以外的其他内容。此检查可确保此用户错误不会导致宏出现问题。

接下来,宏将检查主题以“自动传真”或“自动传真”或“自动传真”或任何其他变体结尾。使用方法1,用户可以选择错误的MailItem。使用方法3,每封电子邮件都会传递到宏。因此,检查它是否是要转发给传真服务的宏。

如果我预先决定要使用哪种选择方法,则无需执行所有这些检查。我认为能够更改选择方法值得进行额外的检查。

宏提取主题的前导字符。我不检查它们是否是数字,尽管如果重要的话可以添加这样的检查。

宏将为转发的电子邮件创建一个新的主题。我不知道您是否想要一个新的主题,但这证明了如果有帮助的话您可以做什么。

Set ItemNew = .Forward创建要转发的项目。请注意,该语句在With块内。这与Set ItemNew = ItemCrnt.Forward相同。

宏然后在ItemNew上工作。它将更改主题,清除现有收件人并添加新收件人,然后将新电子邮件另存为草稿。

宏的最后一条语句是您未要求的其他内容,但可能很有用。我创建了一个名为“传真”的文件夹,并将原始电子邮件移至该文件夹。这样可以保存原始电子邮件,而不会使您的收件箱混乱。

考虑ItemCrnt.Parent.Parent.Folders("Faxed")。这是要将项目移动到的文件夹。我将属性链接在一起的方式可能看起来很奇怪,但是一旦您理解它就很简单。

  • ItemCrnt是原始邮件。
  • ItemCrnt.ParentItemCrnt的属性。许多对象都有父母。对于MailItem,它是存放MailItem的文件夹;即文件夹“收件箱”。
  • `ItemCrnt.Parent.Parent是文件夹“收件箱”的属性。对于文件夹,其父文件夹是包含该文件夹的文件夹。由于文件夹“收件箱”是顶级文件夹,因此其父文件夹是保存该文件夹的商店。 “存储”是Outlook在其中存储文件夹,邮件项目,日历项目,任务和许多其他内容的文件。
  • 一直到商店,ItemCrnt.Parent.Parent.Folders("Faxed")一直到商店内的文件夹。

调用ForwardAndMoveEmail的宏为:

Option Explicit
Sub SelectEmailsUser()

  Dim Exp As Explorer
  Dim ItemCrnt As Object
  Dim MailItemCrnt As Object

  Set Exp = Outlook.Application.ActiveExplorer

  If Exp.Selection.Count = 0 Then
    Call MsgBox("Please select one or more emails then try again", vbOKOnly)
    Exit Sub
  End If
  For Each ItemCrnt In Exp.Selection
    If ItemCrnt.Class = olMail Then
      Call ForwardAndMoveEmail(ItemCrnt)
    End If
  Next

End Sub

在此阶段,不必太担心此宏。当您准备开发下一封处理电子邮件时,请稍后进行研究。这是我很久以前写的宏。每次我想测试一个新的电子邮件处理宏时,我只需更改语句Call ForwardAndMoveEmail(ItemCrnt)来调用该新宏。

这不是处理宏的最终版本,尽管它可能是今晚的最终版本。请:

  • 将两个宏复制到Outlook模块。这两个宏可以采用任何顺序,但是Option Explicit必须位于模块的顶部。
  • 创建“传真”文件夹。与文件夹“收件箱”处于同一级别。
  • 选择一个或多个“自动传真”电子邮件并运行宏SelectEmailsUser。
  • 检查已处理的“自动传真”电子邮件现在位于“传真”文件夹中。
  • 查看“草稿”文件夹中的电子邮件。我认为这些电子邮件并不令人满意。我会告诉您为什么以后以及我认为您应该怎么做才能使它们令人满意。

第2部分

我在回答的第一部分结束时说,我不认为我的宏创建的电子邮件草稿令人满意。

对我来说,问题在于原始电子邮件的标题通常是“转发”标题:原始发件人,我的姓名,发送日期和主题。电子邮件的作者大概已经花了一些时间来创建电子邮件的文本,并且不希望这个无关的标题成为其文本的前缀。那么,如何阻止该标头包含在发送到“ mail2fax.com”的电子邮件中?

我的第一个想法是使用“复制”方法而不是“转发”方法。这确实给出了令人满意的外观,但是有点尴尬。使用语句Set ItemNew = ItemCrnt.ForwardItemNew是准备完成的电子邮件草稿,可保存在“草稿”文件夹中或发送。但是对于语句Set ItemNew = ItemCrnt.CopyItemNew是收到的电子邮件,保存后将放置在“收件箱”文件夹中。我已经发送了一封复制的电子邮件,当它到达我的辅助电子邮件地址之一时,外观看起来令人满意。

我的第二个想法需要介绍。电子邮件可以具有三个正文:纯文本,HTML或RTF。我从未见过包含RTF(富文本格式)正文的电子邮件。如果您想要更多纯文本格式,RTF可能是20年前的明智格式。但是如今,HTML是如此强大,以至于可以在大型PC屏幕,平板电脑或智能手机上重新排列同一封电子邮件,因此始终很容易阅读。因此,出于所有实际目的,电子邮件只有两种格式:纯文本和HTML。如果电子邮件同时具有纯文本和HTML正文,则向读者显示的是HTML正文。 VBA程序员可以查看其中一个或两个主体,但是不会告诉读者存在纯文本主体。我偶尔会看到精心构造的纯文本主体,该主体是为无法处理HTML的电子邮件软件包而设计的。但是通常,纯文本主体只是去除了HTML标签的HTML主体。

我的第二个想法是使用“转发”方法,然后从原始电子邮件中复制文本和HTML正文。

在上面的代码中,您将找到:

.Subject = Subject
' Clear existing recipient(s)

请将这两行替换为:

.Subject = Subject
.Body = ItemCrnt.Body
.HtmlBody = ItemCrnt.HtmlBody
' Clear existing recipients

此更改后,电子邮件草稿将没有“转发”标题。

我假设您知道这些电子邮件是传真给谁的。我建议您联系一两个,并说您要进行实验。由于您使用键盘界面转发这些电子邮件,因此他们将已经收到传真。发送一些由我的宏创建的电子邮件草稿,并征求收件人对新外观的看法。如果他们喜欢新外观,我们将准备进入第3阶段:自动处理这些电子邮件。如果他们不喜欢新外观,则需要问他们新外观有什么问题,我们将不得不尝试解决问题。

第3部分

在确信由宏ForwardAndMoveEmail创建的电子邮件应该是正确的之前,请不要遵循本部分中的说明。这部分是关于流程的自动化,因此将在您没有任何机会检查或更正电子邮件之前发送电子邮件。

请对宏ForwardAndMoveEmail进行以下更改:

替换Public Sub ForwardAndMoveEmail(ByRef ItemCrnt As Object)

通过Public Sub ForwardAndMoveEmail(ByRef ItemCrnt As MailItem)

使用电子邮件选择方法1,可以(困难,但可能)选择非MailItems的项目。我将ItemCrnt的类型设置为Object,所以这不会引起错误。要将宏与规则配合使用,ItemCrnt必须为MailItem

这些语句现在是多余的:

If ItemCrnt.Class <> olMail Then
  ' Ignore item if it is not an email
  Exit Sub
End If   

您可以保留这些声明,因为它们不会造成伤害。另外,您可以删除它们或在每个语句的前面加上引号。

.Save替换为.Send

在我的系统上,我可以将宏附加到规则。如果您可以这样做,那将是最简单的方法。但是,某些IT部门认为将宏附加到规则是一种安全风险,然后将其禁用。如果发现无法将宏附加到规则,则必须尝试事件方法。如有必要,我将添加其他说明。

以下屏幕截图来自我的家庭Outlook安装。您拥有我缺少的功能,因此看到的屏幕将不相同。但是,我的屏幕截图应该与您的截图足够相似才能有用。

选择这些“自动传真”电子邮件之一。在“主页”选项卡上,单击“规则”,然后单击“创建规则...”。您将看到一个这样的弹出窗口:

First screen of Create a rule

我在一个辅助帐户中创建了一封“自动传真”电子邮件,并将其发送给我的主帐户。这就是为什么我同时显示为发送者和接收者。由于我选择了“自动传真”电子邮件,因此将显示其主题。编辑此主题以删除前导数字。勾号将出现在要获取的主题旁边的框中:

First screen of Create a rule after editing

单击“高级选项...”以打开此弹出窗口:

Second screen of Create a rule

请注意,靠近顶部的一行中的主题尚未编辑。没关系;重要的是“步骤2”框中的值。请注意,如果在“步骤2”框中单击“自动传真”,则可以添加其他值。因此,如果其中一些电子邮件的主题稍有不同,则可以添加这些替代值。单击“下一步”以显示如下所示的弹出窗口:

Third screen of Create a rule

靠近底部的是“运行脚本”。您将有更多选项,可能需要向下滚动才能看到此选项。单击此选项旁边的框。 “运行脚本”将出现在“步骤2”框中。在“步骤2”框中单击“运行脚本”。如果尚未启用宏,则会要求您“启用宏”。将出现一个新的弹出窗口,显示可以为此选项选择的所有宏。我有几个可能的宏,因此我不会向您显示我的列表。您应该只看到一个宏:ForwardAndMoveEmail。要显示在此列表中,宏必须为Public,第一个参数必须为MailItem。选择ForwardAndMoveEmail(如果未选中),然后单击“确定”。现在,“运行脚本”显示为“运行ForwardAndMoveEmail”。点击下一步”。您会弹出一个例外窗口,我认为这与您无关。单击“下一步”获得最终弹出窗口:

Final screen of Create a rule

您可以点击“立即对“收件箱”中的邮件立即运行此规则”框,以转发任何已收到但尚未转发的“自动传真”电子邮件。点击“完成”。

“自动传真”规则现已生效,所有“自动传真”电子邮件都将自动转发。监视文件夹“传真”并检查预期的收件人已接收传真是个好主意。