当前位置: 首页 > 面试题库 >

win32com.client.Dispatch有效,但win32com.client.gencache.EnsureDispatch不起作用

壤驷敏学
2023-03-14
问题内容

我正在为Python学习win32com,但遇到了一个奇怪的问题。

我正在尝试在词典列表中导出Outlook联系人。我的代码与win32com.client.Dispatch(“
Outlook.Application)完美配合。但是它与win32com.client.gencache.EnsureDispatch(”
Outlook.Application)返回0个联系人,该联系人应该更快,更“安全”。这是我的代码:

class MapiImport():
    def __init__(self):
        self.olApp = win32com.client.Dispatch("Outlook.Application")
        self.namespace = self.olApp.GetNamespace(u"MAPI")
        # olFolderContacts = 10 :
        self.mapiContacts = self.namespace.GetDefaultFolder(10).Items

    def getContacts(self, *fields):
        contacts = []
        # Class == 40 is ContactItem
        # Class == 69 is DistListItem
        # Exclude ditribution list and others objects != ContactItem
        for contact in filter(lambda x: x.Class == 40,self.mapiContacts) :
            if not fields :
                ctact = dict((x.Name,x.Value) for x in contact.ItemProperties)
            else :
                ctact = {}
                for field in fields :
                    itemProp = contact.itemProperties[field]
                    ctact[field] = itemProp.Value
            contacts.append(ctact)
        return contacts

#====TEST SCRIPT====
myMAPI = MapiImport()
fields = (u"LastName",u"FirstName",u"Companies",
          u"HomeTelephoneNumber",u"Home2TelephoneNumber",
          u"MobileTelephoneNumber",
          u"BusinessTelephoneNumber",u"Business2TelephoneNumber",
          u"Email1Address",u"Email2Address",u"Email3Address",
          u"HomeAddress",u"BusinessAddress",
          u"Birthday",u"Anniversary",
          u"Body")
print(myMAPI.getContacts(*fields))

所以当我更换时:

olApp = win32com.client.Dispatch("Outlook.Application")

与:

olApp = win32com.client.gencache.EnsureDispatch("Outlook.Application")

它返回以下错误:

Traceback (most recent call last):
  File "D:\Documents and Settings\da7950\Mes documents\Dropbox\cheetahImporter\mapiImport.py", line 42, in <module>
    print(myMAPI.getContacts(*fields))
  File "D:\Documents and Settings\da7950\Mes documents\Dropbox\cheetahImporter\mapiImport.py", line 19, in getContacts
    for contact in filter(lambda x: x.Class == 40,self.mapiContacts) :
  File "D:\Documents and Settings\da7950\Mes documents\Python27\lib\site-packages\win32com\gen_py\00062FFF-0000-0000-C000-000000000046x0x9x2\_Items.py", line 122, in __getitem__
    return self._get_good_object_(self._oleobj_.Invoke(*(81, LCID, 1, 1, item)), "Item")
com_error: (-2147352567, "Une exception s'est produite.", (4096, u'Microsoft Office Outlook', u'Index de la matrice en dehors des limites.', None, 0, -2147352567), None)

该消息表示“矩阵索引超出范围”。最令人头疼的是,在我调用了SecureDispatch之后,win32com.client.Dispatch不再起作用。我必须卸载pywin32并重新安装…

我正在使用Python2.7.3 64位和Outlook 2007 32位

谢谢


问题答案:

我找到了解决方案。这是win32com makepy的错误…

主要问题是Outlook是基于1的索引olContactItem(与python的基于0的索引相反)

olApp = win32com.client.gencache.EnsureDispatch("Outlook.Application")           
namespace = olApp.GetNamespace(u"MAPI")           
# olFolderContacts = 10 :           
mapiContacts = namespace.GetDefaultFolder(10).Items
for i in range(1,len(mapiContacts)+1) :
    contact = self.mapiContacts[i]
    ...

还有另一个问题contact.itemProperties。所有属性都对区分大小写EnsureDispatch,因此:

contact.ItemProperties("FullName").Value
#       ^

可以,但是不行:

contact.itemProperties("FullName").Value
#       ^

若要正确命名,请查阅:MSDN上的Microsoft Outlook
ContactItem参考模型



 类似资料:
  • 问题内容: 这是一个数据框: 我可以获取列基本上是从原来的列的元组使用: 但是,如果我想要一个值列表而不是它们的元组,那我就做不到,因为它不能满足我的期望: 相反,我需要这样做: 为什么我不能使用我想要的东西? 附录 一些可能的解决方法的时间安排: 问题答案: 罪魁祸首在这里。有了它就可以了,但是using在编译模块中引发了一个异常: 如您所见,它们捕获了异常,但不必费心去处理它。 即使没有太宽泛

  • 问题内容: 这是一个数据框: 我可以获取列基本上是从原来的列的元组df使用df.apply: 但是,如果我想要一个值列表而不是它们的元组,那我就做不到,因为它不能满足我的期望: 相反,我需要这样做: 为什么我不能使用df.apply(list, 1)我想要的东西? 附录 一些可能的解决方法的时间安排: 问题答案: 罪魁祸首在这里。有了它就可以了,但是在编译模块中引发了一个异常: 如您所见,它们捕获

  • 问题内容: 我有以下ajax调用,该调用在Firefox和Chrome中完美运行,但在IE中则不行: 我知道一个事实,所有变量都传递正确的内容,而$ .ajax确实传递所有参数/值。 这就是我遇到的错误: 日志:@错误:未定义日志:@状态:parsererror日志:@状态文本:确定 我知道IE上的缓存问题,并实施了一个随机参数来清除它。 这是我得到的JSON(我可以使用Charles看到它) 最

  • 无法使用语法来代替 它看起来像这样: 但是当我使用@Connect装饰器使事物更干净时,我没有得到任何在我的状态中列出的东西。 突然之间,它不知何故实际上并不连接事物: 我做错了什么,我看到每个人都在使用的神奇的@Connect装饰器的正确使用方法是什么? 其余的代码,以防万一,以@connect的形式;

  • 问题内容: 在这里反应/反应路由器/ heroku问题(可能是出现故障的heroku)。 我正在关注这个精彩的教程:https : //medium.com/@patriciolpezjuri/using-create-react-app-with-react-router- express- js-8fa658bf892d#.y77yjte2j ,一切正常,直到我发布为止它到heroku,我尝试

  • 我有一个场景,我们在Tinymce中定义了有效和无效元素。以下是这两个值: “无效的_元素”是为了防止输入JavaScript。通过以上设置,Tinymce不会阻止JavaScript,但如果我删除“valid_元素”,它就会开始工作。 我不确定我是否删除了“valid\u元素”,Tinymce将允许所有内容,这就是为什么保留“valid\u元素”。 Tinymce版本:5.6.2 相关问题,但在