如何获取 Graph API 访问令牌和读取整个组织的传入邮件计数?

问题描述 投票:0回答:1

我正在尝试读取组织中的传入邮件数量及其中的用户。我在控制台应用程序中尝试了以下代码。但在这一行 - var users = await graphServiceClient.Users.Request().GetAsync(); application stopes running.

  1. 那么,为什么会这样?(我尝试使用调试器但没有错误)

  2. .WithAuthority 的格式对吗?

  3. 是否有任何替代方法来访问图形 api 令牌和读取整个组织中的传入邮件计数? 如果是,请帮我提供示例代码。

     var confidentialClient = ConfidentialClientApplicationBuilder.Create(clientId).WithAuthority($"https://login.microsoftonline.com/$token/v2.0").WithClientSecret(clientSecret).Build();
    
     GraphServiceClient graphServiceClient =
     new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) => {
    
    
     var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();
    
    requestMessage.Headers.Authorization =
    new AuthenticationHeaderValue("Bearer", authResult.AccessToken);}));
    
     var users = await graphServiceClient.Users.Request().GetAsync();
    
    foreach (Microsoft.Graph.User item in users)
    {
    
    Console.WriteLine(item.DisplayName);
    }
    
    Console.WriteLine(users.Count);
    

谢谢!

c# asp.net microsoft-graph-api access-token graphserviceclient
1个回答
0
投票

在 Ms graph api 中,我们没有一个可以查询整个组织中所有电子邮件的 API,我们只有一个 list message API 用于获取特定用户的电子邮件。而组织中的一些用户想要获取其他用户的邮件,我们通常需要有应用程序API权限,在文档中提到:

一个app可以在另一个app中获取消息有两种情况 用户的邮件文件夹:

如果应用有应用权限,或者,如果应用有 来自一个用户的适当委派权限,并且另一个用户具有 与该用户共享邮件文件夹,或者已授予对 那个用户。查看详细信息和示例。

关于应用api权限,是2种权限之一。委托API权限是指用户需要登录才能获得授权,授权允许用户访问自己的资源。应用API权限是指应用在请求授权,这个授权允许应用访问租户中所有用户的所有资源。

对于这个API,我们需要有

Mail.ReadBasic.All, Mail.Read, Mail.ReadWrite
应用程序API权限。

然后我们可以使用这样的代码(基于最新的图形 SDK)来获取特定用户的电子邮件计数:

using Microsoft.Graph;
using Azure.Identity;

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenant_name.onmicrosoft.com";
var clientId = "aad_app_id";
var clientSecret = "client_secret";
var clientSecretCredential = new ClientSecretCredential(
                tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

var result = await graphClient.Users["{user-id}"].Messages.GetAsync((requestConfiguration) =>
{
    requestConfiguration.QueryParameters.Count = true;
});

然后使用循环添加消息总数。顺便说一句,

graphServiceClient.Users.Request().GetAsync();
会返回租户中的所有用户,但我认为不是每个用户都有邮件许可证。

Ms Graph API只能访问租户中的资源,比如你邀请我的账号进入你的租户,我的账号是我的outlook邮箱([email protected]),我在这个邮箱里有很多邮箱,但是你无法通过 API 获取任何电子邮件信息。

那是因为当你邀请我的账号进入你的租户时,我的账号会有一个类似

tiny_outlook.com#EXT#@yourTenantName.onmicrosoft.com
的原则,你还需要为这个原则添加一个license(比如M365 E3 license会提供email功能),然后API可以根据这个原理查询邮件。如果您不分配此类许可证,则该原则将没有电子邮件地址,因此不会有任何有关该原则的电子邮件。

© www.soinside.com 2019 - 2024. All rights reserved.