win32com.client.Dispatch funciona pero no win32com.client.gencache.EnsureDispatch

Estoy aprendiendo win32com para python y tengo un problema extraño.

Estoy tratando de exportar contactos de Outlook en una lista de diccionarios. Mi código funciona perfectamente con win32com.client.Dispatch (“Outlook.Application). Pero devuelve 0 contactos con win32com.client.gencache.EnsureDispatch (” Outlook.Application) que se supone que es más rápido y “más seguro”. Aquí está mi código:

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)) 

Así que cuando sustituyo:

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

Con :

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

Devuelve estos errores:

     Traceback (most recent call last): File "D:\Documents and Settings\da7950\Mes documents\Dropbox\cheetahImporter\mapiImport.py", line 42, in  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) 

    El mensaje significa “Índice de matriz fuera de límites”. Lo más extraño es que después de que llamé a InsuranceDispatch, win32com.client.Dispatch ya no funciona. Tengo que desinstalar pywin32 y reinstalarlo …

    Estoy ejecutando Python2.7.3 de 64 bits con Outlook 2007 de 32 bits

    Gracias

    Encontré una solución. Es un error win32com makepy …

    El problema principal es que Outlook se basa en 1 para olContactItem (en lugar de en el índice basado en 0 para python)

     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] ... 

    Hay otro problema con contact.itemProperties . Todas las propiedades son sensibles a las mayúsculas y minúsculas con EnsureDispatch , así que:

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

    funciona, pero no

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

    Para obtener los nombres correctos, consulte: Modelo de referencia de Microsoft Outlook ContactItem en MSDN