如何搜索Outlook(2010)全局地址列表中的多个名称



我已经阅读了这篇文章,如何搜索名称的Outlook(2010)全局地址列表?并找到了从Outlook Gal获取名称的工作解决方案。

我有3个问题:

  1. 如果search_string是电子邮件地址,我可以获得联系。当它是一个名称时,搜索不起作用。它将返回False以进行解决,但可发送的True。然后,使用ae对象时会遇到错误。我在做什么错?

  2. 我不了解代码以修改它以搜索多个名称。我只是创建了一个用于循环,但也许有一种更有效的方法?例如,我可以在不同搜索之间重复使用outlook.Session对象吗?

  3. recipient.Resolve()是必需的吗?

预先感谢!

我的尝试在下面。

from __future__ import print_function
import win32com.client
search_strings = ['Doe John', 'Doe Jane']
outlook = win32com.client.gencache.EnsureDispatch('Outlook.Application')
for search_string in search_strings:
    recipient = outlook.Session.CreateRecipient(search_string)
    recipient.Resolve()
    print('Resolved OK: ', recipient.Resolved)
    print('Is it a sendable? (address): ', recipient.Sendable)
    print('Name: ', recipient.Name)
    ae = recipient.AddressEntry
    email_address = None
    if 'EX' == ae.Type:
        eu = ae.GetExchangeUser()
        email_address = eu.PrimarySmtpAddress
    if 'SMTP' == ae.Type:
        email_address = ae.Address
    print('Email address: ', email_address)

不敢相信我在发布问题后很快找到了解决方案。由于很难找到答案。我在这里分享我的发现。

它的启发是如何从GAL(全局地址列表)中获取equectEntry对象的精确匹配的启发,尽管它在C#而不是Python中。

此方法使用DisplayName的精确匹配,而不是依靠Outlook来解析名称。不过,可以循环循环浏览全局地址列表并自己进行部分匹配。

import win32com.client
search_string = 'Doe John'
outlook = win32com.client.gencache.EnsureDispatch('Outlook.Application')
gal = outlook.Session.GetGlobalAddressList()
entries = gal.AddressEntries
ae = entries[search_string]
email_address = None
if 'EX' == ae.Type:
    eu = ae.GetExchangeUser()
    email_address = eu.PrimarySmtpAddress
if 'SMTP' == ae.Type:
    email_address = ae.Address
print('Email address: ', email_address)

最新更新