ItemAdd运行几次,然后停止工作,直到我重新启动Outlook

时间:2020-08-07 07:35:51

标签: vba events outlook

我想在每次收到新电子邮件时都运行一个代码。

以下代码在“ ThisOutlookSession”中

Public WithEvents oItems as Outlook.Items

Private Sub Application.Startup()
Set oItems = session.GetDefaultFolder(olFolderInbox).items
End sub

Private sub oItems_ItemAdd(ByVal item as object) 
Debug.print "New email detected" 
End sub

此代码可用于1-5个新电子邮件。之后,除非我关闭Outlook并重新打开,否则它不会执行。

好像oItems失去了与“会话”的连接。

2 个答案:

答案 0 :(得分:0)

您可以将其粘贴到ThisOutlookSession

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)

   Dim oNewMailItem As Outlook.MailItem
   Dim appNameSpace As Outlook.NameSpace
   
   Set appNameSpace = Application.Session
   
   Select Case appNameSpace.GetItemFromID(EntryIDCollection).Class
       Case Is = olMail
           Set oNewMailItem = appNameSpace.GetItemFromID(EntryIDCollection)
   End Select
   
End Sub

该事件返回对象ID,该对象ID用于获取对象。如果对象是电子邮件,则将其另存为本地变量。


或者,您可能不想“糊涂” ThisOutlookSession,因此您可以使用自定义类并将邮件公开为公共属性。

ThisOutlookSession中,您将拥有:

Public cNewMailEx As clsNewMailEx

Private Sub Application.Startup()
    Set cNewMailEx = New clsNewMailEx
End sub

在名为clsNewMailEx的类模块中,您将拥有:

Option Explicit

Private WithEvents olApp As Outlook.Application
Private pMailItem As Outlook.MailItem

Public Property Get NewMailItem() As Outlook.MailItem
    Set NewMailItem = pMailItem
End Property

Private Sub Class_Initialize()
   Set olApp = Outlook.Application
End Sub

Private Sub olApp_NewMailEx(ByVal EntryIDCollection As String)
   Dim appNameSpace As Outlook.NameSpace
   Set appNameSpace = Application.Session
   Select Case appNameSpace.GetItemFromID(EntryIDCollection).Class
       Case Is = olMail
           Set pMailItem = appNameSpace.GetItemFromID(EntryIDCollection)
   End Select
End Sub

现在,您可以在应用程序中的任何位置使用cNewMailEx.NewMailItem

检索新电子邮件。

答案 1 :(得分:0)

#include "jansson_config.h"是收件箱的首选。

对于其他文件夹,您可以运行NewMailEx而无需关闭Outlook。

Application_Startup中删除Private

1-您可以将Private Sub Application_Startup()分配给按钮。

2-要使您通常白天运行的现有代码中的手动调用Application_Startup的调用频率降低。