Последовательный процесс правил Outlook

Я использую правило Outlook для обработки входящей почты с помощью макроса VBA. в vba запускаются различные действия для обработки вложений входящей почты.

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

Мой метод я что-то вроде:

Есть ли способ добиться такого поведения?

Private Sub ProcessMail(ByVal Item As Object)
Dim objNS As Outlook.NameSpace
Set objNS = GetNamespace("MAPI")

If TypeOf Item Is Outlook.MailItem Then
    Dim Msg As Outlook.MailItem

        DoProcessingMethod 

    End If
End If

Конец сабвуфера

Установка ожидания или сна в методе не приводит к тому, что он обрабатывается один за другим.


person Arnoldiusss    schedule 01.12.2011    source источник
comment
Просмотр вашего кода может помочь :)   -  person brettdj    schedule 01.12.2011
comment
@brettdj Добавлена ​​схема метода   -  person Arnoldiusss    schedule 01.12.2011
comment
Я думаю, вам лучше использовать ItemAdd для запуска вашего кода в электронных письмах. Таким образом, код будет выполняться последовательно. В зависимости от правила отнимет управление от кода.   -  person JimmyPena    schedule 01.12.2011
comment
У Сью Мошер есть полезная ссылка здесь, посвященная вариантам обработки входящей электронной почты. NewMailEx event и ItemAdd кратко описаны   -  person brettdj    schedule 02.12.2011
comment
Вы можете реализовать свою собственную очередь ожидания. Это может быть коллекция, отсортированная по времени прибытия. Как только приходит почта, ваш обработчик правил проверяет, есть ли ожидающие сообщения. Если есть, новая почта помещается в конец очереди. Обработчик событий таймера используется для обработки ожидающих элементов. Из соображений безопасности я бы хранил почту во временной папке, чтобы предотвратить потерю данных.   -  person Axel Kemper    schedule 23.02.2014


Ответы (2)


ГД Арнольд,

Вы действительно можете использовать параметр ItemAdd в соответствии с ответом @Brett.

Я использую аналогичный процесс для автоматической загрузки полученных данных (в виде вложения в электронном письме) и загрузки их в базу данных MySQL. Действие запускается методом ItemAdd, и письма проверяются одно за другим.

Упрощенные инструкции:

Добавьте класс в свой код VBA с именем «EventClassModule».

В своем классе введите

Public WithEvents dItems As Outlook.Items

В вашем ThisOutlookSession создайте подпрограмму, которая регистрирует event_handler:

Sub Register_Event_Handler()

    Set myClass.dItems = Outlook.Items

End Sub

В вашем ThisOutlookSession создайте подпрограмму, которая обрабатывает событие ItemAdd, как показано ниже:

Private Sub dItems_ItemAdd(ByVal newItem As Object)

  On Error GoTo ErrorHandler
  Dim msg As Outlook.MailItem
  If newItem.Class = olMail Then
    Set msg = newItem
    'Do something with the msg item, check rules, check subject, check whatever
    'This will process messages when the arrive in your mailbox one by one.


  End If
ProgramExit:
  Exit Sub
ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description
  Resume ProgramExit
End Sub

Эти шаги должны предоставить вам подпрограмму, которая срабатывает при поступлении новой почты.

Затем вы можете вызвать функцию/подпрограмму, как показано ниже. Подпрограмма ниже запускает все правила на основе необязательной переменной ruleSet, она проверяет rule.Name на соответствие набору правил, и если строка ruleSet существует в rule.Name, то она выполняет некоторый код. Таким образом, вы можете иметь несколько правил и выполнять только некоторые из них в зависимости от того, частью какого «набора правил» они являются. Вы можете определить это, изменив их имя.

Это уточнение параметра «Правила запуска» в Outlook.

Часть этого кода взята отсюда: Настройка VBA для чтения личного почтового ящика

Sub runRules(Optional ruleSet As String)
    Dim olStore As Outlook.Store
    Dim myRules As Outlook.Rules
    Dim tmpInbox As Outlook.Folder
    Dim tmpSent As Outlook.Folder

    Dim rl As Outlook.Rule
    'On Error Resume Next
    'toTmpBox (ruleSet)

    ' get default store (where rules live)
    Set olStore = Application.Session.DefaultStore

    With olStore
        Set tmpInbox = .GetDefaultFolder(olFolderInbox) '.Folders("tmpInbox")
        Set tmpSent = .GetDefaultFolder(olFolderSentMail) '.Folders("tmpSentBox")
    End With

    ' get rules
    Set myRules = olStore.GetRules

    ' iterate through all the rules
    For Each rl In myRules
            Debug.Print rl.Conditions.Body.Enabled & " " & rl.Conditions.Body.Text

            If InStr(LCase(rl.Name), ruleSet) > 0 And (rl.Enabled) Then

                rl.Execute ShowProgress:=True, Folder:=tmpInbox

                If ruleSet = "autorun" Then
                    rl.Execute ShowProgress:=True, Folder:=olStore.GetDefaultFolder(olFolderSentMail)

                End If

                ruleList = ruleList & vbCrLf & rl.Name
            End If
    Next


    ' tell the user what you did
    ruleList = "These rules were executed " & _
          vbCrLf & ruleList
    MsgBox ruleList, vbInformation, "Macro: RunMyRules"

CleanUp:

    Set olStore = Nothing
    Set tmpInbox = Nothing
    Set tmpSent = Nothing

    Set rl = Nothing
    Set myRules = Nothing


End Sub
person mtholen    schedule 16.10.2015

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

Каждый раз, когда инструмент запускался. он будет захватывать новые электронные письма и просто отмечать простые ',' или '|' что-нибудь по вашему выбору в конце темы таким образом, чтобы никто не заметил. Теперь в следующий раз, когда инструмент запустится, он проверит, есть ли у электронных писем, полученных за весь день или два (в зависимости от ваших требований), эти маркеры или нет.

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

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

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

item.subject = maxtime item.save

person Sandesh Jadhav M    schedule 17.06.2014