Как мне запустить макрос для запуска после получения новой почты в Outlook?

#vba #outlook #outlook-2019

#vba #outlook #триггеры

Вопрос:

Я пишу макрос, который создает заявки в базе данных на основе оповещений, полученных с сервера Nagios по электронной почте. Однако я не могу позволить макро запускаться в бесконечном цикле при проверке почты, потому что он слишком ресурсоемкий и заставляет мой рабочий стол зависать. Мне нужно найти способ запускать макрос только при получении новой почты.

Я искал что-то вроде событий NewMail на веб-сайте MSDN, но не могу найти ничего связного. Может кто-нибудь показать мне немного примера кода, чтобы показать, как запускать макросы из событий новой почты?

Ответ №1:

Этот код добавит прослушиватель событий в локальный почтовый ящик по умолчанию, а затем выполнит некоторые действия с входящими электронными письмами. Вам нужно добавить это действие в приведенный ниже код.

 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 
End Sub
Private Sub Items_ItemAdd(ByVal item As Object) 

  On Error Goto ErrorHandler 
  Dim Msg As Outlook.MailItem 
  If TypeName(item) = "MailItem" Then
    Set Msg = item 
    ' ******************
    ' do something here
    ' ******************
  End If
ProgramExit: 
  Exit Sub
ErrorHandler: 
  MsgBox Err.Number amp; " - " amp; Err.Description 
  Resume ProgramExit 
End Sub
 

После вставки кода в ThisOutlookSession module необходимо перезапустить Outlook.

Комментарии:

1. Мой плохой, отключил макросы. Немного глупо, что для этого сценария не существует другого уровня безопасности макросов.

2. @JimmyPena Где вызывается Items_ItemAdd?

3. Работал с Outlook 2016

4. Работает для первых двух электронных писем в течение первых нескольких минут, а затем внезапно перестает запускаться. Есть идеи, почему?

5. У меня ничего не происходит

Ответ №2:

Попробуйте что-то подобное внутри ThisOutlookSession :

 Private Sub Application_NewMail()
    Call Your_main_macro
End Sub
 

Мой Outlook vba только что запустился, когда я получил электронное письмо и открыл это событие приложения.

Редактировать: я только что протестировал сообщение с сообщением hello world, и оно запустилось после вызова в application_newmail случае получения электронного письма.

Комментарии:

1. Боюсь, это, похоже, не работает. Я попытался запустить макрос, а затем отправить себе письмо, но я не мог запустить свой макрос, пока не инициализировал все заново. Как вы думаете, в чем может быть проблема?

2. Откуда у вас код в моем ответе? Я поместил его ThisOutlookSession и оставил. Нет необходимости запускать макрос, который запускается при получении почты.

3. Я тоже вставил его в ThisOutlookSession, но это доставляет мне много проблем во время запуска. Я даже не могу указать на корень проблемы, мой сабвуфер просто делает совершенно случайные вещи…

4. Если вы вставите что-то вроде этого в раздел «сделать что-то здесь»: Call Your_main_macro , я обнаружил, что макрос должен храниться в том же модуле, ThisOutlookSession . Если это было в другом модуле, я получил сообщение об ошибке. Мне пришлось перезапустить Outlook, чтобы любые изменения вступили в силу.