我尝试编写Python脚本以从Outlook 2013文件夹中的邮件中提取数据。 到处描述的访问Outlook的方法是首先运行:
import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
如果Outlook未运行,这可以正常工作。但如果是,则会引发错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Python27\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
File "C:\Program Files\Python27\lib\site-packages\win32com\client\dynamic.py", line 114, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "C:\Program Files\Python27\lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
pywintypes.com_error: (-2146959355, 'Server execution failed', None, None)
基于针对另一个不支持同时运行多个实例的应用程序报告的类似问题,我尝试调整其解决方案:
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实例的正确方法是什么?
答案 0 :(得分:2)
回答我自己的问题:
根本原因是我在以管理员身份运行的命令窗口中运行Python 如果我以普通用户身份启动cmd.exe,则可以正常工作 我希望GetActiveObject()在这种情况下会返回更有意义的错误消息!
旁注:反转这两种方案的速度更快:
try:
outlook = win32com.client.GetActiveObject('Outlook.Application')
except:
outlook = win32com.client.Dispatch('Outlook.Application')
答案 1 :(得分:0)
Outlook是一个单例,所以无论你做什么,它总是会连接到正在运行的实例。唯一的问题(正如您所发现的)是,如果已经在不同的安全上下文下运行,COM系统将拒绝在两个进程之间封送COM对象。