pythoncom.pumpmessages()_来自不同线程的Pythoncom PumpMessages

这篇博客探讨了如何在Python中使用`pythoncom.PumpMessages()`函数来处理来自不同线程的`Outlook`事件,特别是`ItemAdd`事件。作者创建了一个`HandlerClass`来监听中央邮箱的新邮件,并通过`OtlkThread`线程运行`Outlook`监视器。尽管代码能正常运行,但在多线程环境下,`ItemAdd`事件未被正确识别。博客内容讨论了尝试的不同解决方案,包括初始化`pythoncom`,使用`PumpWaitingMessages`,以及在线程间传递`Outlook`实例,但都没有成功解决事件触发问题。
摘要由CSDN通过智能技术生成

我想执行类似于要求here的操作,但是使用诸如here的线程.也使用来自here的答案,我的代码可以正常工作,只是无法识别ItemAdd事件(实际上,我认为是,但是在其他线程,这就是为什么没有输出的原因).

"""Handler class that watches for incoming mails"""

import ctypes # for the WM_QUIT to stop PumpMessage()

import logging

import win32com.client

import sys

import threading

import time

import pythoncom

# outlook config

CENTRAL_MAILBOX = "My Mailbox"

# get the outlook instance and inbox folders

outlook = win32com.client.Dispatch("Outlook.Application")

marshalled_otlk = pythoncom.CoMarshalInterThreadInterfaceInStream(

pythoncom.IID_IDispatch,outlook)

class HandlerClass(object):

def OnItemAdd(self,item):

logger.info("New item added in central mailbox")

if item.Class == 43:

logger.info("The item is an email!")

class OtlkThread(threading.Thread):

def __init__(self,marshalled_otlk,*args,**kwargs):

super().__init__(*args,**kwargs)

self.marshalled_otlk = marshalled_otlk

self.logger = logging.getLogger("OLThread")

def run(self):

self.logger.info("Starting up Outlook watcher\n"

"To terminate the program,press 'Ctrl + C'")

pythoncom.CoInitialize()

outlook = win32com.client.Dispatch(

pythoncom.CoGetInterfaceAndReleaseStream(

self.marshalled_otlk,pythoncom.IID_IDispatch

)

)

user = outlook.Session.CreateRecipient(CENTRAL_MAILBOX)

central_inbox = outlook.Session.GetSharedDefaultFolder(user,6).Items

self.logger.info(f"{central_inbox.Count} messages in central inbox")

win32com.client.DispatchWithEvents(central_inbox,HandlerClass)

pythoncom.PumpMessages()

pythoncom.CoUninitialize() # this is prbly unnecessary as it will never be reached

def main():

# pythoncom.CoInitialize()

OtlkThread(marshalled_otlk,daemon=True).start()

if __name__ == "__main__":

status = main()

while True:

try:

# pythoncom.PumpWaitingMessages()

time.sleep(1)

except KeyboardInterrupt:

logger.info("Terminating program..")

ctypes.windll.user32.PostQuitMessage(0)

sys.exit(status)

我尝试了各种方法,例如将sys.coinit_flags = 0放在顶部,如建议的here),在主线程中调用PumpWaitingMessages(),并在侧线程本身中获取Outlook应用程序,而不是传递编组的对象.这些都不起作用.

当我仅将PumpMessages放入主线程(相同的HandlerClass,但没有单独的线程)时,它就可以工作并且可以在到达时识别电子邮件,但是很明显,该线程已被阻塞,甚至无法捕获KeyboardInterrupt异常.

因此,如何使Outlook Watcher在单独的线程中运行,以将消息发送到主线程以在那里输出?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值