Python 打开电子邮件时触发 Outlook win32 事件

Python Outlook win32 event trigger when email is opened

我的目标是每当我在 Outlook 上打开电子邮件时使用 python 脚本触发事件处理程序,从那里我应该能够获取打开的电子邮件的数据,然后执行有数据的东西。关于如何通过 VBA (here) 执行此操作有一个类似的主题,但我不知道如何使用 win32com 将其转换为 python。

我查看了 Microsoft 文档,但无法弄清楚如何触发 MailItem 对象上的事件。 https://docs.microsoft.com/en-us/office/vba/api/outlook.mailitem

我最接近做的事情是做类似下面的事情,这可能不是解决方案,因为在这种情况下(如文档所述)项目不包含数据。

import win32com.client
import pythoncom
import re

class Handler_Class(object):
  def OnItemLoad(self, item):
       print(item.Class)
 
outlook = win32com.client.DispatchWithEvents("Outlook.Application",Handler_Class)

任何 ideas/suggestions 感谢!提前致谢!

这里有一些对我有用的概念验证,来自 SO 帖子的合并,包括这个: 。它在读取时打印出 MailItem 的 Subject 行和 Body

OP 代码的额外步骤是处理 Application.ItemLoad 事件,并根据传递的信息继续为项目单独设置处理程序。此外,由于您的 MailItem 处理程序在事件处理程序调用中没有收到 thisself 指针(即 MailItem 的 IDispatch 接口),您必须自己将其保存以备后用。

import win32com.client
import pythoncom

#Handler for Application Object
class Application_Handler(object):
    def OnItemLoad(self, item):
        print('Application::OnItemLoad')

        #Only want to work with MailItems 
        if( item.Class == win32com.client.constants.olMail ): 
            #Get a Dispatch interface to the item
            cli = win32com.client.Dispatch(item)
            #Set up a handler
            handler = win32com.client.WithEvents(cli,MailItem_Handler)
            #Store the MailItem's Dispatch interface for use later
            handler.setDisp(cli)
 
#Handler for MailItem object
class MailItem_Handler(object):
    def setDisp(self,disp):
        self._disp = disp

    def OnOpen(self,bCancel):
        print('MailItem::OnOpen')
    
    def OnRead(self):
        print('MailItem::OnRead')
        subj = self._disp.Subject
        print('Subject:',subj)
        body = self._disp.Body
        print('Body:',body)

outlook = win32com.client.DispatchWithEvents("Outlook.Application", Application_Handler)
#Message loop
pythoncom.PumpMessages()