【问题标题】:Trigger a macro after a new mail is received收到新邮件后触发宏
【发布时间】:2020-06-25 15:35:21
【问题描述】:

我有一个宏,它会提示您在发送电子邮件之前将其保存到指定文件夹,但我无法让该宏用于接收电子邮件。

这是我用来发送电子邮件的:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    If TypeOf Item Is Outlook.MailItem Then
      Cancel = Not SaveSentMail(Item)
    End If
End Sub

Private Function SaveSentMail(Item As Outlook.MailItem) As Boolean
    Dim F As Outlook.MAPIFolder

    If Item.DeleteAfterSubmit = False Then
        Set F = Application.Session.PickFolder
        If Not F Is Nothing Then
            Set Item.SaveSentMessageFolder = F
            SaveSentMail = True
        End If
    End If
End Function

【问题讨论】:

标签: vba email outlook


【解决方案1】:

使用 Application.Startup Event (Outlook)Items.ItemAdd Event (Outlook)

Items.ItemAdd Event (Outlook) 在将一个或多个项目添加到指定集合时发生。一次将大量项目添加到文件夹时不会运行此事件。此事件在 Microsoft Visual Basic 脚本版 (VBScript) 中不可用。


Application.Startup Event (Outlook) 在 Microsoft Outlook 启动时发生,但在所有加载项程序都已加载之后。


代码示例

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)
    Dim Folder As Outlook.MAPIFolder

    If TypeOf Item Is Outlook.mailitem Then
        Set Folder = Application.Session.PickFolder
        If Folder Is Nothing Then Exit Sub
        Item.Move Folder
    End If

End Sub

【讨论】:

    【解决方案2】:

    您可以处理 Application 类的 NewMailEx 事件,该事件在新消息到达收件箱时以及发生客户端规则处理之前触发。您可以使用 EntryIDCollection 数组中返回的条目 ID 来调用 NameSpace.GetItemFromID 方法并处理该项目。请谨慎使用此方法,以尽量减少对 Outlook 性能的影响。

    请注意,对于拥有 Exchange Server 帐户(非缓存 Exchange 模式或缓存 Exchange 模式)的用户,只有在 Outlook 启动后到达服务器的邮件才会触发该事件。对于在 Outlook 启动后立即在缓存 Exchange 模式下同步的邮件,以及在 Outlook 在非缓存 Exchange 模式下启动时已经在服务器上的邮件,不会触发该事件。

    另一个可能的选项是处理Items 类的ItemAdd 事件,该事件在将一个或多个项目添加到指定集合时触发。请注意,当一次将大量项目(超过 16 个 - 这是 OOM 中的一个众所周知的问题)添加到文件夹时,此事件不会运行。

    更好的解决方案是使用计时器事件检查文件夹中的新项目。在以下文章中详细了解可能的解决方案:

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 2017-12-23
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 2010-10-10
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多