1

我已阅读这篇文章如何在 Outlook (2010) 全局地址列表中搜索名称?并找到了从 Outlook GAL 获取名称的有效解决方案。

我有3个问题:

  1. search_string如果是电子邮件地址,我可以得到联系方式。当它是一个名字时,搜索不起作用。它将返回False已解决,但True可发送。然后我在使用ae对象时出错。我究竟做错了什么?

  2. 我对代码的理解不足以修改它以搜索多个名称。我只是创建了一个 for 循环,但也许有更有效的方法?例如,我可以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)
4

1 回答 1

1

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

它的灵感来自如何从 GAL (Global Address List) 中获取 addressEntry 对象的精确匹配,尽管它是在 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)
于 2019-02-20T22:25:56.640 回答