Найти адрес электронной почты outlook от GAL для 2 человек с тем же именем, используя vba - PullRequest
0 голосов
/ 16 мая 2018

Я создаю форму в Access 2016, где пользователь может ввести имя человека и отправить этому человеку электронное письмо.

В настоящее время я тестирую некоторый код, который возвращает адрес электронной почты, он работает там, где имя уникально (т.е. существует только один человек с таким именем), однако у нас более 70 000 сотрудников, и некоторые из них имеют одинаковые имена.

Вот мой текущий код, который работает с уникальными именами:

Sub GetEmail() 

Set out_App = New Outlook.Application
Set out_NS = out_App.GetNamespace("MAPI")
Set out_Recip = out_NS.CreateRecipient("Gavin Thomson")

out_Recip.Resolve

Set out_Addr = out_Recip.addressEntry
Set out_ExUser = out_Addr.GetExchangeUser

MsgBox out_ExUser.primarysmtpaddress

End Sub

Когда я изменяю значение на имя, которое существует более одного раза, я получаю сообщение об ошибке «Операция не удалась». на Set out_ExUser = out_Addr.GetExchangeUser.

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 16 мая 2018

К сожалению, это не то, чего вы можете достичь только с помощью VBA.

На уровне Extended MAPI (только C ++ или Delphi) вы можете создать ограничение PR_ANR для таблицы содержимого определенного контейнера поиска (например,как GAL).Это то, что делает Outlook, когда он разрешает имя, введенное вами в поле «Редактировать» - он проходит через все контейнеры в пути поиска и применяет ограничение PR_ANR.Если найдено несколько совпадений, отображается диалоговое окно со списком.Если имеется одно совпадение, оно возвращается и поиск останавливается, в противном случае он продолжается до следующего контейнера в пути поиска.

Однако объектная модель Outlook не предоставляет эту функцию.Если опция Искупление (любой язык) является опцией, она предоставляет RDOAddressBook .ResolveNameEx и RDOAddressList .ResolveNameEx, которые возвращают список совпадений.

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set AdrrEntries = Session.AddressBook.ResolveNameEx("john")
Debug.Print AdrrEntries.Count & " names were retruned by ResolveNameEx:"
Debug.Print "------------"
for each AE in AdrrEntries
Debug.Print AE.Name
next
Debug.Print "------------"
...