Правила Outlook в последовательном процессе - PullRequest
1 голос
/ 01 декабря 2011

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

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

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

Есть ли способ выполнить это поведение?

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

End Sub

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

Ответы [ 2 ]

1 голос
/ 16 октября 2015

Г. Д. Арнольд,

Вы действительно можете использовать опцию ItemAdd согласно ответу @ Бретта.

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

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

Добавьте класс к вашему VBA-коду с именем "EventClassModule"

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

Public WithEvents dItems As Outlook.Items

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

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 на соответствие правилу и, если в rule.Name существует строка ruleSet, то выполняет некоторый код. Таким образом, вы можете иметь несколько правил и выполнять только некоторые из них в зависимости от того, к какому «правилу» они относятся. Вы можете определить это, изменив их имя.

Это уточнение опции «Выполнить правила» в 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
0 голосов
/ 17 июня 2014

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

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

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

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

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

item.subject = maxtime item.save

...