gpt4 book ai didi

python - win32com.client.Dispatch 有效但 win32com.client.gencache.EnsureDispatch 无效

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:50 26 4
gpt4 key购买 nike

我正在学习 win32com for python,我遇到了一个奇怪的问题。

我正在尝试导出字典列表中的 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 并重新安装它...

我正在运行 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
# ^

要获得正确的名称,请咨询:Microsoft Outlook ContactItem reference model on MSDN

关于python - win32com.client.Dispatch 有效但 win32com.client.gencache.EnsureDispatch 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11623461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com