首页 > 解决方案 > 如何将发件人的全名添加到文件路径以保存附件?

问题描述

我需要将附件保存到基于发件人的文件夹中。

我有一个代码,我为 Outlook 中的每个联系人稍微复制和编辑,但我想避免手动执行此操作。

每个联系人都有自己的子文件夹,每个子文件夹名称对应于 Outlook 中的全名。

示例路径:C:\Users\me\Dropbox\School\Academic\All students\John Smith

除了示例中的全名 John Smith 之外,所有路径都相同。

全名是 Outlook 联系人中的全名,也是子文件夹的名称。

我需要一个包含适用于所有联系人的变量的路径。

Public Sub SaveAttachmentsToDisk(MItem As Outlook.MailItem)
    Dim oAttachment As Outlook.Attachment
    Dim sSaveFolder As String
    sSaveFolder = "C:\Users\me\Dropbox\School\Academic\All students\Full Name"
    For Each oAttachment In MItem.Attachments
    oAttachment.SaveAsFile sSaveFolder & oAttachment.DisplayName
    Next
End Sub

标签: vbaoutlook

解决方案


您问题中的子例程具有 aMailItem作为参数。它被设计为由另一个决定MailItem应该检查和处理的例程调用。如果没有其他例程,则无法使用您显示的例程。我不太了解您的问题,无法提供解决方案。相反,我提供了一些背景信息和指导,足以让您构建所需的宏。

有四种不同的方法可以选择MailItem宏进行处理:

  1. 用户在文件夹中选择一封或多封电子邮件,然后调用宏来检查这些电子邮件。
  2. 例程向上或向下扫描一个已知文件夹,检查其中的MailItems。
  3. 规则选择传入的电子邮件,“运行脚本”选项指定要运行的宏。
  4. 打开 Outlook 时自动运行的宏请求 Outlook 监视文件夹(例如收件箱)中的新项目,并在每次新项目到达时运行特定的宏。“新项目”是您可以询问 Outlook 监视器的众多事件之一。

大多数时候这四种方法是完全独立的;您必须选择最符合您当前要求的一个,而忽略其他的。话虽如此,我已经使用方法 1 选择了一封电子邮件,并将包含该电子邮件的文件夹标识为用户为方法 2 指定文件夹的简便方法。但是,这种混合和匹配这四种方法的机会很少。

我猜学生会将他们的作业通过电子邮件发送给您,您希望将其放入以该学生命名的光盘文件夹中。我怀疑方法 3 将是最合适的。

识别出一封电子邮件后,您想对照您的联系人对其进行检查。不清楚您希望如何执行该检查,可能是因为您不知道您的选择是什么。

如果我不知道某个特定功能,我会使用我最喜欢的搜索引擎搜索“Outlook VBA xxxxxxxx”。这通常会带来很多不同的网站。可能其中一个是 Microsoft 网站,其余的是来自问答网站的教程或相关问题。我觉得微软网站就像一本字典;它告诉我这个词的意思,但不告诉我如何使用它。其他网站就像小说,可能包含一个句子,其中包含我想要的单词,但没有给出对该单词的解释。我通常必须查看其他一些站点以了解该功能,然后查看 Microsoft 站点以获取正式定义。

查看为“Outlook VBA 联系人”找到的站点,我构建了这个宏:

Option Explicit
Sub DemoContacts()

  Dim FldrContacts As Outlook.Folder
  Dim InxF As Long

  ' Session.GetDefaultFolder(olFolderContacts) returns the default folder for contacts.
  ' On my system, Outlook does not use the default folder.  I had to look at "My
  ' Contacts" where a list told me that it saved my contacts in "OutlookOutlook".
  ' Note: "OutlookOutlook" is the name of a store.  A store is disc file in which
  ' Outlook stores emails, task, contacts and so on.

  'Set FldrContacts = Session.GetDefaultFolder(olFolderContacts)
  Set FldrContacts = Session.Folders("OutlookOutlook").Folders("Contacts")

  For InxF = 1 To FldrContacts.Items.Count
    With FldrContacts.Items(InxF)
      Debug.Print .Email1DisplayName & "   " & .Email1Address
    End With
  Next

End Sub

上面的宏为所选文件夹中的每个联系人显示两个属性。还有很多很多的属性,但我选择了我认为最有可能符合您要求的两个。有关方法和属性的完整列表,请参阅https://docs.microsoft.com/en-us/office/vba/api/outlook.contactitem

下一个宏,就像你的一样,被设计为由另一个例程调用。稍后我将讨论调用例程。

Public Sub OutSomeProperties(ItemCrnt As Outlook.MailItem)

  ' Outputs selected properties of a MailItem to the Immediate Window.

  ' The Immediate Window can only display about 200 rows before the older
  ' rows start scrolling off the top.  This means this routine is only
  ' suitable for displaying a small number of simple properties.  Add or
  ' remove properties as necessary to meet the current requirement.

  Dim InxA As Long
  Dim InxR As Long

  Debug.Print "=============================================="
  With ItemCrnt
    Debug.Print "  Created: " & .CreationTime
    Debug.Print " Receiver: " & .ReceivedByName
    Debug.Print " Received: " & .ReceivedTime
    For InxR = 1 To .Recipients.Count
      Debug.Print "Recipient: " & .Recipients(InxR)
    Next
    Debug.Print "   Sender: " & .Sender
    Debug.Print " SenderEA: " & .SenderEmailAddress
    Debug.Print " SenderNm: " & .SenderName
    Debug.Print "   SentOn: " & .SentOn
    Debug.Print "  Subject: " & .Subject
    Debug.Print "       To: " & .To
    If .Attachments.Count > 0 Then
      Debug.Print "Attachments:"
      For InxA = 1 To .Attachments.Count
        Debug.Print "    " & InxA & ": " & .Attachments(InxA).DisplayName
      Next
    End If
  End With

End Sub

第二个宏显示电子邮件的选定属性。

这两个宏背后的想法是,您可以发现与 a 的属性之一MailItem匹配的 a 的属性,ContactItem以便您可以链接它们。我的猜测是 aContactItemEmail1Address匹配MailItema SenderEmailAddress

这是一个可能的调用例程:

Public Sub InvestigateEmails()

  ' Outputs all or selected properties of one or more emails.

  Dim Exp As Explorer
  Dim ItemCrnt As MailItem

  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
  Else
    For Each ItemCrnt In Exp.Selection
      If ItemCrnt.Class = olMail Then
        Call OutSomeProperties(ItemCrnt)
      End If
    Next
  End If

End Sub

此宏使用方法 1 选择要处理的电子邮件。也就是说,用户选择一封或多封电子邮件,然后调用此宏来处理它们。我发现这是开发新电子邮件处理宏的最简单方法。我可以选择一封简单的电子邮件并单步执行宏来检查它如何处理电子邮件。然后,我可以逐步选择更复杂的电子邮件,直到宏可以处理任何复杂程度令我满意的电子邮件。

请注意,签名和图像可以记录为 VBA 的附件,但不能记录为用户。您将需要识别那些您想要保存的附件和那些您不想保存的附件。

发件人是否重复使用姓名?如果 John Smith 总是将他的附件命名为“MyHomework.docx”,SaveAsFile则会在没有警告的情况下覆盖以前的作业。如果您不想覆盖以前的作业,则必须以某种方式使文件名唯一。

我建议的方法是:

  • 使用宏DemoContacts来研究 a 的属性ContactItem
  • 使用宏InvestigateEmailsOutSomeProperties来研究 a 的属性MailItem
  • 确定允许您将联系人与电子邮件匹配的属性,并确定您需要从联系人中提取的属性。
  • 启动一个名为SaveStudentHomework. 不要使用像SaveAttachmentsToDisk. 今天你正在保存作业附件。几个月后,您可能会保存不同类型的附件。你会怎么称呼那个宏?如果您为宏命名,则不太可能需要更改这些名称。新宏的声明应该Public Sub SaveStudentHomework (ItemCrnt As Outlook.MailItem)允许它与规则一起使用或作为事件例程使用。
  • 此宏的第一个版本应该从电子邮件中提取要与联系人匹配的属性。遍历联系人并搜索匹配的联系人。用于Debug.Print确认成功。
  • 您现在有了构建路径名的信息SaveAsFile。如有必要,使用唯一名称保存所需的附件。
  • 一旦SaveStudentHomework工作令您满意,创建一个规则并使用“运行脚本”链接宏。

推荐阅读