[英]win32com.client.gencache.EnsureDispatch(“Outlook.Application”) not working
[英]win32com.client.Dispatch works but not win32com.client.gencache.EnsureDispatch
我正在學習win32com for python,我遇到了一個奇怪的問題。
我試圖在Dictionnary列表中導出Outlook聯系人。 我的代碼與win32com.client.Dispatch(“Outlook.Application”)完美配合。但它返回0個聯系人,win32com.client.gencache.EnsureDispatch(“Outlook.Application”)應該更快,更“安全”。 這是我的代碼:
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)
該消息表示“矩陣索引超出范圍”。 最糟糕的是,在我調用EnsureDispatch之后,win32com.client.Dispatch不再起作用了。 我必須卸載pywin32並重新安裝它...
我正在使用帶有Outlook 2007 32位的64位Python2.7.3
謝謝
我找到了解決方案。 這是一個bug win32com makepy ...
主要問題是Outlook是基於1的olContactItem
索引(而不是基於0的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]
...
contact.itemProperties
還有另一個問題。 所有屬性都使用EnsureDispatch
區分大小寫,因此:
contact.ItemProperties("FullName").Value
# ^
有效,但不是:
contact.itemProperties("FullName").Value
# ^
要獲得正確的名稱,請參閱MSDN上的Microsoft Outlook ContactItem參考模型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.