VBA 使用多标准从 Outlook 下载电子邮件附件

Posted

技术标签:

【中文标题】VBA 使用多标准从 Outlook 下载电子邮件附件【英文标题】:VBA to download email attachments from Outlook with multi Criteria 【发布时间】:2022-01-19 21:11:03 【问题描述】:

我正在尝试创建一个代码,从 excel 中的某些输入(日期、主题、电子邮件正文、邮箱、文件夹导航和导出到)中获取下载的某些电子邮件的附件。

我的问题是,即使代码获取了正确的邮箱和文件夹,并将附件下载到我想要的文件夹,它也没有获取日期、主题和电子邮件正文。整个目标是从日期开始的电子邮件中下载附件,电子邮件主题包含一些单词,电子邮件正文包含某些单词,但是我得到的是邮箱中所有电子邮件的附件。

这是我的代码(我尝试将 & 更改为 AND,但它甚至无法下载):

 Sub download_attachment()

 Dim olApp As Outlook.Application
 Dim olNS As Outlook.Namespace
 Dim olFolder As Outlook.MAPIFolder
 Dim olItem As Object
 Dim mailitem As Outlook.mailitem
 Dim olAtt As Outlook.Attachment 

 Dim Folder_Navigation As String
 Dim folders() As String
 Dim folderIndx As Long
 Dim dateFormat
 dateFormat = Format(Now, "dd.mm.yyyy")

 Set olApp = New Outlook.Application
 Set olNS = olApp.GetNamespace("MAPI")
 Set olFolder = olNS.folders([Sheet1].[Mailbox_Name].Text)
 Folder_Navigation = [Sheet1].[Folder_Navigation].Value
 folders = Split(Folder_Navigation, ";")

For folderIndx = LBound(folders) To UBound(folders)
Debug.Print folders(folderIndx)
 Set olFolder = olFolder.folders(folders(folderIndx))
 Next folderIndx

 For Each olItem In olFolder.Items
    If olItem.Class = olMail Then
        Set mailitem = olItem   

    Debug.Print mailitem.Subject
    Debug.Print mailitem.ReceivedTime

        If mailitem.ReceivedTime > [Sheet1].[Date].Value & _
          InStr(mailitem.Subject, [Sheet1].[Subject].Value) <> 0 & _
          InStr(mailitem.Body, [Sheet1].[Email_Body].Value) <> 0 Then
            For Each olAtt In mailitem.Attachments
                olAtt.SaveAsFile [Sheet1].[Export_To].Text & "\" & olAtt.Filename
            Next olAtt
        End If
    End If
 Next olItem

 Set olFolder = Nothing
 Set olNS = Nothing
 Set olApp = Nothing

 End Sub
```

【问题讨论】:

【参考方案1】:

首先,如代码所示,无需遍历文件夹中的所有项目:

For Each olItem In olFolder.Items
    If olItem.Class = olMail Then

相反,Outlook 对象模型提供Items 类的Find/FindNextRestrict 方法。因此,您将能够仅迭代与您的搜索条件相对应的项目。在以下文章中阅读有关这些方法的更多信息:

How To: Use Find and FindNext methods to retrieve Outlook mail items from a folder (C#, VB.NET) How To: Use Restrict method to retrieve Outlook mail items from a folder

例如,以下搜索条件可用于获取带有附件和包含关键字的主题的项目:

Filter = "@SQL=" & Chr(34) & "urn:schemas:httpmail:subject" & _
                   Chr(34) & " Like '%keyword%' AND " & _
                   Chr(34) & "urn:schemas:httpmail:hasattachment" & _
                   Chr(34) & "=1"

更多示例请查看VBA Outlook: Find specific attachment and save under different name 和Check for the senderEmailAddress。

您还可能会发现Application 类的AdvancedSearch 方法很有帮助。请参阅Advanced search in Outlook programmatically: C#, VB.NET 了解更多信息。

【讨论】:

您好@Eugene,感谢您的帮助!我显然是个菜鸟,但是据我了解,这些方法并没有按照我的需要从 excel 文件中获取值,或者如果是这样,我将非常感谢您的建议。另外,从我读到的Find/FindeNext,它不允许我搜索日期标准。 您需要获取单元格值并将其用于筛选 Outlook 中的项目。

以上是关于VBA 使用多标准从 Outlook 下载电子邮件附件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Access VBA 从 Outlook 获取附件

我想在 Excel 中使用 VBA 从 Office 365 Outlook 邮件中读取 SenderAddress?

使用 VBA 禁用 Outlook 安全设置

从excel vba发送outlook邮件

如何使用 VBA 从 Outlook 状态栏中删除 DASL 过滤器文本?

VBA Outlook SendUsingAccount 不返回任何内容