使用Watchdog监控目录触发Outlook发邮件时遇CoInitialize报错求助
解决"CoInitialize has not been called"错误的步骤
1. 给每个调用Outlook的线程单独初始化STA模式
watchdog的事件处理是在独立后台线程跑的,Outlook的COM对象要求必须在**单线程单元(STA)**环境下运行,你之前只在主线程初始化pythoncom没用,得在事件回调的线程里单独做:
修改你的事件处理类,在on_created方法里加COM初始化逻辑:
import pythoncom from watchdog.events import FileSystemEventHandler import win32com.client class FileMonitorHandler(FileSystemEventHandler): def on_created(self, event): if not event.is_directory: # 每个线程单独初始化STA模式 pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED) try: # 初始化Outlook并创建邮件 outlook_app = win32com.client.Dispatch("Outlook.Application") mail_item = outlook_app.CreateItem(0) mail_item.Subject = "新文件已创建" mail_item.To = "你的收件邮箱@xxx.com" # 添加新创建的文件作为附件 mail_item.Attachments.Add(event.src_path) # 测试用Display弹窗,正式用Send()发送 mail_item.Display(True) finally: # 用完释放COM资源 pythoncom.CoUninitialize()
2. 别在主线程提前初始化COM
如果之前在主线程调用过pythoncom.CoInitialize(),建议删掉,主线程不需要做这个,只在处理Outlook的线程里初始化就行,避免线程间COM环境冲突。
3. 更新pywin32到最新版
确保你的pywin32是最新的,旧版本可能有线程兼容问题:
pip install --upgrade pywin32
错误原因说明
Outlook的COM组件是STA模型,而watchdog的事件线程默认是多线程单元(MTA),两种线程模式不兼容,必须在调用Outlook的线程里单独初始化STA模式,才能正常创建Outlook对象。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

