我收到主题为“ ###自动传真”的电子邮件,其中“ ###”是可变数字位数。这些电子邮件中的每一个都必须转发到“ ###@mail2fax.com”。我正在寻找有关如何使其自动化的想法。
答案 0 :(得分:1)
您的补充“并且需要我在办公室”可能是一个问题。我是Outlook的家庭用户。如果我想在外出时执行Outlook的任何操作,则需要打开计算机。我假设您是Outlook Exchange用户。即使计算机已切换,您也可以留下在离开时也要遵守的说明。但是,出于安全原因,默认设置是您不能留下将邮件转发到公司外部的说明。据我了解,您需要将“自动传真”电子邮件转发给同事。由于我们希望使流程自动化,因此这不应该强加给您的同事。您需要创建规则和宏的版本并将其安装在同事的计算机上,但是如果我对这项功能的理解正确的话,这应该不会太困难。关键是,这不会成为答案的一部分。
VBA的一个困难是通常有几种方法可以达到相同的效果。如果您开发自己的VBA没关系;选择您喜欢的达到效果的方式并进行实验,直到您完全了解该喜欢的方式为止。但是,如果您寻求帮助或寻找有用的代码片段,则必须对实现效果的每种方法都有基本的了解,因为其他人不会共享您的收藏夹。您可能会发现必须先了解摘要的功能,然后再按照自己的方式进行重写。这段代码是使用我最喜欢的技术编写的。
编写宏来处理电子邮件时,您遇到两个问题:
有四种选择电子邮件的方法:
我相信方法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。然后注意,宏的第一条语句检查该项目是否为MailItem
(Class = olMail
)。使用方法1,用户可以选择MailItem
以外的其他内容。此检查可确保此用户错误不会导致宏出现问题。
接下来,宏将检查主题以“自动传真”或“自动传真”或“自动传真”或任何其他变体结尾。使用方法1,用户可以选择错误的MailItem
。使用方法3,每封电子邮件都会传递到宏。因此,检查它是否是要转发给传真服务的宏。
如果我预先决定要使用哪种选择方法,则无需执行所有这些检查。我认为能够更改选择方法值得进行额外的检查。
宏提取主题的前导字符。我不检查它们是否是数字,尽管如果重要的话可以添加这样的检查。
宏将为转发的电子邮件创建一个新的主题。我不知道您是否想要一个新的主题,但这证明了如果有帮助的话您可以做什么。
Set ItemNew = .Forward
创建要转发的项目。请注意,该语句在With
块内。这与Set ItemNew = ItemCrnt.Forward
相同。
宏然后在ItemNew
上工作。它将更改主题,清除现有收件人并添加新收件人,然后将新电子邮件另存为草稿。
宏的最后一条语句是您未要求的其他内容,但可能很有用。我创建了一个名为“传真”的文件夹,并将原始电子邮件移至该文件夹。这样可以保存原始电子邮件,而不会使您的收件箱混乱。
考虑ItemCrnt.Parent.Parent.Folders("Faxed")
。这是要将项目移动到的文件夹。我将属性链接在一起的方式可能看起来很奇怪,但是一旦您理解它就很简单。
ItemCrnt
是原始邮件。ItemCrnt.Parent
是ItemCrnt
的属性。许多对象都有父母。对于MailItem
,它是存放MailItem
的文件夹;即文件夹“收件箱”。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)
来调用该新宏。
这不是处理宏的最终版本,尽管它可能是今晚的最终版本。请:
Option Explicit
必须位于模块的顶部。第2部分
我在回答的第一部分结束时说,我不认为我的宏创建的电子邮件草稿令人满意。
对我来说,问题在于原始电子邮件的标题通常是“转发”标题:原始发件人,我的姓名,发送日期和主题。电子邮件的作者大概已经花了一些时间来创建电子邮件的文本,并且不希望这个无关的标题成为其文本的前缀。那么,如何阻止该标头包含在发送到“ mail2fax.com”的电子邮件中?
我的第一个想法是使用“复制”方法而不是“转发”方法。这确实给出了令人满意的外观,但是有点尴尬。使用语句Set ItemNew = ItemCrnt.Forward
,ItemNew
是准备完成的电子邮件草稿,可保存在“草稿”文件夹中或发送。但是对于语句Set ItemNew = ItemCrnt.Copy
,ItemNew
是收到的电子邮件,保存后将放置在“收件箱”文件夹中。我已经发送了一封复制的电子邮件,当它到达我的辅助电子邮件地址之一时,外观看起来令人满意。
我的第二个想法需要介绍。电子邮件可以具有三个正文:纯文本,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安装。您拥有我缺少的功能,因此看到的屏幕将不相同。但是,我的屏幕截图应该与您的截图足够相似才能有用。
选择这些“自动传真”电子邮件之一。在“主页”选项卡上,单击“规则”,然后单击“创建规则...”。您将看到一个这样的弹出窗口:
我在一个辅助帐户中创建了一封“自动传真”电子邮件,并将其发送给我的主帐户。这就是为什么我同时显示为发送者和接收者。由于我选择了“自动传真”电子邮件,因此将显示其主题。编辑此主题以删除前导数字。勾号将出现在要获取的主题旁边的框中:
单击“高级选项...”以打开此弹出窗口:
请注意,靠近顶部的一行中的主题尚未编辑。没关系;重要的是“步骤2”框中的值。请注意,如果在“步骤2”框中单击“自动传真”,则可以添加其他值。因此,如果其中一些电子邮件的主题稍有不同,则可以添加这些替代值。单击“下一步”以显示如下所示的弹出窗口:
靠近底部的是“运行脚本”。您将有更多选项,可能需要向下滚动才能看到此选项。单击此选项旁边的框。 “运行脚本”将出现在“步骤2”框中。在“步骤2”框中单击“运行脚本”。如果尚未启用宏,则会要求您“启用宏”。将出现一个新的弹出窗口,显示可以为此选项选择的所有宏。我有几个可能的宏,因此我不会向您显示我的列表。您应该只看到一个宏:ForwardAndMoveEmail
。要显示在此列表中,宏必须为Public
,第一个参数必须为MailItem
。选择ForwardAndMoveEmail
(如果未选中),然后单击“确定”。现在,“运行脚本”显示为“运行ForwardAndMoveEmail”。点击下一步”。您会弹出一个例外窗口,我认为这与您无关。单击“下一步”获得最终弹出窗口:
您可以点击“立即对“收件箱”中的邮件立即运行此规则”框,以转发任何已收到但尚未转发的“自动传真”电子邮件。点击“完成”。
“自动传真”规则现已生效,所有“自动传真”电子邮件都将自动转发。监视文件夹“传真”并检查预期的收件人已接收传真是个好主意。