Как я могу найти имя в глобальном списке адресов Outlook (2010)?
У меня есть список имен, некоторые из них завершены, некоторые урезаны. Я хотел бы найти в списке адресов Outlook совпадения для этих имен.
Самым близким из приведенных мной является код Python, полученный из кода ActiveState, но он не ищет глобальные адреса, а только мой (локальный?) Список, в котором есть 3 адреса, что, очевидно, неверно. Там должно быть тысячи записей.
Любые намеки приветствуются. Я погуглил и прочитал десятки страниц, но ничего неопровержимого. Я бы предпочел не подключаться к LDAP напрямую, я считаю, что это нарушение правил в моей организации, и, кроме того, я не уверен, что это возможно. Хотел бы сделать это через Outlook API, если это возможно.
DEBUG=1
class MSOutlook:
def __init__(self):
self.outlookFound = 0
try:
self.oOutlookApp = \
win32com.client.gencache.EnsureDispatch("Outlook.Application")
self.outlookFound = 1
except:
print("MSOutlook: unable to load Outlook")
self.records = []
def loadContacts(self, keys=None):
if not self.outlookFound:
return
# this should use more try/except blocks or nested blocks
onMAPI = self.oOutlookApp.GetNamespace("MAPI")
ofContacts = \
onMAPI.GetDefaultFolder(win32com.client.constants.olFolderContacts)
if DEBUG:
print("number of contacts:", len(ofContacts.Items))
for oc in range(len(ofContacts.Items)):
contact = ofContacts.Items.Item(oc + 1)
if contact.Class == win32com.client.constants.olContact:
if keys is None:
# if we were't give a set of keys to use
# then build up a list of keys that we will be
# able to process
# I didn't include fields of type time, though
# those could probably be interpreted
keys = []
for key in contact._prop_map_get_:
if isinstance(getattr(contact, key), (int, str, unicode)):
keys.append(key)
if DEBUG:
keys.sort()
print("Fields\n======================================")
for key in keys:
print(key)
record = {}
for key in keys:
record[key] = getattr(contact, key)
if DEBUG:
print(oc, record['FullName'])
self.records.append(record)
Случайные ссылки:
MSDN - Как создать глобальный список адресов программно с помощью Visual Basic
Infinitec - Как получить глобальный список адресов программно
Return Boolean True - загрузка глобального списка адресов из Outlook / Exchange
Grokbase - [python-win32] получает глобальную адресную книгу с расширенным mapi
Переполнение стека - поиск в глобальном адресе Outlook
Еще одна неудачная попытка List
Переполнение стека - получение контактов Outlook через Python
Здесь я получил ссылку выше
Переполнение стека - извлечение контактов Outlook с помощью Python
Не работает вообще
Python для Windows - автоматизация Microsoft Outlook
Просто адресная книга по умолчанию. К тому же я хочу искать, а не перечислять все.
Если кто-то может придумать решение, я не против, если это C++, VB, Perl, Python и т. Д.
2 ответа
Ваш код выше имеет дело с контактами в папке контактов по умолчанию. Если вы хотите проверить, есть ли указанное имя в Outlook (в качестве контакта или в GAL), просто позвоните Application.Session.CreateRecipient
с последующим Recipient.Resolve
, Если звонок возвращается true
Вы можете прочитать Recipient.Address
и различные другие свойства.
Задача решена!
Благодаря ответам Дмитрия я смог создать этот минимальный код Python, который демонстрирует то, чего я хотел достичь:
from __future__ import print_function
import win32com.client
search_string = 'Doe John'
outlook = win32com.client.gencache.EnsureDispatch('Outlook.Application')
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)
Метод в решении @Prof.Falken не всегда работает, когда есть несколько совпадений для строки поиска. Я нашел другое решение, которое является более надежным, поскольку оно использует точное совпадение displayname
,
Это вдохновлено тем, как получить точное совпадение объекта addressEntry из GAL (Global Address List).
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)