Win32com.client.Dispatch works, but not win32com.client.gencache.EnsureDispatch

I am learning win32com for python and I have a weird problem.

I am trying to export Outlook contacts to the Dictionnary list. My code works fine with win32com.client.Dispatch ("Outlook.Application"), but it returns 0 contacts with win32com.client.gencache.EnsureDispatch ("Outlook.Application"), which should be faster and "safer". Here is my code:

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

So when I replace:

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

Via:

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

It returns the following errors:

 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) 

The message means "Matrix index beyond borders." The strangest thing is that after I called EnsureDispatch, win32com.client.Dispatch no longer works. I need to remove pywin32 and reinstall it ...

I am working with Python2.7.3 64-bit with 32-bit Outlook 2007

thanks

+4
source share
2 answers

I have found a solution. This is a win32com makepy bug ...

The main problem is that Outlook is indexed based on 1 for olContactItem (as opposed to index based on 0 for 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] ... 

There is another problem with contact.itemProperties . All properties are case sensitive with EnsureDispatch , therefore:

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

works but not

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

To get the correct names, refer to the Microsoft Outlook ContactItem reference model on MSDN

+3
source

@ Jean-Franรงois-Corbett - The hyperlink that was added to this post is the model help page for Microsoft Word. I suspect this could have changed since it was shipped; will this hyperlink to Microsoft Outlook ContactItem be better?

https://docs.microsoft.com/en-us/office/vba/api/outlook.contactitem

0
source

All Articles