代码之家  ›  专栏  ›  技术社区  ›  Gavin

从GAL查找两个同名人员的电子邮件地址

  •  2
  • Gavin  · 技术社区  · 6 年前

    我正在Access 2016中创建一个表单,用户可以在其中键入个人姓名并向该个人发送电子邮件。

    我的代码将返回名称唯一的电子邮件地址,但我们有70000多名员工,其中一些员工的姓名相同。

    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 回复  |  直到 4 年前
        1
  •  1
  •   Joel Magoun    6 年前

    不幸的是,这不是仅用VBA就可以实现的。

    在扩展MAPI级别(仅限C++或Delphi),可以对特定搜索容器(如GAL)的内容表创建PR\ANR限制。当Outlook解析您在“收件人”编辑框中键入的名称时,它会遍历搜索路径中的所有容器并应用PR\ANR限制。如果找到多个匹配项,则会显示一个包含列表的对话框。如果存在单个匹配项,则返回该匹配项并停止搜索,否则将继续搜索路径中的下一个容器。

    但是,Outlook对象模型不公开此功能。如果使用 Redemption (任何语言)都是一种选择 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 "------------"