Как запустить скрипт Python при отправке электронной почты Outlook?

Я хотел бы запустить скрипт Python, когда отправляю электронное письмо через Outlook.

До сих пор я видел только решения для запуска скрипта Python при получении электронного письма, но не при его отправке.

Что будет делать скрипт? Потребуется ли ему дальнейшее взаимодействие с Outlook (например, извлечение информации из отправленного сообщения)?

DS_London 01.01.2023 14:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
124
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Событие ItemSend класса Outlook Application запускается для исходящих элементов всякий раз, когда элемент Microsoft Outlook отправляется либо пользователем через инспектор (до закрытия инспектора, но после того, как пользователь нажимает кнопку «Отправить»), либо когда метод Send для элемента Outlook, например MailItem, используется в программе.

Имейте в виду, Outlook должен быть открыт и подключен к вашему коду (получен действительный экземпляр Application). Событие не запускается, когда Outlook не запущен.

Один нюанс заключается в том, что событие ItemSend передает параметр с именем Cancel, который позволяет обработчику события отменить отправку сообщения, если это необходимо. В VBA это делается установкой Cancel=True, поскольку параметр передается по ссылке. Python обрабатывает ссылочные параметры по-разному, поэтому в конце функции обработчика событий также необходимо явное return Cancel, чтобы параметр имел какой-либо эффект. win32com присваивает возвращаемую(ые) переменную(и) функции обработчика события параметру(ам) COM [out], в свою очередь.

DS_London 01.01.2023 15:03

Хорошо знать. Я не гуру питона.

Eugene Astafiev 01.01.2023 19:13

Привет @EugeneAstafiev спасибо за информацию. Как подключить код к Outlook? Кажется, я могу запустить код только вне OutLook. Большое спасибо за ваш совет

ronmakh 03.01.2023 08:23

В Outlook вы можете создать макрос VBA, если это необходимо. Python можно использовать только для автоматизации Outlook.

Eugene Astafiev 03.01.2023 10:35

@ronmakh Как я прокомментировал исходный пост ... это зависит от того, что вы хотите сделать в сценарии и какая информация вам нужна об отправляемом сообщении. Как уже упоминалось, вы можете написать сценарий VBA, который открывается при открытии Outlook и реагирует на события отправки. Затем этот VBA может вызвать (оболочку) скрипт Python. НО это зависит от того, сколько информации вам нужно передать сценарию Python из сообщения (поскольку это будут аргументы командной строки для сценария: вы не получите простого доступа к богатой иерархии информации в элементе сообщения).

DS_London 03.01.2023 15:47

Попробуйте событие 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()
    
stackoverflow.com/a/72710085/4539709
0m3r 06.01.2023 18:36

Как и выше, обработчик события OnItemSend должен иметь строку return cancel в конце, если параметр cancel должен иметь какой-либо эффект при изменении.

DS_London 07.01.2023 12:08

Маленький нюанс: метод не обязательно должен быть статичным. Класс OutlookEvent может иметь переменные-члены для каждого экземпляра (т. е. может иметь параметр self). Если вы сначала создаете объект приложения с помощью Dispatch(), вы можете затем вызвать WithEvents, который возвращает экземпляр класса обработчика OutlookEvent, в котором могут быть установлены члены. Это устраняет необходимость в глобальных переменных.

DS_London 07.01.2023 12:20

Да @DS_London, я согласен, это просто быстрый рабочий пример

0m3r 08.01.2023 18:47

Другие вопросы по теме

C# Для SMTP-сервера требуется безопасное соединение, иначе клиент не прошел проверку подлинности. Ответ сервера был: 5.7.0 Требуется аутентификация
Шаблон электронной почты WooCommerce не отображается при отправке пользовательских электронных писем из functions.php
Извлеките данные из таблицы по электронной почте и отправьте их в тикет jira с помощью приложения логики
Встроенные/встроенные вложения в сообщения электронной почты, отправленные Google API через Python, также отображаются прикрепленными
Как добавить метод входа по электронной почте и паролю в существующую учетную запись, созданную с помощью стороннего поставщика, такого как google/facebook, в моем проекте firebase
Отправить электронное письмо на адрес электронной почты текущего пользователя во флаттере
Использование электронной почты для сигнализации в webRTC
Примечания к заказу Woocommerce не понимают разрыва строки
Как запустить макрос после выполнения правила в Outlook?
Как временно установить подпись (ответы/пересылки) на «Нет»?