Г. Д. Арнольд,
Вы действительно можете использовать опцию 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