如何使用看门狗运行outlook

问题描述 投票:0回答:1

我是Python新手,尝试使用看门狗模块来控制是否在某个目录中创建任何新文件。每次有新文件时,我都希望看门狗通过 Outlook 创建电子邮件并将新创建的文件设置为附件。

这是我的代码:

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import win32com.client as win32

class MyHandler(FileSystemEventHandler):
    def on_created(self, event):
        created_file = event.src_path.strip()
        print(type(created_file), created_file)
        # After that will be some checking of the created file
        
        # then creating an email item, which makes an exception below
        outlook = win32.Dispatch("Outlook.Application")
        mail = outlook.CreateItem(0)
        mail.To = ' '
        mail.cc = ' '
        mail.Subject = ' '
        mail.Body = ' '
        mail.Display()

event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path=f'some_path', recursive=False)
observer.start()

while True:
    try:
        pass
    except KeyboardInterrupt:
        observer.stop()

#end of the code

但我得到以下内容(抱歉读得太长了)。导入 pythoncom 并向

outlook = win32.Dispatch("Outlook.Application, pythoncom.CoInitialize())
添加参数在我的情况下不起作用,或者我做错了什么。

线程 Thread-1 中出现异常:

Traceback (most recent call last):
  File "C:\Users\username\AppData\Local\Programs\Python\Python311\Lib\site-packages\win32com\client\dynamic.py", line 86, in _GetGoodDispatch
    IDispatch = pythoncom.connect(IDispatch)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pywintypes.com_error: (-2147221008, 'CoInitialize has not been called.', None, None)

在处理上述异常的过程中,又发生了一个异常:

回溯(最近一次调用最后一次):

  File "C:\Users\Username\AppData\Local\Programs\Python\Python311\Lib\threading.py", line 1038, in _bootstrap_inner
    self.run()
  File "C:\Users\Username\AppData\Local\Programs\Python\Python311\Lib\site-packages\watchdog\observers\api.py", line 204, in run
    self.dispatch_events(self.event_queue)
  File "C:\Users\Username\AppData\Local\Programs\Python\Python311\Lib\site-packages\watchdog\observers\api.py", line 380, in dispatch_events
    handler.dispatch(event)
  File "C:\Users\Username\AppData\Local\Programs\Python\Python311\Lib\site-packages\watchdog\events.py", line 287, in dispatch
    {
  File "C:\Users\Username\PycharmProjects\pythonProject1\TEST WATCHDOG.py", line 25, in on_created
    outlook = win32.Dispatch("Outlook.Application")
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Username\AppData\Local\Programs\Python\Python311\Lib\site-packages\win32com\client\__init__.py", line 117, in Dispatch
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch, userName, clsctx)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Username\AppData\Local\Programs\Python\Python311\Lib\site-packages\win32com\client\dynamic.py", line 106, in _GetGoodDispatchAndUserName
    return (_GetGoodDispatch(IDispatch, clsctx), userName)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Username\AppData\Local\Programs\Python\Python311\Lib\site-packages\win32com\client\dynamic.py", line 88, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstance(
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
pywintypes.com_error: (-2147221008, 'CoInitialize has not been called.', None, None)
python outlook win32com office-automation watchdog
1个回答
0
投票

如何在金字塔(线程)中使用 python 和 windows com? 帖子建议了一个适合您的解决方案:

import pythoncom
pythoncom.CoInitialize()

当 Outlook 从任务计划程序自动化时,我也会看到相同的错误消息。请注意,Microsoft 目前不建议也不支持从任何无人值守、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)自动化 Microsoft Office 应用程序,因为 Office 可能会表现出不稳定的情况Office 在此环境中运行时的行为和/或死锁。

如果您正在构建在服务器端上下文中运行的解决方案,则应尝试使用可安全执行无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方案。如果您使用服务器端解决方案中的 Office 应用程序,该应用程序将缺乏许多成功运行所需的功能。此外,您还将面临整体解决方案稳定性的风险。请阅读Office 服务器端自动化的注意事项 文章了解更多相关信息。

在这种情况下,您可以考虑使用任何不需要 Outlook 自动化的组件,或者如果使用 Exchange 作为电子邮件服务器,则使用

EWS
(在 Office365 中为Graph API)。

© www.soinside.com 2019 - 2024. All rights reserved.