【问题标题】:Searching Global Address List/Book搜索全球地址列表/书
【发布时间】:2011-05-11 18:36:33
【问题描述】:

我正在开发一个应用程序,允许用户用户查看他们有权访问的收件箱的内容。我很难找到一种方法来搜索除此之外的全局地址列表

AddressEntries entries = global.AddressEntries;
AddressEntry entry = entries["search value"];

这可行,但只返回一个实例,它是找到的第一个实例。如果有多个结果,我基本上想向用户提供一个列表。

其次,我希望能够查看联系方式,但是当我使用

ContactItem contact = entry.GetContact();

它总是返回null,我认为是因为它正在查看当前用户的联系人个人列表

如果有意义的话,我想我正在尝试在 Outlook 中创建一个简单版本的全局通讯簿窗口。

如果有人有任何想法或参考,我将不胜感激!

谢谢 帕特里克

【问题讨论】:

    标签: c# outlook-object-model


    【解决方案1】:

    您应该能够从当前配置文件中获取全局地址列表,如下所示。

    Outlook.AddressLists addrLists = Application.Session.AddressLists;
    Outlook.AddressList gal = addrLists["Global Address List"];
    

    然后你可以枚举并显示那个AddressList的成员。

    on MSDN here 描述了另一种方法。

    如何:枚举 全局地址列表

    【讨论】:

    • 您好,感谢您的提示。我让它工作,很好。我几乎通过了 10k 个条目,然后抛出了一个错误,不确定它是什么,因为它没有说。我知道必须有更好的方法来查询 GAL,然后枚举整个列表(几乎 90k)
    • @Patrick - 某种光标或书签 API 对于允许分块处理很有用 - 不知道 Outlook 是如何这么快做到这一点的。正如你所指出的,肯定不是这种方式。
    • 我有一个错误应用程序不包含会话的定义。这种情况下怎么办?
    • MSDN 示例代码仍然有效,所以我猜您要么没有包含 Application 类,要么选择了不正确的类?
    【解决方案2】:
    string[] names;
    Outlook.AddressLists addrLists = Application.Session.AddressLists; 
    Outlook.AddressList gal = addrLists["Global Address List"];
    
    //for a distrubution list do this...
    Outlook.AddressEntry entry = gal.AddressEntries["distribution list"];
    Outlook.ExchangeDistributionList exchDL = entry.GetExchangeDistributionList();
    Outlook.AddressEntries addrEntries = exchDL.GetExchangeDistributionListMembers();
    
    names = new string[addrEntries.Count];
    
    for (int i = 0; i < addrEntries.Count; i++)
    {
        Outlook.AddressEntry exchDLMember = addrEntries[i];
        names[i] = exchDLMember.Name;
    }
    
    return names;
    
    //for an individual you could do something like this...
    Outlook.AddressEntry entry = gal.AddressEntries["contact nickname"];
    
    Outlook.ContactItem contact = entry.GetContact();
    string name = contact.NickName;
    string email = contact.Email1Address;
    

    【讨论】:

      【解决方案3】:
      1. 安装 Outlook 互操作包Install-Package Microsoft.Office.Interop.Outlook
      2. 这是代码(取自 MSDN)
      using Microsoft.Office.Interop.Outlook;
      
      var application = new Application();
                  AddressList gal = application.Session.GetGlobalAddressList();
                  if (gal != null)
                  {
                      for (int i = 1; i < gal.AddressEntries.Count - 1; i++)
                      {
                          AddressEntry addrEntry = gal.AddressEntries[i];
      
                          if (addrEntry.AddressEntryUserType == OlAddressEntryUserType.olExchangeUserAddressEntry || 
                              addrEntry.AddressEntryUserType == OlAddressEntryUserType.olExchangeRemoteUserAddressEntry)
                          {
                              ExchangeUser exchUser = addrEntry.GetExchangeUser();
                              Console.WriteLine($"{ exchUser.Name } { exchUser.PrimarySmtpAddress }");
                          }
                          if (addrEntry.AddressEntryUserType == OlAddressEntryUserType.olExchangeDistributionListAddressEntry)
                          {
                              ExchangeDistributionList exchDL = addrEntry.GetExchangeDistributionList();
                              Console.WriteLine($"{ exchDL.Name } { exchDL.PrimarySmtpAddress }");
                          }
                      }
                  }
      

      【讨论】:

        猜你喜欢
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        • 2019-02-02
        • 2015-06-20
        • 2021-12-23
        • 1970-01-01
        相关资源
        最近更新 更多