如何从Python连接到正在运行的Outlook实例

2024-09-25 06:34:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个Python脚本来从outlook2013文件夹中的邮件中提取数据。 在任何地方描述的访问Outlook的方法是首先运行:

import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

如果Outlook没有运行,这个功能很好。但如果是这样,则会抛出一个错误:

^{pr2}$

基于另一个不支持同时运行多个实例的应用程序报告的类似问题,我尝试调整他们的解决方案:

try:
    app = win32com.client.Dispatch('Outlook.Application')
except:
    app = win32com.client.GetActiveObject('Outlook.Application')

但这也行不通。GetActiveObject现在失败,错误为:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python27\lib\site-packages\win32com\client\__init__.py", line 79, in GetActiveObject
    dispatch = pythoncom.GetActiveObject(resultCLSID)
pywintypes.com_error: (-2147221021, 'Operation unavailable', None, None)

那么,连接到正在运行的Outlook实例的正确方法是什么呢?在


Tags: 实例方法in脚本clientnoneappapplication
2条回答

回答我自己的问题:

根本原因是我在以管理员身份运行的命令窗口中运行Python。
如果我开始命令行.exe作为一个普通用户,一切正常运转。
我希望GetActiveObject()在这种情况下会返回一个更有意义的错误消息!在

旁注:逆转两种选择的效果更快:

try:
    outlook = win32com.client.GetActiveObject('Outlook.Application')
except:
    outlook = win32com.client.Dispatch('Outlook.Application')

Outlook是一个singleton,因此无论您做什么,它总是连接到正在运行的实例。唯一的问题(正如您所发现的那样)是,如果已经在不同的安全上下文下运行,COM系统将拒绝在两个进程之间封送COM对象。在

相关问题 更多 >