使用 GetExchangeUser 获取 PrimarySMTP

Get PrimarySMTP using GetExchangeUser

在 Excel 版本 2201 中,使用 VBA,我想获取 PrimarySMTP 属性 我有显示名称的邮件用户列表。

我编写的代码在大多数情况下都有效:

Set myolApp = CreateObject("Outlook.Application") 

Set myNameSpace = myolApp.GetNamespace("MAPI") 

Set MyAddrList = myNameSpace.addressLists("Global Address List") 

Set myAddrEntries = MyAddrList.AddressEntries(strDisplayname) 

Set objExchUsr = myAddrEntries.GetExchangeUser 

PrimarySMTP=objExchUsr.PrimarySMTPAddress

当显示名称有时有多个结果时,就会出现问题:GetExchangeUser 没有检索到正确人的 PrimarySMTP

我尝试将 UPN 而不是显示名称传递给 AddressEntries 函数,但没有成功。

Outlook 对象模型提供 NameSpace.CreateRecipient method which creates a Recipient 对象。它用于根据地址簿验证给定名称。收件人的姓名可以是表示收件人的显示名称、别名或完整 SMTP 电子邮件地址的字符串。

Sub ResolveName() 
 Dim myNamespace As Outlook.NameSpace
 Dim myRecipient As Outlook.Recipient
 Dim CalendarFolder As Outlook.Folder
 
 Set myNamespace = Application.GetNamespace("MAPI")
 Set myRecipient = myNamespace.CreateRecipient("Eugene Astafiev")
 myRecipient.Resolve 
 If myRecipient.Resolved Then    
   Set objExchUsr = myRecipient.AddressEntry.GetExchangeUser()
   PrimarySMTP = objExchUsr.PrimarySMTPAddress
 Else
   ' you need to iterate over all entries in the AB
 End If 
End Sub 

Outlook 对象模型没有为此提供任何其他功能。

如果收件人姓名不明确,Recipient.Resolve 将失败。

您无法使用 Outlook 对象模型解析不明确的名称 - 您可以遍历所有 GAL 条目,但这会太慢并且对于大型 GAL 容器会失败。

在扩展 MAPI(C++ 或 Delphi)中,您可以使用 PR_ANR 限制来获取所有匹配项(这是 Outlook 用来显示不明确条目列表的方法)。

如果可以使用 Redemption(我是作者),您可以使用 RDOSession.AddressBook.GAL.ResolveNameEx

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