我正在尝试编写一个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实例的正确方法是什么呢?在
回答我自己的问题:
根本原因是我在以管理员身份运行的命令窗口中运行Python。
如果我开始命令行.exe作为一个普通用户,一切正常运转。
我希望GetActiveObject()在这种情况下会返回一个更有意义的错误消息!在
旁注:逆转两种选择的效果更快:
Outlook是一个singleton,因此无论您做什么,它总是连接到正在运行的实例。唯一的问题(正如您所发现的那样)是,如果已经在不同的安全上下文下运行,COM系统将拒绝在两个进程之间封送COM对象。在
相关问题 更多 >
编程相关推荐