【问题标题】:Get Contacts from All Outlook Contact folders Microsoft Graph从所有 Outlook 联系人文件夹中获取联系人 Microsoft Graph
【发布时间】:2018-08-09 06:28:33
【问题描述】:

我正在使用 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 Reference Exception,因为联系人是 null

var Folders = client
    .Me
    .ContactFolders
    .Request()
    .Top(1000)
    .GetAsync();

Folders.Wait();
var contacts = Folders.Result.SelectMany(a => a.Contacts).ToList();

【问题讨论】:

  • @downvoter 为什么要投反对票?如果您对该问题有具体问题,请在 cmets 中告诉我,以便我可以相应地修改问题
  • 获取ContactFolders 只返回文件夹,而不是其中的联系人。您需要为每个文件夹向.Contacts 单独请求以检索实际的联系人。

标签: c# microsoft-graph-api


【解决方案1】:

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

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

    GET /users/{id | userPrincipalName}/contactFolders

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

    GET /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

【讨论】:

    【解决方案2】:

    首先,此示例代码是在.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);
    }
    

    【讨论】:

    • 您的代码看起来不错,但我真的不同意您建议这些范围的原因。首先,我不确定这些会去哪里(什么“项目”?),但更重要的是,此所需的 only 范围是 Contacts.Read (不包括在您建议的范围中)。
    • @MarcLaFleur 确定这些 graphScope 是 .net 核心项目配置。
    • @MarcLaFleur 这是一个网络核心项目。我使用 Contacts.ReadWrite 来替换 Contacts.Read。最终用户可以根据自己的要求更改 GraphScope。
    • 我会对此进行测试并告诉你。我通过调用 api 来获取文件夹,然后传递文件夹的 id 以通过另一个 api 调用检索联系人来解决问题。我也会发布我的解决方案,如果这也有效,我会测试你的并标记为答案。
    • “我通过调用 api 来获取文件夹,然后传递文件夹的 id 以通过另一个 api 调用检索联系人来解决问题。”您的想法与我提供的代码相似,但我添加了一些额外的扩展代码。
    猜你喜欢
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多