有人可以帮我解决这个问题吗?我正在制作一个应用程序,它可以在 Outlook 中的 GAL(全局地址列表)中查找并找到前用户和其他内容,我可以正常工作,但是当我通过这样做获取联系人/地址条目时:
outlook = win32com.client.Dispatch("Outlook.Application")
namespace = outlook.GetNamespace("MAPI")
address_list = namespace.AddressLists.Item("Global Address List")
gal = address_list.AddressEntries
有些人与其他人具有相同的姓名和相同的显示名称,但又是独一无二的。当我需要前用户时我会这样做
gal.item("LastName, FirstName").GetExchangeUser(),
但是由于 gal 中存在一些重复项,因此它总是返回第一个。
想知道是否有真正聪明的人知道我如何检测重复项、删除重复项等等。我有一个名字列表要查看,我想我可以做的是通过执行 gal.item("LastName, FirstName") 找到联系人并获取它的位置,然后移动到下一个项目,直到出现是一个不同的名字。但我不知道当我执行 .item("name") 时如何获取位置。
感谢任何帮助,马库斯。 注意:我想避免循环通过 gal,因为那里有很多人。
如果您知道名称,获取地址输入详细信息的标准方法是致电
Namespace.CreateRecipient
/ Recipient.Resolve
。但是,如果名称不明确,Recipient.Resolve
将返回 false。除了循环遍历所有条目之外,单独使用 Outlook 对象模型无法做太多事情 - 除非您使用扩展,否则无法获取类似于 Outlook 中“重复名称”对话框显示的列表的不明确条目列表MAPI(仅限 C++ 或 Delphi)或Redemption(我是其作者 - 任何语言)。如果使用 Redemption 是一个选项,它会公开 RDOAddressBook.ResolveNameEx
和 RDOAddressList.ResolveNameEx
方法,这些方法返回针对整个地址簿 (RDOSession.AddressBook.ResolveNameEx
) 或仅针对 GAL 容器 () 的匹配列表RDOSession.AddressBook.GAL.ResolveNameEx
)。
outlook = win32com.client.Dispatch("Outlook.Application")
session = outlook.Session
# Initialize Redemption Session
redemption_session = win32com.client.Dispatch("Redemption.RDOSession")
redemption_session.MAPIOBJECT = session.MAPIOBJECT
# Resolve the name in the Global Address List
search_name = "LastName, FirstName"
addr_entries = redemption_session.AddressBook.GAL.ResolveNameEx(search_name)
# Iterate through each resolved address entry and display the name
for ae in addr_entries:
show_message_box(ae.Name, "Resolved Name")