如何通过Graph API从多Office365/Outlook账户发邮件?遇权限问题求助
解决Graph API发送邮件时的ErrorAccessDenied问题
核对应用权限配置
- 必须在Azure AD应用注册中为服务账户添加应用类型权限(而非委托权限),具体需要添加
Mail.Send权限,且该权限必须经过租户管理员的同意授权。 - 若需要代表其他用户发送邮件,需添加
Mail.Send.Shared应用权限,同时确保目标邮箱已向服务账户开放对应权限。
确认认证流程正确
- 使用服务账户调用Graph API时,必须采用客户端凭证流(Client Credentials Flow),不能使用委托流。示例代码如下:
var scopes = new[] { "https://graph.microsoft.com/.default" }; var tenantId = "你的租户ID"; var clientId = "应用注册的Client ID"; var clientSecret = "应用注册的Client Secret"; var credential = new ClientSecretCredential(tenantId, clientId, clientSecret, new ClientSecretCredentialOptions { AuthorityHost = AzureAuthorityHosts.AzurePublicCloud }); var graphClient = new GraphServiceClient(credential, scopes); // 构造邮件并发送 var emailMessage = new Message { Subject = "测试邮件", Body = new ItemBody { ContentType = BodyType.Text, Content = "这是通过Graph API发送的测试邮件" }, ToRecipients = new List<Recipient> { new Recipient { EmailAddress = new EmailAddress { Address = "收件人邮箱@域名.com" } } } }; // 注意:必须指定具体发送用户的UPN或ID,不能用Me await graphClient.Users["发件人邮箱@域名.com"].SendMail.PostAsync(emailMessage);
验证目标邮箱的发送权限
- 若代表其他用户发邮件,需为目标邮箱配置服务账户的发送权限:
- 登录Exchange管理中心,找到对应邮箱,进入「权限」设置。
- 添加服务账户为「发送代理」或「代表发送」权限。
- 也可通过PowerShell快速配置:
Add-RecipientPermission "发件人邮箱@域名.com" -Trustee "服务账户UPN" -AccessRights SendAs
检查权限同意状态
- 进入Azure AD应用注册的「API权限」页面,确认
Mail.Send或Mail.Send.Shared权限的状态为「已同意」,若未同意需由租户管理员完成授权操作。
内容的提问来源于stack exchange,提问作者Prashant Girase
相关产品推荐
相关产品推荐

