Как выполнить поиск в глобальном списке адресов Outlook (2010) по нескольким именам?

Я прочитал этот пост Как я могу найти имя в глобальном списке адресов 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)

1 ответ

Не могу поверить, что я нашел решение так быстро после публикации вопроса. Поскольку трудно найти ответ. Я делюсь своими выводами здесь.

Он вдохновлен тем, как получить точное совпадение объекта addressEntry из GAL (Global Address List), хотя он находится на языке C#, а не на python.

Этот метод использует точное соответствие отображаемого имени, а не полагается на внешний вид для разрешения имени. Тем не менее, есть возможность перебрать глобальный список адресов и сделать частичное совпадение самостоятельно.

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)
Другие вопросы по тегам