如何根据收到的时间和主题行在新邮件中保存 Excel 附件?

Posted

技术标签:

【中文标题】如何根据收到的时间和主题行在新邮件中保存 Excel 附件?【英文标题】:How do I save Excel attachments in new mail based on both time received and subject line? 【发布时间】:2019-07-07 18:18:37 【问题描述】:

我对编码还很陌生。我想知道如何使用主题行关键字和收到的时间将特定的 Excel 附件保存在 Outlook 收件箱(“早间电子邮件”)中。

我每天都会收到五封新电子邮件,其中包含要保存到同一驱动器文件夹中的 Excel 附件。

收到的时间可以是昨晚也可以是今天凌晨。

所有五个文件的名称和接收时间都不同。

收件箱不为空。我不想保存我昨天或两周前保存的内容。

Sub SaveAttachments()

    Dim ol As Outlook.Application
    Dim ns As Outlook.Namespace
    Dim fol As Outlook.Folder
    Dim i As Object
    Dim mi As Outlook.MailItem
    Dim at As Outlook.Attachment

    Set ol = New Outlook.Application
    Set ns = ol.GetNamespace("MAPI")
    Set fol = ns.Folders(1).Folders("Morning Emails")

    For Each i In fol.Items

        If i.Class = olMail Then

            Set mi = i

            If mi.Attachments.Count > 0 Then
                For Each at In mi.Attachments
                    at.SaveAsFile "C:\Users\nader\OneDrive\Documents\" & _
                      at.Filename & Format(mi.ReceivedTime, " MM-DD-YYYY")
                Next at   
            End If

        End If

    Next i

End Sub

“尝试的操作失败;找不到对象”行:Set fol = ns.Folders(1).Folders("Morning Emails"),即使我在 Outlook 收件箱下创建了该子文件夹。

【问题讨论】:

【参考方案1】:

Set ol = New Outlook.Application

无需在代码中创建新的 Outlook 应用程序实例。使用 Application 属性在 Outlook VBA 宏中获取宿主应用程序实例。

我建议处理Application 类的NewMailEx 事件。对于 Microsoft Outlook 处理的每个收到的项目,此事件都会触发一次。该项目可以是几种不同的项目类型之一,例如MailItemMeetingItemSharingItemEntryIDsCollection 字符串包含对应于该项目的条目 ID。

NewMailEx 事件在新邮件到达收件箱时以及在客户端规则处理发生之前触发。您可以使用EntryIDCollection 数组中返回的Entry ID 来调用NameSpace.GetItemFromID 方法并处理该项目。

Private Sub outApp_NewMailEx(ByVal EntryIDCollection As String)    
      Dim itm as Object
      Set itm = NS.GetItemFromID(EntryIDCollection)
      Debug.Print "mail received"
      If itm.Class = olMail Then
        Dim it as Outlook.MailItem
        Set it = itm       
        if it.Subject = "your subject" then 
          If it.Attachments.Count > 0 Then
            For Each at In mi.Attachments
                at.SaveAsFile "C:\Users\nader\OneDrive\Documents\" & _
                    at.Filename & Format(mi.ReceivedTime, " MM-DD-YYYY")
            Next at
          End If
        End If
      End If
End Sub

【讨论】:

嗨尤金感谢您的回复。我将您的代码放在我的 Outlook 模块中(从 Private sub 到 end sub),然后我向我的收件箱发送了一封电子邮件,其中我在宏中设置的标题等于(例如,it.Subject == "Future Rates")但没有任何保存;事实上,代码不想让我设置它。Subject == 但只是 = ;还是没有做,有什么好的想法吗? 您必须添加NewMailEx 事件处理程序。在左侧列表框中选择Application,在右侧列表框中可以选择需要处理的事件。

以上是关于如何根据收到的时间和主题行在新邮件中保存 Excel 附件?的主要内容,如果未能解决你的问题,请参考以下文章

如何返回最近收到的电子邮件?

从新电子邮件中保存附件

如何在 Spring Integration 中轮询时根据主题过滤电子邮件

使 v-data-table 行在新选项卡中打开(vuetify)

计数行在 Codeigniter 中按 Id 包括 JSON

保存带有特定主题的传入电子邮件的附件