【问题标题】:How to get contact list from Exchange Server?如何从 Exchange Server 获取联系人列表?
【发布时间】:2016-06-02 14:37:13
【问题描述】:

谁能告诉我从 Exchange Server 获取联系人列表的最简单方法?我正在使用 C#

据我所知,Exchange Web Services 仅适用于 Exchange Server 2007 及更高版本。那将是我的第一个选择,但我也想要以前版本的 Exchange(WebDav 或其他东西)的替代方案。目录服务不是一个选项。

【问题讨论】:

标签: c# exchange-server exchangewebservices


【解决方案1】:

这是使用 EWS 从您的联系人列表中获取联系人列表作为交换的方法。我还不确定如何从全局列表中获取联系人,一个小时前才看了 API。

private static void ListContacts(ExchangeService svc) {
    foreach (var v in svc.FindItems(WellKnownFolderName.Contacts,
                                    new ItemView(20))) {
        Contact contact = v as Contact;
        ContactGroup contactGroup = v as ContactGroup;

        //v.Load(); // Turns out you don't need to load for basic props.
        if (contact != null) {
            Console.WriteLine("Contact: {0} <{1}>",
                contact.DisplayName,
                contact.EmailAddresses[EmailAddressKey.EmailAddress1]);
        } else if (contactGroup != null) {
            Console.WriteLine("Contact Group: {0}", contactGroup.DisplayName);
            switch (svc.RequestedServerVersion) {
                case ExchangeVersion.Exchange2007_SP1:
                    ExpandGroupResults groupResults
                        = svc.ExpandGroup((contactGroup.Id));
                    foreach (var member in groupResults) {
                        Console.WriteLine("+ {0} <{1}>",
                            member.Name, member.Address);
                    }
                    break;
                case ExchangeVersion.Exchange2010:
                    foreach (GroupMember member in contactGroup.Members) {
                        Console.WriteLine("+ {0} <{1}>",
                        member.AddressInformation.Name,
                        member.AddressInformation.Address);
                    }
                    break;
                default:
                    Console.WriteLine(
                        "** Unknown Server Version: {0}",
                        svc.RequestedServerVersion);
                    break;
            }
        } else {
            Console.WriteLine("Unknown contact type: {0} - {1}",
                contact.GetType(), v.Subject);
        }
    }
}

我已省略创建详细服务,请查看Exchange Web Services API 了解更多信息。

【讨论】:

  • 我发现随托管 API 一起安装的 GettingStarted.doc 实际上对设置服务参考很有帮助
【解决方案2】:

首先,不要忘记添加对 Microsoft Exchange Web 服务库的引用。

private static void ConnectToExchangeService()
{
    service = new ExchangeService(); 
    service.Credentials = new WebCredentials(USERNAME, PASSWORD, DOMAIN_NAME);
    service.AutodiscoverUrl(USER_ADDRESS);
}

private static void ListGlobalContacts(ExchangeService service)
{
    /* passing true as the third parameter to "ResolveName" is important to
       make sure you get the contact details as well as the mailbox details */
    NameResolutionCollection searchResult = service.ResolveName(NAME_YOURE_LOOKING_FOR, ResolveNameSearchLocation.DirectoryOnly, true);
    foreach (NameResolution resolution in searchResult )
    {
        Console.WriteLine("name is " + resolution.Contact.DisplayName);
        Console.WriteLine("address is " + resolution.Mailbox.Address);
        Console.WriteLine("business phone is " + resolution.Contact.PhoneNumbers[PhoneNumberKey.BusinessPhone]);
        Console.WriteLine("mobile phone is " + resolution.Contact.PhoneNumbers[PhoneNumberKey.MobilePhone]);
    }
}

...Brett Ryan 已经提供了获取本地联系人列表的代码。

这种检索全局联系人列表(至少其中一个)的方法的问题在于,“ResolveName”函数最多返回 100 个联系人,因此,如果您的组织有更多的记录,那么您在麻烦。一种可能的解决方法(也是我实现的一种)是对每个字母进行单独搜索(假设您可以验证这样的搜索将始终返回少于 100 个结果)并将所有唯一条目串在一起到一个列表中。

【讨论】:

  • 嗨@shai tibber。在您的代码中,我看到有一个“NAME_YOURE_LOOKING_FOR”。但是,如果我不需要查找任何名称,但我想获取每个联系人怎么办?
  • @Hoang Trinh - 例如,您可以遍历字母表中的字母,并将新条目添加到唯一列表中。这不是一个完美的解决方案,因为在这种搜索中每个查询可能有超过 100 个结果。如果这不能解决您的问题,您可以尝试按两个字母搜索(“aa”、“ab”、“ac”等)
猜你喜欢
  • 1970-01-01
  • 2020-09-12
  • 2017-06-22
  • 2019-03-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多