使用win32com通过Python访问Outlook.Application会导致错误

时间:2016-11-30 16:08:11

标签: python python-3.x email outlook

我们有一个应用程序通过以下代码片段访问用户的Outlook帐户(请参阅最受欢迎的答案): Reading e-mails from Outlook with Python through MAPI

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

它工作好几个月,唉,几天前,它在所有组织机器上开始失败,同时返回以下错误: AttributeError:'module'对象没有属性'CLSIDToClassMap'

错误来源是: WinPython-32位-3.4.4.2 \蟒-3.4.4 \ lib中\站点包\ win32com \客户\ gencache.py

我怀疑它与应用于Outlook的安全补丁有关。我们使用Office 2010(Outlook 14.0.7173.500 32位)

2 个答案:

答案 0 :(得分:0)

互联网跟踪了2007年的同一问题:https://mail.python.org/pipermail/python-win32/2007-August/006147.html

也许会问这个人

答案 1 :(得分:0)

此属性错误的主要原因是因为您的COM服务器已从后期绑定(动态)更改为早期绑定(静态)。

  • 在后期绑定中,每当调用一个方法时,都会向该对象查询该方法,如果成功,则可以进行调用。
  • 在“早期绑定”中,对象模型的信息是根据对象调用提供的类型信息预先确定的。早期绑定使用MakePy。同样,早期绑定也区分大小写。

有两种方法可以解决此问题:

  1. 使用动态模块来强制您的代码以面向后期的方式工作。使用示例:

    "win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()" 
    
  2. 使用面向驼峰的敏感关键字作为面向早期绑定的方式。使用示例:

    "excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
    

或者您也可以从temp删除gen_py文件夹,因为它使win32com以早期绑定方式运行。