【问题标题】:Search Outlook Global Address List Asynchronously异步搜索 Outlook 全局地址列表
【发布时间】:2019-02-24 01:25:09
【问题描述】:

我想;

  • 搜索 MS Outlook 的全局地址列表
  • 使用输入,filterStr
  • 异步检索符合条件的所有
    • 联系人名字以 filterStr 开头或联系人姓氏以 filterStr 开头
  • 在某种列表中可用时显示联系人

我正在使用 VB.net 使用 Visual Studio 2017 开发 MS Outlook 插件。 (c# 代码示例很好)。我需要这个插件才能像 MS Skype for Business 那样通过“RICHEDIT60W”的“查找人”字段搜索联系人

到目前为止,我已经尝试了以下方法;

  • 在我的表单中使用 MS Skype for Business 的“RICHEDIT60W”(搜索字段)
    • 找不到文档
  • 使用 MS Outlook 的“RichEdit20WPT”(新电子邮件撰写中的“收件人:”字段)
    • 找不到文档
  • 通过Session.GetGlobalAddressList获取“全球地址列表”
    • 成功,但循环超过 50k 项太慢
  • 使用System.DirectorySearcher
    • 这并不总是有效。当我通过电缆连接到公司网络时,我可以创建对象。当我通过家庭无线网络连接时,我收到错误消息:“指定的域不存在或无法联系”
    • 我确实尝试过使用 DirectoryEntry 初始化的对象;
    • name.surname.corporation.com 我的电子邮件地址是 name.surname@corporation.com,这次我收到“未指定的错误
    • 我尝试使用 ADODB 进行连接,如 https://docs.microsoft.com/en-us/windows/desktop/ad/example-code-for-searching-for-users#visual-basic-example 中给出的那样
    • 这也给了我第 42 行的错误 (root = GetObject("LDAP://rootDSE")

问题:我该如何做以下任何一项;

  • 联系DirectorySearcher 工作
  • 让 ADODB 方法工作
  • 使用 Outlook 或 Skype for Business 的现有 RichEdit 控件

?

【问题讨论】:

  • 您只需要让用户从 GAL 中挑选某人吗?这可能是您需要的:docs.microsoft.com/en-us/office/vba/api/…
  • 我需要制作一个自定义控件,以在表格中显示为字段。当用户要输入多行项目时,我希望避免为每一行弹出一个对话框。我还需要能够在用户输入时动态显示匹配的联系人。

标签: vb.net active-directory ldap vsto outlook-addin


【解决方案1】:

在低(扩展 MAPI - 仅限 C++ 或 Delphi)级别,您需要应用 PR_ANR MAPI 限制:这是 Outlook 在解析名称并显示不明确匹配列表时使用的。您可以在单独的线程上运行该代码,但它不会一次返回匹配项 - 您将获得整个集合。

如果扩展 MAPI 不是一个选项,您可以使用 Redemption 及其 RDOSession.AddressBook.GAL.ResolveNamesEx 方法:

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

【讨论】:

  • 我希望引起您的注意,德米特里,谢谢。不幸的是,我不允许使用 Redemption,我们有避免使用 3rd 方库的总体趋势,并且描述中的“解决 Outlook 安全补丁所施加的限制的工作”位在此决定中发挥了作用。
  • 能否请您指出有关如何使用扩展 MAPI 的任何文档?我可以使用 vb.net 中的公开函数吗,例如 user32.dll 中的函数?
  • “解决 Outlook 安全补丁施加的限制”并不意味着“绕过限制..” - 它使用文档化且完全支持的扩展 MAPI API,这是 Outlook 使用的本机 API本身,但只能在 C++ 或 Delphi 中访问。 VB.Net 不能做扩展 MAPI - 曾经有一个第三方库直接将扩展 MAPI 暴露给 .Net 语言 (MAPI33),但它不再可用。
  • 非常感谢 Dmitry,我将在我自己的一个项目中尝试 Redemption 并转发您的解释。与此同时,我找到了一个似乎对我有用的解决方案。您对此有什么意见吗?
  • 我不会那样做 - 看我的评论。
【解决方案2】:

我是这样解决的;

  • 获取 GAL 本身和 AddressEntries 速度足够快,没有问题
  • 我只循环了一次AddressEntries,在初始化期间将每个Nameproperties 转换为List(Of String),这大约需要3 秒
  • 当我需要搜索条目时,我使用 Linq 使用 IndexOf 函数查询列表,最长大约需要 150 毫秒才能获取所有匹配项,并且列表中的项目可以立即访问

这符合我的需要,因为 - 它通过我的家庭网络工作,即使我没有连接(我假设 Outlook 正在缓存 GAL) - 使用 Linq 进行查询的速度足够快,便于在用户键入时进行搜索

【讨论】:

  • 不要这样做。永远不要遍历 GAL(或 Outlook 文件夹)中的所有项目 - 一些 GAL 容器包含数十万个条目。即使使用较小的 GAL 容器,您的代码也会在在线(而不是缓存)模式下中断。让服务器完成工作。
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多