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

Azure租户管理员无法通过MS Graph应用权限读取Outlook邮箱

问题概述

我需要创建一个可读取Azure租户内任意收件箱的应用,相关信息如下:

  • 注册Azure的账户需可被该应用访问
  • 我的Outlook账户是Azure租户管理员账户,且为Office 365个人版账户

我已在Azure中创建应用并配置了MS Graph应用权限:

  • Mail.Read
  • User.Read.All
    且已完成管理员同意授权。

目前能成功列出租户内用户(列表仅显示我的账户),但尝试访问该账户的邮件文件夹时失败,代码及报错如下:

var scopes = new List<string> { "https://graph.microsoft.com/.default" };
var clientCredential = new ClientSecretCredential(Secrets.TenantId, Secrets.ClientId, Secrets.ClientSecret);
var graph = new GraphServiceClient(clientCredential, scopes);

try
{
    var users = await graph.Users.GetAsync();
    Console.WriteLine(users.Value.Count); // => 1

    // UserId == Azure User Object Id
    // var mailbox = await graph.Users[Secrets.UserId].MailFolders.GetAsync(); // => ResourceNotFound

    // UserEmail == My Outlook Account that created the Azure Tenant so the Admin of the Tenant
    // var mailbox = await graph.Users[Secrets.UserEmail].MailFolders.GetAsync(); // => ErrorInvalidUser

    // UserPrincipalName = {alias}@{my-outlook-account}.onmicrosoft.com
    // var mailbox = await graph.Users[Secrets.UserPrincipalName].MailFolders.GetAsync(); // => ResourceNotFound

    // UserIssuer = {my-outlook-account}.onmicrosoft.com
    // var mailbox = await graph.Users[Secrets.UserIssuer].MailFolders.GetAsync(); // => ResourceNotFound

    if (users != null && users.Value != null && users.Value.Any())
    {
        var json = JsonSerializer.Serialize(users.Value, new JsonSerializerOptions { WriteIndented = true });
        Console.WriteLine(json); // Show my user

        foreach (var user in users.Value)
        {
            var mailfolders = user.MailFolders.ToList(); // Throw because => MailFolders is null
            Console.WriteLine(mailfolders.Count);
        }
    }

}
catch (ODataError error)
{
    Console.WriteLine(error.Error.Code);
    Console.WriteLine(error.Error.Message);
    throw;
}
问题原因

你的Office 365个人版Outlook账户属于消费者邮箱服务(Outlook.com),而非Azure租户绑定的Exchange Online商业/教育版邮箱。MS Graph的Mail.Read应用权限仅对Exchange Online的工作/学校账户生效,无法访问消费者邮箱资源。同时,该账户在Azure租户中仅作为管理员身份存在,但没有对应的Exchange邮箱实例,因此调用邮件相关接口时会返回资源不存在或用户无效的错误。

解决方案

方案1:使用Exchange Online授权的工作/学校账户

如果要实现读取Azure租户内任意收件箱的需求,需要使用属于该租户的Office 365商业版/教育版账户(即工作/学校邮箱)。这类账户在租户内拥有对应的Exchange Online邮箱资源,配置Mail.Read应用权限并完成管理员同意后,即可通过应用权限模式正常访问其邮件文件夹。

方案2:访问个人版Outlook邮箱(需切换权限模式)

如果必须访问个人版Outlook邮箱,需放弃应用权限模式,改用委托权限模式:

  1. 在Azure应用中添加Mail.Read委托权限,并完成管理员同意(或用户授权)
  2. 修改代码使用授权码流程或交互式登录流程,例如改用InteractiveBrowserCredential或AuthorizationCodeCredential,作用域替换为new List<string> { "Mail.Read" },而非.default
  3. 运行代码时,需要个人版Outlook账户手动登录授权,应用才能获取访问邮箱的权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:25:17