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 处理程序在事件处理程序调用中没有收到 this
或 self
指针(即 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()
我的目标是每当我在 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 帖子的合并,包括这个:
Subject
行和 Body
。
OP 代码的额外步骤是处理 Application.ItemLoad
事件,并根据传递的信息继续为项目单独设置处理程序。此外,由于您的 MailItem 处理程序在事件处理程序调用中没有收到 this
或 self
指针(即 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()