【问题标题】:Event listener for new emails to download attachments新电子邮件的事件侦听器以下载附件
【发布时间】:2021-10-14 11:39:38
【问题描述】:

我想出这个来为新电子邮件创建一个事件监听器以下载附件。

我将How do I trigger a macro to run after a new mail is received in Outlook? 与https://www.extendoffice.com/documents/outlook/3747-outlook-auto-download-save-attachments-to-folder.html 结合在一起

我无法在 Outlook 中使用宏创建规则,也无法在当前计算机上编辑注册表,因此我需要一种解决方法。

Private WithEvents Items As Outlook.Items
Private Sub Application_Startup()
    Dim olApp As Outlook.Application
    Dim objNS As Outlook.NameSpace
    Set olApp = Outlook.Application
    Set objNS = olApp.GetNamespace("MAPI")
    ' default local Inbox
    Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
    On Error GoTo ErrorHandler
    Dim Msg As Outlook.MailItem
    If TypeName(item) = "MailItem" Then
        Set Msg = item
        Dim strSubject As String
        strSubject = Msg.Subject
        If InStr(0, strSubject, "VBA Test") > 0 Then
            Dim oAttachment As Outlook.Attachment
            Dim sSaveFolder As String
            sSaveFolder = "F:\Jason - DataCopies"
            For Each oAttachment In Msg.Attachments
                oAttachment.SaveAsFile sSaveFolder & oAttachment.DisplayName
            Next
        End If
    End If
ProgramExit:
    Exit Sub
ErrorHandler:
    MsgBox Err.Number & " - " & Err.Description
    Resume ProgramExit
End Sub

【问题讨论】:

  • 错误信息是什么?
  • @FloLie 没有,邮件通过了,但附件没有保存
  • 你能在函数的开头放一个断点,只是为了测试它是否被调用?
  • 你把它放在ThisOutlookSession 部分了吗?
  • 它在那个部分@FloLie 但是,我只是尝试在其中放置一个断点并且它没有被调用,这很奇怪,因为它以前是

标签: vba outlook


【解决方案1】:

您似乎对Application 类的NewMailEx 事件感兴趣。对于 Microsoft Outlook 处理的每个收到的项目,此事件都会触发一次。该项目可以是几种不同的项目类型之一,例如MailItem、MeetingItem 或SharingItem。 EntryIDsCollection 字符串包含对应于该项目的条目 ID。

NewMailEx 事件在新邮件到达收件箱时以及在客户端规则处理发生之前触发。您可以使用EntryIDCollection 数组中返回的Entry ID 来调用NameSpace.GetItemFromID 方法并处理该项目。请谨慎使用此方法,以尽量减少对 Outlook 性能的影响。但是,根据客户端计算机上的设置,新邮件到达收件箱后,垃圾邮件过滤和将新邮件从收件箱移动到另一个文件夹的客户端规则等过程可能会异步发生。

Dim mail as Object

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    Set mail =  Application.GetNamespace("MAPI").GetItemFromID(EntryIDCollection)
End Sub

另一种可能的方法是连接到收件箱文件夹的ItemAdd 事件:

Private WithEvents Items As Outlook.Items
Private Sub Application_Startup()
    Dim olNs As Outlook.NameSpace
    Dim Inbox  As Outlook.MAPIFolder

    Set olNs = Application.GetNamespace("MAPI")
    Set Inbox = olNs.GetDefaultFolder(olFolderInbox)
    Set Items = Inbox.Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
    If TypeOf Item Is Outlook.MailItem Then
        Example Item ' call sub
    End If
End Sub

Public Sub Example(ByVal Item As Object)
    Debug.Print Item.Subject 
End Sub

【讨论】:

  • 看来你的第二组代码和我的方法差不多,是不是我的有问题?我尝试让 items_itemadd 成为一个单独的函数,但它仍然无法正常工作。我对如何实施您的第一个建议/该功能的确切作用也有些困惑。你觉得你能帮我澄清一下吗?
  • 您的代码没有用于事件处理程序的单独方法。
  • 修复成功了!但是现在我收到错误代码 5,无效的过程调用或参数
  • 注意,不同的对象类型可以传递给事件处理程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 2018-11-26
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多