【问题标题】:How to add Full Name of sender to file path for saving attachments?如何将发件人的全名添加到文件路径以保存附件?
【发布时间】:2019-07-28 21:55:34
【问题描述】:

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

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

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

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

所有路径都相同,除了示例中的全名 John Smith,在末尾。

Full Name 是 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

【问题讨论】:

  • 你说的是哪个联系人?发件人?
  • @EugeneAstafiev 联系人指的是 Outlook 中的我的联系人。
  • 如何从My Contacts文件夹中选择联系人?
  • @EugeneAstafiev 我需要一个可以应用于所有联系人的代码,然后为所有传入邮件运行脚本。我不需要选择联系人。它们已保存在 Outlook 中。
  • 您希望某人编写代码,在联系人文件夹中搜索电子邮件的发件人并返回相应的全名?

标签: vba outlook


【解决方案1】:

您问题中的子例程有一个MailItem 作为参数。它被设计为由另一个决定应该检查并可能处理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

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

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

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

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

【讨论】:

  • 感谢您的回答。我需要将附件保存到不在 Outlook 中的驱动器上的物理文件夹中。有没有办法可以使用全名属性来指定路径。除了最后两个单词是用户的全名之外,路径始终相同。
  • @Eugene SaveAsFile 将附件保存到光盘文件夹而不是 Outlook 文件夹。如果没有任何电子邮件属性提供您想要的路径名的最后一部分,则需要将电子邮件与联系人进行匹配,以便从中提取路径名。我用于调查MailItems 和ContactItems 属性的宏有帮助吗?
  • 我需要将附件保存到光盘文件夹。到某一点为止,路径是相同的。唯一的区别是最后两个词。如果学生姓名是 John Smith,而 John Smith 给我发了一篇论文,我需要将该论文自动下载到具有以下路径的文件夹:C:\Users\Me\Dropbox\School\Academic\All students\John Smith。跨度>
  • 您希望在哪里找到字符串“John Smith”?您的问题意味着您希望从电子邮件中的属性链接到学生的联系项目,并希望在那里找到字符串。我的宏是否有助于调查此链接?
【解决方案2】:

我找到了解决办法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2022-06-21
    相关资源
    最近更新 更多