【问题标题】:Python Outlook win32 event trigger when email is opened打开电子邮件时触发Python Outlook win32事件
【发布时间】:2021-11-03 12:25:59
【问题描述】:

我的目标是每当我在 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)

任何想法/建议表示赞赏!提前致谢!

【问题讨论】:

    标签: python outlook win32com


    【解决方案1】:

    以下是一些对我有用的概念证明,来自包括这个帖子在内的各种 SO 帖子: How to pass arguments to win32com event handler。它会在读取时打印出 MailItem 的 Subject 行和 Body

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

    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()
    

    【讨论】:

    • 非常感谢您。会测试出来,让你知道结果!!!
    • 完美运行!万分感谢! @DS_London
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多