如何在C#中使用OAuth2认证SMTP连接发送Office365邮件?
关于SMTP+OAuth2发送Office365邮件的方案验证与替代方案
当前方案的问题
你当前使用的scopes: https://graph.microsoft.com/.default是针对Microsoft Graph API的权限范围,不适用于SMTP+OAuth2场景。SMTP协议的OAuth2认证需要专门的权限范围,直接用这个令牌无法通过SMTP服务器的认证。
调整后可行的SMTP+OAuth2方案
如果要继续用SMTP+OAuth2发送邮件,需要做以下调整:
- 权限配置:在Azure AD应用注册中,添加应用权限:
SMTP.Send(属于Microsoft Exchange Online权限组),并完成管理员同意。 - 令牌获取:将scopes修改为
https://outlook.office365.com/SMTP.Send,用MSal库重新获取令牌。authority保持https://login.microsoftonline.com/TenantId不变,因为是租户级别的应用权限。 - SMTP服务器配置:连接Office365的SMTP服务器
smtp.office365.com,端口587(STARTTLS),认证方式选择OAuth2,使用获取到的令牌作为凭据。
替代方案:使用Microsoft Graph API发送邮件
如果不想调整SMTP相关配置,直接用已启用的Microsoft Graph权限,可调用Graph API的邮件发送接口完成操作,步骤如下:
- 确保应用已添加应用权限:
Mail.Send(Microsoft Graph下的权限),并完成管理员同意。 - 用现有的
https://graph.microsoft.com/.defaultscope获取令牌,然后调用Graph API:
这种方式无需处理SMTP连接,直接通过REST API完成邮件发送,更适配Microsoft 365的现代集成逻辑。POST https://graph.microsoft.com/v1.0/users/{userId}/sendMail Content-Type: application/json { "message": { "subject": "Test Email", "body": { "contentType": "Text", "content": "This is a test email sent via Graph API." }, "toRecipients": [ { "emailAddress": { "address": "recipient@example.com" } } ] }, "saveToSentItems": true }
内容的提问来源于stack exchange,提问作者Simba
相关产品推荐
相关产品推荐

