Выполнение скрипта после получения письма / outlook / VBA
Sub WorkWithEmails(Item As Outlook.MailItem)
Dim oLookItem As Object
Dim oLookMail As MailItem
Dim oLookFldr As Folder
Dim oLookName As NameSpace
Dim Ret_Val
Set objShell = VBA.CreateObject("Wscript.Shell")
Set oLookName = Application.GetNamespace("MAPI")
Set oLookFldr = oLookName.GetDefaultFolder(olFolderInbox)
For Each oLookItem In oLookFldr.Items
If TypeOf oLookItem Is MailItem Then
Debug.Print oLookItem.Subject
'Debug.Print oLookMail.ReceivedTime
'Debug.Print oLookMail.Sender
'Debug.Print oLookMail.SenderEmailAddress
Debug.Print oLookItem.Body
Ret_Val = Shell("path\Python37\python.exe " & "path\draft.py" & " -t " & oLookItem.Subject & " -d " & oLookItem.Body)
End If
Next
End Sub
Этот код завершается ошибкой, потому что если я правильно понял, правило срабатывает раньше (событие), чем письмо появляется в папке.
Я пробовал:
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Sub WorkWithEmails(Item As Outlook.MailItem)
Sleep (5000)
...
И
...
Sleep (5000)
For Each oLookItem In oLookFldr.Items
в этом случае при получении нового письма ничего не происходит.
Если запустить Sub WorkWithEmails(), то всё отлично отрабатывает (при условии, что письмо находится в папке).
Так же я пробовал Private WithEvents Items As Outlook.Items и другие вариации строки включающую в себя WithEvents встречающиеся на просторах сети.
Если данная строка будет размещена в Module даже без запуска:
Compile Error: Only valid in object module
Если строку поместить в ThisOutlookSession, то либо ничего не происходит, либо нет сценариев для выбора в меню Скрипт Правил.
draft.py
from datetime import datetime
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-t") # тема
parser.add_argument("-d") # описание
args = parser.parse_args()
f = open('path/logs/jira.log', 'a')
f.write(str(datetime.now().strftime('%d%m%y')) + ':' + args.t + ', ' + args.d + '\n')
f.close()
Что я упускаю?
требуется выполнить python скрипт передав в него тему и тело письма при поступлении нового входящего письма
Ответы (1 шт):
Private WithEvents myOlItems 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")
Set myOlItems = objNS.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub myOlItems_ItemAdd(ByVal Item As Object)
On Error GoTo ErrorHandler
Dim Msg As Outlook.MailItem
Dim Ret_Val
If TypeName(Item) = "MailItem" Then
Set Msg = Item
'MsgBox Msg.Subject
'MsgBox Msg.Body
Ret_Val = Shell("C:\Users\Violet\AppData\Local\Programs\Python\Python37\python.exe C:\Users\Violet\PycharmProjects\test_bot\draft.py -t """ & Msg.Subject & """ -d """ & Msg.Body & """")
End If
ProgramExit:
Exit Sub
ErrorHandler:
MsgBox Err.Number & " - " & Err.Description
Resume ProgramExit
End Sub
После вставки кода в ThisOutlookSession модуль необходимо перезапустить Outlook.