如何通过Azure应用注册实现无交互使用O365邮箱发送邮件
解决方案
核心问题分析
你遇到的403权限错误,本质是Azure应用的权限配置类型错误,且应用未与目标发件邮箱建立授权关联:
- 服务端无交互场景必须使用应用权限(Application Permissions),而非委托权限(Delegated Permissions);
- 当前调用尝试代表指定邮箱发送,但应用未获得访问该邮箱的权限。
具体修复步骤
修正Azure应用权限配置
- 登录Azure门户,找到该应用的「API权限」页面;
- 删除现有可能的委托类型
Mail.Send权限,添加应用类型的Mail.Send权限(注意区分权限列表里的「Application」标签); - 点击「授予管理员同意」(必须由全局/Exchange管理员操作)。
建立应用与发件邮箱的关联
如果需要严格使用指定的发件邮箱(而非应用身份发送),需额外配置:- 通过Exchange Online PowerShell执行以下命令,给应用授予访问目标邮箱的权限:
New-ApplicationAccessPolicy -AppId <你的ClientID> -PolicyScopeGroupId <发件邮箱地址> -AccessRight RestrictAccess -Description "Allow app to send mail from specific mailbox"
若允许应用访问所有邮箱,可跳过此步(但遵循最小权限原则不推荐)。
- 通过Exchange Online PowerShell执行以下命令,给应用授予访问目标邮箱的权限:
代码验证(可选:沿用SMTP协议)
如果你想继续使用SMTP而非Graph API,可通过ClientSecret获取SMTP专用token,示例VB.NET代码:Dim tenantId As String = "你的TenantID" Dim clientId As String = "你的ClientID" Dim clientSecret As String = "你的ClientSecret" Dim smtpScope As String = "https://outlook.office365.com/.default" Dim credentials = New ClientSecretCredential(tenantId, clientId, clientSecret, New TokenCredentialOptions With {.AuthorityHost = AzureAuthorityHosts.AzurePublicCloud}) Dim token = credentials.GetTokenAsync(New TokenRequestContext({smtpScope})).Result.Token ' 然后使用SMTP客户端,设置OAuth2认证 Using smtp As New SmtpClient("smtp.office365.com", 587) smtp.EnableSsl = True smtp.Credentials = New NetworkCredential("发件邮箱地址", token, "Bearer") smtp.Send(mailMessage) End Using
关键说明
- 应用权限的
Mail.Send授予后,应用拥有发送邮件的权限,但默认需要明确指定允许访问的邮箱(通过Exchange命令); - 若继续使用Graph API的
Users(fromAddress).SendMail,确保权限已正确配置并完成管理员同意,无需额外代码修改(前提是应用已获得该邮箱的访问权限)。
内容的提问来源于stack exchange,提问作者G D
相关产品推荐
相关产品推荐

