none
Visual Basic for Applications (Outlook) RRS feed

  • Вопрос

  • Задача: необходимо обробатывать входящие сообщения Outlook.
    Решение: обработчик событий NewMail или NewMailEx

    Private Sub Application_NewMail()
    'какие-то действия требуещие время примерно 5-7 секунд.
    End Sub

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

    Вопрос: как обработать все письма, если в момент их получения еще не отработало событие предыдущего письма?

    Например: Если я отправляю 3 сообщения на почтовый адрес у которого есть обработчик следующего вида, то
    '=============================
    Private Sub Application_NewMail()
    MsgBox i
    i = i + 1
    End Sub
    '=============================
    выйдет диалог с цифрой 0 и если не нажать кнопку ОК, в тот момент когда придет 2 и 3 письмо, то 2 и 3го диалога не будет.
    25 октября 2011 г. 6:35

Ответы

  • Раз так выходит, то видимо ItemAdd вызывается тоже для всех писем, хотя странно, должено быть событие для каждого.

    По поводу NewMailEx - организуйте цикл как в примере, в котором обрабатываются все пришедшие письма за цикл обновления почты:

    Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) 
     
     Dim varEntryIDs 
     
     Dim objItem 
     
     Dim i As Integer 
     
     varEntryIDs = Split(EntryIDCollection, ",") 
     
     For i = 0 To UBound(varEntryIDs) 
     
     Set objItem = Application.Session.GetItemFromID(varEntryIDs(i)) 
     
     Debug.Print "NewMailEx " & objItem.Subject 
     
     Next 
     
    End Sub
    


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 27 октября 2011 г. 5:56
    26 октября 2011 г. 6:01

Все ответы

  • Здравствуйте.

    Как вы тестируете событие? Отправляете сначала одно письмо, потом обновляете почту в outlook, получаете событие и далее отправляете второе письмо и после обновляете почту? Или отправляете все письма, а затем обновляете почту?

    Событие NewMail происходит один раз после обновления почты, если пришло одно или больше писем.

    Чтобы получать событие для каждого письма попробуйте использовать ItemAdd Event


    Для связи [mail]
    25 октября 2011 г. 11:49
  • Добрый день.

    Смысл в следующем. На почту приходят сообщения, по событию NewMailEx вложения сообщения автоматически распечатываются. Все работает нормально, НО, есть ситуации когда одновременно приходят скажем сразу три письма, и тогда обрабатывается только первое письмо, а два остальных нет. Если событие как вы сказали происходит один раз после обновления почты, то все понятно, но пример описанный вами так же не работает.

    Допустим есть код (ниже) и приходят сразу три письма, опять же выходт один диалог с именем отправителя, почему нет 2го и 3го диалога???

    Dim myOlApp As New Outlook.Application
    Public WithEvents myOlItems As Outlook.Items

    Private Sub Application_Startup()
      Set myOlItems = myOlApp.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items
    End Sub

    Private Sub myOlItems_ItemAdd(ByVal Item As Object)
        Dim myOlMItem As Outlook.MailItem
        Dim myOlAtts As Outlook.Attachments
        Set myOlMItem = myOlApp.CreateItem(olMailItem)
        MsgBox myOlMItem.SenderName
    End Sub

    26 октября 2011 г. 5:35
  • Раз так выходит, то видимо ItemAdd вызывается тоже для всех писем, хотя странно, должено быть событие для каждого.

    По поводу NewMailEx - организуйте цикл как в примере, в котором обрабатываются все пришедшие письма за цикл обновления почты:

    Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) 
     
     Dim varEntryIDs 
     
     Dim objItem 
     
     Dim i As Integer 
     
     varEntryIDs = Split(EntryIDCollection, ",") 
     
     For i = 0 To UBound(varEntryIDs) 
     
     Set objItem = Application.Session.GetItemFromID(varEntryIDs(i)) 
     
     Debug.Print "NewMailEx " & objItem.Subject 
     
     Next 
     
    End Sub
    


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 27 октября 2011 г. 5:56
    26 октября 2011 г. 6:01
  • Так и сделал. Спасибо за помощь.

    27 октября 2011 г. 2:29