我正在尝试编写一个 Python 脚本来从 Outlook 2013 文件夹中的消息中提取数据。到处描述的访问Outlook的方法是首先运行:
import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
Run Code Online (Sandbox Code Playgroud)
如果 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)
Run Code Online (Sandbox Code Playgroud)
基于为另一个不支持同时运行多个实例的应用程序报告的类似问题,我尝试调整他们的解决方案:
try:
app = win32com.client.Dispatch('Outlook.Application')
except:
app = win32com.client.GetActiveObject('Outlook.Application')
Run Code Online (Sandbox Code Playgroud)
但这也不起作用。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)
Run Code Online (Sandbox Code Playgroud)
那么连接到正在运行的 Outlook 实例的正确方法是什么?
回答我自己的问题:
根本原因是我在以管理员身份运行的命令窗口中运行 Python。
如果我以普通用户身份启动 cmd.exe,则一切正常。
我希望 GetActiveObject() 在这种情况下会返回更有意义的错误消息!
旁注:反转两种选择的工作速度更快:
try:
outlook = win32com.client.GetActiveObject('Outlook.Application')
except:
outlook = win32com.client.Dispatch('Outlook.Application')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5110 次 |
| 最近记录: |