You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Graph API访问令牌并读取组织收件邮件数?代码问题排查

问题解答

1. 程序停止运行的原因

  • 权限配置问题:使用AcquireTokenForClient需要配置对应的应用权限(如User.Read.All),且必须由管理员授予权限。若权限未配置或未完成管理员同意,Graph API请求会返回权限不足错误,导致程序异常终止。
  • Authority地址无效:当前WithAuthority的路径错误,无法正常获取访问令牌,后续Graph API请求因无有效令牌失败,程序出现卡住或直接终止的情况。
  • 异步代码未正确等待:如果控制台应用的Main方法是同步方法,直接调用await方法时未通过.Wait()或.Result等待异步操作完成,主线程会提前退出,导致程序看似“停止运行”。

2. .WithAuthority的格式是否正确

格式完全错误。正确的Authority格式必须包含租户ID或租户域名,示例如下:

  • 使用租户ID:https://login.microsoftonline.com/{你的租户ID}/v2.0
  • 使用租户域名:https://login.microsoftonline.com/{你的租户域名,如contoso.com}/v2.0
  • 多租户应用针对所有组织:https://login.microsoftonline.com/common/v2.0

你当前的$token/v2.0是无效路径,无法完成OAuth2.0的令牌获取流程。

3. 其他获取令牌及读取全组织收件邮件数的方法

推荐使用微软Graph SDK提供的ClientCredentialProvider(比DelegateAuthenticationProvider更简洁规范),以下是完整示例代码:

示例代码

using Microsoft.Graph;
using Microsoft.Graph.Models;
using Microsoft.Identity.Client;
using System;
using System.Threading.Tasks;

namespace GraphConsoleDemo
{
    class Program
    {
        // 替换为你的应用配置
        private static readonly string ClientId = "你的客户端ID";
        private static readonly string ClientSecret = "你的客户端密钥";
        private static readonly string TenantId = "你的租户ID";
        private static readonly string[] Scopes = new[] { "User.Read.All", "Mail.Read" };

        static async Task Main(string[] args)
        {
            try
            {
                // 构建机密客户端
                var confidentialClient = ConfidentialClientApplicationBuilder
                    .Create(ClientId)
                    .WithAuthority($"https://login.microsoftonline.com/{TenantId}/v2.0")
                    .WithClientSecret(ClientSecret)
                    .Build();

                // 使用ClientCredentialProvider作为认证提供者
                var authProvider = new ClientCredentialProvider(confidentialClient, Scopes);
                var graphClient = new GraphServiceClient(authProvider);

                // 获取组织内所有用户(只返回必要字段)
                var users = await graphClient.Users.GetAsync(config =>
                {
                    config.QueryParameters.Select = new[] { "Id", "DisplayName" };
                });

                if (users.Value == null || users.Value.Count == 0)
                {
                    Console.WriteLine("未找到任何用户");
                    return;
                }

                // 遍历用户并统计收件箱邮件数量
                foreach (var user in users.Value)
                {
                    Console.WriteLine($"用户: {user.DisplayName}");
                    try
                    {
                        // 获取收件箱邮件总数(仅请求计数,不返回邮件内容)
                        var inboxStats = await graphClient.Users[user.Id].MailFolders["inbox"].Messages.GetAsync(config =>
                        {
                            config.QueryParameters.Top = 0;
                            config.Headers.Add("Prefer", "outlook.body-content-type=text");
                        });

                        Console.WriteLine($"收件箱邮件数量: {inboxStats.OdataCount ?? 0}\n");
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"获取邮件失败: {ex.Message}\n");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"程序异常: {ex.Message}");
            }

            Console.ReadLine();
        }
    }
}

关键说明

  • 需在Azure AD应用注册中添加User.Read.All和Mail.Read应用权限,并由管理员完成管理员同意。
  • 若要统计未读邮件,可在获取邮件的请求配置中添加筛选条件:config.QueryParameters.Filter = "IsRead eq false"。

内容的提问来源于stack exchange,提问作者neha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:12:31