我正在尝试使用 EWS 获取所有联系人(全局地址列表和用户联系人文件夹(。
到目前为止尝试的选项:
-
Service.ResolveName("SMTP:"( -这有仅获取的限制 前 100 个字符,因为我想获得所有联系人,以便我可以 与分页一起显示在网格中。此外,打开 returnContactDetail = true(以及特定于联系人架构的属性集(不会返回联系信息,例如(显示名称、公司名称等(。
NameResolutionCollection nd = service。ResolveName("SMTP:", ResolveNameSearchLocation.ContactsThenDirectory, true, new PropertySet(BasePropertySet.IdOnly, new PropertyDefinitionBase[] { ContactSchema.ParentFolderId, ContactSchema.Id, ContactSchema.DisplayName, ContactSchema.EmailAddress1, ContactSchema.EmailAddress2, ContactSchema.EmailAddress3, ContactSchema.CompanyName }((;
-
服务。FindItems(WellKnownFolderName.Contacts,new ItemView( -这仅从用户的联系人文件夹而不是全局地址列表中返回联系人,并且我们还需要使用ResolveName解析电子邮件地址,因为Emailadderess集合提供了不是SMTP格式(abc@company.com(的Exchange格式电子邮件地址。
EWS 中唯一的其他选择是使用 FindPeople 操作 https://learn.microsoft.com/en-us/exchange/client-developer/web-service-reference/findpeople-operation 如果您知道全局地址列表的 GUID,您应该能够将整个事情分页回来,例如。
FindPeopleType fpType = new FindPeopleType();
IndexedPageViewType indexPageView = new IndexedPageViewType();
indexPageView.BasePoint = IndexBasePointType.Beginning;
indexPageView.Offset = 0;
indexPageView.MaxEntriesReturned = 100;
indexPageView.MaxEntriesReturnedSpecified = true;
fpType.IndexedPageItemView = indexPageView;
fpType.ParentFolderId = new TargetFolderIdType();
DistinguishedFolderIdType contactsFolder = new DistinguishedFolderIdType();
AddressListIdType adList = new AddressListIdType();
adList.Id = "2117949e-abe8-4915-91eb-6b9f867fd8de";
fpType.ParentFolderId.Item = adList;
FindPeopleResponseMessageType fpm = null;
do
{
fpm = esb.FindPeople(fpType);
if (fpm.ResponseClass == ResponseClassType.Success)
{
foreach (PersonaType PsCnt in fpm.People) {
Console.WriteLine(PsCnt.EmailAddress.EmailAddress);
}
indexPageView.Offset += fpm.People.Length;
}
else {
throw new Exception("Error");
}
} while (fpm.TotalNumberOfPeopleInView > indexPageView.Offset);
否则,请考虑不使用 EWS 并直接使用目录,例如,如果其内部部署通过 System.DirectoryServices 使用 LDAP,或者如果其 Office365,那么您可以使用图形访问所有目录对象。