为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
largeQ 2021-11-21 14:46:50
我正在使用 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();上面的代码返回联系人,但只返回默认文件夹中的联系人。我想从用户的所有文件夹中检索联系人。我试过先获取文件夹,然后获取他们的联系人,但它返回 a Null Reference Exceptionas Contacts are null。var Folders = client    .Me    .ContactFolders    .Request()    .Top(1000)    .GetAsync();Folders.Wait();var contacts = Folders.Result.SelectMany(a => a.Contacts).ToList();
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

首先,此示例代码是在 .net core 中创建的,您应该通过以下代码在配置中设置 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<Contact> contactFolderContacts = new List<Contact>();


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);

}


查看完整回答
反对 回复 2021-11-21
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

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

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

    获取 /users/{id | userPrincipalName}/contactFolders

  2. 收集所有子文件夹 ID

  3. 在每个子文件夹中查找联系人

    获取 /me/contactFolder/{id}/childFolders/{id}/contacts

有关更多联系人文件夹和联系人相关信息。请阅读这些文档。 https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_list_contactfolders https://developer.microsoft.com/en-us/graph/docs/api-reference/beta /api/user_list_contacts


查看完整回答
反对 回复 2021-11-21
  • 2 回答
  • 0 关注
  • 225 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信