从所有Outlook联系人文件夹Microsoft Graph获取联系人

我使用Microsoft Graph使用以下代码检索联系人文件夹:

GraphServiceClient client = new GraphServiceClient(new DelegateAuthenticationProvider( (requestMessage) => { requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); return Task.FromResult(0); })); var contactsData = await client .Me .Contacts .Request() .Top(1000) .GetAsync(); 

上面的代码返回联系人,但只返回默认文件夹中的联系人。 我想从所有用户的文件夹中检索联系人。

我尝试先获取文件夹,然后尝试获取联系人,但是当联系人为null ,它会返回Null Reference Exception

 var Folders = client .Me .ContactFolders .Request() .Top(1000) .GetAsync(); Folders.Wait(); var contacts = Folders.Result.SelectMany(a => a.Contacts).ToList(); 

我现在没有环境在这台机器上进行测试,但据我所知,您可以使用选项查询参数来过滤子文件夹中的联系人。

  1. 你需要找出所有的子文件夹

    GET / users / {id | 通过UserPrincipalName} / contactFolders

  2. 收集所有子文件ID
  3. 在每个子文件夹中查找联系人

    GET / me / contactFolder / {id} / childFolders / {id} / contacts

有关更多联系人文件夹和联系人相关信息 请阅读这些文档。 自由软件开发 出版社/ htt / API / user_list_contacts

首先,此示例代码是在.net核心中创建的,您应该通过以下代码在配置中设置GraphScopes:

 "GraphScopes": "User.Read User.ReadBasic.All Mail.Send MailBoxSettings.ReadWrite Contacts.ReadWrite" 

另请注意,如果有多个文件夹,ContactFolders将仅返回结果。 永远不会返回默认的联系人文件夹。 如果用户没有其他文件夹,则返回空结果。 如果要获取主文件夹和分别获取它们所需的其他文件夹,请合并结果。

 // Get the defaultContacts var defaultContacts = await graphClient .Me .Contacts .Request() .GetAsync(); // Get the contactFolders var contactFolders = await graphClient .Me .ContactFolders .Request() .GetAsync(); // Use this to store the contact from all contact folder. List contactFolderContacts = new List(); if (contactFolders.Count > 0) { for (int i = 0; i < contactFolders.Count; i++) { var folderContacts = await graphClient .Me .ContactFolders[contactFolders[i].Id] .Contacts .Request() .GetAsync(); contactFolderContacts.AddRange(folderContacts.AsEnumerable()); } // This will combine the contact from main folder and the additional folders. contactFolderContacts.AddRange(defaultContacts.AsEnumerable()); } else { // This user only has the default contacts folder contactFolderContacts.AddRange(defaultContacts.AsEnumerable()); } // Use this to test the result. foreach (var item in contactFolderContacts) { Debug.WriteLine("first:" + item.EmailAddresses); }