Я хотел бы запустить скрипт Python, когда отправляю электронное письмо через Outlook.
До сих пор я видел только решения для запуска скрипта Python при получении электронного письма, но не при его отправке.
Событие ItemSend класса Outlook Application
запускается для исходящих элементов всякий раз, когда элемент Microsoft Outlook отправляется либо пользователем через инспектор (до закрытия инспектора, но после того, как пользователь нажимает кнопку «Отправить»), либо когда метод Send для элемента Outlook, например MailItem
, используется в программе.
Имейте в виду, Outlook должен быть открыт и подключен к вашему коду (получен действительный экземпляр Application
). Событие не запускается, когда Outlook не запущен.
Один нюанс заключается в том, что событие ItemSend
передает параметр с именем Cancel
, который позволяет обработчику события отменить отправку сообщения, если это необходимо. В VBA это делается установкой Cancel=True
, поскольку параметр передается по ссылке. Python обрабатывает ссылочные параметры по-разному, поэтому в конце функции обработчика событий также необходимо явное return Cancel
, чтобы параметр имел какой-либо эффект. win32com
присваивает возвращаемую(ые) переменную(и) функции обработчика события параметру(ам) COM [out]
, в свою очередь.
Хорошо знать. Я не гуру питона.
Привет @EugeneAstafiev спасибо за информацию. Как подключить код к Outlook? Кажется, я могу запустить код только вне OutLook. Большое спасибо за ваш совет
В Outlook вы можете создать макрос VBA, если это необходимо. Python можно использовать только для автоматизации Outlook.
@ronmakh Как я прокомментировал исходный пост ... это зависит от того, что вы хотите сделать в сценарии и какая информация вам нужна об отправляемом сообщении. Как уже упоминалось, вы можете написать сценарий VBA, который открывается при открытии Outlook и реагирует на события отправки. Затем этот VBA может вызвать (оболочку) скрипт Python. НО это зависит от того, сколько информации вам нужно передать сценарию Python из сообщения (поскольку это будут аргументы командной строки для сценария: вы не получите простого доступа к богатой иерархии информации в элементе сообщения).
Попробуйте событие ItemSend
import pythoncom
from win32com.client import DispatchWithEvents
# Event handler class for outlook events
class OutlookEvent(object):
@staticmethod
def OnItemSend(item, cancel):
"""
Name Required/Optional Data type Description
Item Required Object The item being sent.
Cancel Required Boolean
cancel = False when the event occurs.
If the event procedure sets this argument to True,
the send action is not completed and the inspector is left open.
"""
print(f'The item being sent = {item.Subject}')
# # do something with Item
if __name__ == "__main__":
Outlook = DispatchWithEvents("outlook.Application", OutlookEvent)
pythoncom.PumpMessages()
Как и выше, обработчик события OnItemSend
должен иметь строку return cancel
в конце, если параметр cancel
должен иметь какой-либо эффект при изменении.
Маленький нюанс: метод не обязательно должен быть статичным. Класс OutlookEvent может иметь переменные-члены для каждого экземпляра (т. е. может иметь параметр self
). Если вы сначала создаете объект приложения с помощью Dispatch()
, вы можете затем вызвать WithEvents, который возвращает экземпляр класса обработчика OutlookEvent, в котором могут быть установлены члены. Это устраняет необходимость в глобальных переменных.
Да @DS_London, я согласен, это просто быстрый рабочий пример
Что будет делать скрипт? Потребуется ли ему дальнейшее взаимодействие с Outlook (например, извлечение информации из отправленного сообщения)?