Outlook ItemAdd успешно запускается несколько раз, затем перестает работать, а затем снова работает, когда я перезапускаю Outlook? - PullRequest
0 голосов
/ 07 августа 2020

Я хочу запускать код каждый раз, когда новое электронное письмо поступает в папку «Входящие» в 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 голосов
/ 07 августа 2020

NewMailEx является предпочтительной альтернативой для почтового ящика.

Для других папок вы можете запустить Application_Startup, не закрывая Outlook.

Удалить Private из Private Sub Application_Startup().

1 - вы можете назначить Application_Startup кнопке.

2 - сделать менее частый ручной вызов Application_Startup из существующего кода, который вы обычно запускаете в течение дня.

0 голосов
/ 07 августа 2020

Вы можете вставить это в 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

Событие возвращает идентификатор объекта, идентификатор объекта используется для получения объекта. Если объект является электронным письмом, он сохраняется как локальная переменная.

В качестве альтернативы, вы можете не захотеть «замутить» ThisOutlookSession, чтобы вы могли использовать настраиваемый класс и выставлять почту как свойство publi c.

В 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

...