Vba 自动转发邮件

Vba 自动转发邮件,vba,outlook,Vba,Outlook,我收到主题为“自动传真”的电子邮件,其中“”是可变位数。每封邮件都必须转发至“@mail2fax.com”。我正在寻找如何实现自动化的想法。您添加的“而且需要我在办公室”可能是个问题。我是Outlook的家庭用户。如果我想让Outlook在我不在时执行任何操作,我需要保持计算机处于打开状态。我假定您是Outlook Exchange用户。即使您的计算机已被切换,您也可以在离开时留下将被遵守的指示。但是,出于安全原因,默认情况下,您不能在公司外部留下转发电子邮件的指示。据我所知,您需要将“自动传真

我收到主题为“自动传真”的电子邮件,其中“”是可变位数。每封邮件都必须转发至“@mail2fax.com”。我正在寻找如何实现自动化的想法。

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

VBA的一个困难是通常有几种方法可以达到相同的效果。如果您开发自己的VBA,这并不重要;选择你最喜欢的实现效果的方法,并进行实验,直到你完全理解你最喜欢的方法。但是,如果您寻求帮助或寻找有用的代码片段,您必须对实现效果的各种方法有基本的了解,因为其他人不会分享您最喜欢的方法。您可能会发现,您必须了解代码片段的作用,然后按照自己的方式重写它。这段代码是使用我最喜欢的技术编写的

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

您如何选择要处理的电子邮件? 您如何处理选定的电子邮件? 有四种选择电子邮件的方法:

用户选择一个或多个电子邮件,然后运行处理宏。 宏扫描一个或多个文件夹,查找具有特定特征的电子邮件,然后对其进行处理。 指示Outlook监视特定文件夹,并在每次新电子邮件到达该文件夹时运行宏。 您设置了一个规则来选择电子邮件作为到达,并将宏链接到该规则以处理它们。 我相信方法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
在这个阶段不要太担心这个宏。当您准备好开发下一封处理电子邮件时,请稍后进行研究。这是我很久以前写的一个宏。每次我想测试一个新的电子邮件处理宏时,我只需将语句Call Forward和MoveEmailItemCrnt更改为调用新的宏

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

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

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

我的问题是,原始电子邮件的标题是典型的“转发”标题:原始发件人、我的姓名、发送日期和主题。电子邮件的作者大概花了一些时间来创建电子邮件的文本,并且不希望这个不相关的标题作为他们文本的前缀。那么,我该如何阻止发送到“mail2fax.com”的电子邮件中包含此标题呢

我的第一个想法是使用方法“复制”而不是方法“转发”。这确实给了一个令人满意的外观,但有点尴尬。通过语句Set ItemNew=ItemCrnt.Forward,ItemNew是一封准备好完成的草稿电子邮件,保存在“Drafts”文件夹中或发送。但是使用语句Set ItemNew=ItemCrnt.Copy,我 temNew是一封收到的电子邮件,保存后会放在“收件箱”文件夹中。我已经发送了一封复制的电子邮件,当它到达我的第二个电子邮件地址时,外观看起来令人满意

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

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

在上述代码中,您将发现:

.Subject = Subject
' Clear existing recipient(s)
请将这两行替换为:

.Subject = Subject
.Body = ItemCrnt.Body
.HtmlBody = ItemCrnt.HtmlBody
' Clear existing recipients
通过此更改,草稿电子邮件将不会有“转发”标题

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

第三部分

请不要按照本部分中的说明操作,直到您确信宏Forward和MoveEmail创建的电子邮件是正确的。这一部分是关于自动化的过程,这样的电子邮件将被发送,而您没有任何机会检查或纠正之前,他们被发送

请对宏ForwardAndMoveEmail进行以下更改:

将Public Sub ForwardAndMoveEmailByRef ItemCrnt替换为对象

通过公共子转发并将EmailByRef ItemCrnt移动为MailItem

使用电子邮件选择方法1,可能很难但也可能选择非MailItems的项目。我将ItemCrnt的类型设置为Object,这样就不会导致错误。若要将宏与规则一起使用,ItemCrnt必须是MailItem

这些陈述现在是多余的:

If ItemCrnt.Class <> olMail Then
  ' Ignore item if it is not an email
  Exit Sub
End If   
你可以留下这些陈述,因为它们不会造成伤害。或者,您可以删除它们或在每条语句前面加上引号

替换。保存方式。发送

在我的系统上,我可以将宏附加到规则。如果你也能做到这一点,这将是最简单的方法。然而,一些IT部门认为将宏绑定到规则是安全风险并禁用它。如果发现无法将宏附加到规则,则必须尝试事件方法。如有必要,我将添加其他说明

下面的屏幕截图来自我的home Outlook安装。你有我缺少的功能,因此你看到的屏幕将不完全相同。然而,我的截图应该与你的截图足够相似,以便有用

选择其中一封“自动传真”电子邮件。在“主页”选项卡中,单击“规则”,然后单击“创建规则…”。您将获得如下弹出窗口:

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

单击“高级选项…”以获取此弹出窗口:

请注意,靠近顶部的行中的主题尚未编辑。这无关紧要;重要的是“步骤2”框中的值。请注意,如果单击“步骤2”框中的“自动传真”,则可以添加额外的值。因此,如果其中一些电子邮件的主题稍有不同,您可以添加这些可选值。单击“下一步”可获得如下弹出窗口:

底部是“运行脚本”。您将有更多选项,可能需要向下滚动才能看到此选项。单击此选项旁边的框。“运行脚本”将出现在“步骤2”框中。单击“步骤2”框中的“运行脚本”。如果尚未启用宏,系统将要求您启用宏。此时将出现一个新的弹出窗口,显示所有可能出现的宏 e选择此选项。我有几个可能的宏,所以我不会向您显示我的列表。您应该只看到一个宏:ForwardAndMoveEmail。要显示在此列表中,宏必须是公共的,并且第一个参数必须是MailItem。选择ForwardAndMoveEmail(如果未选中),然后单击“确定”。“运行脚本”现在显示为“向前运行并移动电子邮件”。单击“下一步”。您将得到一个弹出窗口,显示我认为与您无关的异常。单击“下一步”以获得最终弹出窗口:

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


“自动传真”规则现已生效,任何“自动传真”电子邮件都将自动转发。监视“传真”文件夹并检查目标收件人是否收到传真是一个好主意。

考虑在问题中添加适当的标签。您给出的示例可以通过规则轻松实现。如果主题=xxxxxx,则转发至yyyyyy@yyyyyyy这是一个容易创建的规则。如果你的要求比这更复杂,你需要扩展你的问题。这更复杂,因为我在邮件主题中有传真号码。我希望它被发送到一个类似“传真”的邮件中_number@mail2fax.com“。因此,它从主题中获取数字并将其传递给接收者。这不是预先知道的收件人。你不知道什么?您知道如何使用VBA转发电子邮件吗?我怀疑将宏附加到规则将是实现目标的最简单方法。你知道怎么做吗?
If ItemCrnt.Class <> olMail Then
  ' Ignore item if it is not an email
  Exit Sub
End If