使用C#与MimeKit发送邮件时的OAuth2认证问题求助
实现Outlook OAuth2认证发送邮件的正确方案
一、Azure AD应用注册准备
- 登录Azure门户,进入Azure Active Directory → 应用注册,创建新应用:
- 桌面/移动应用选「移动和桌面应用」,重定向URI填
https://login.microsoftonline.com/common/oauth2/nativeclient - Web应用选「Web应用/API」,配置对应重定向URI
- 桌面/移动应用选「移动和桌面应用」,重定向URI填
- 添加API权限:选择Microsoft Graph → 委托权限,添加
Mail.Send,完成后点击「授予管理员同意」(企业账号需此操作) - 记录客户端ID、租户ID(个人账号填
common)
二、获取OAuth2访问令牌
先安装NuGet包 Microsoft.Identity.Client,用MSAL库获取令牌:
using Microsoft.Identity.Client; var clientId = "你的客户端ID"; var tenantId = "你的租户ID或common"; var scopes = new[] { "https://outlook.office.com/Mail.Send" }; var app = PublicClientApplicationBuilder .Create(clientId) .WithTenantId(tenantId) .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient") .Build(); // 交互式授权(桌面应用适用) var authResult = await app.AcquireTokenInteractive(scopes).ExecuteAsync(); var accessToken = authResult.AccessToken;
注:后台服务场景建议用客户端凭据流(需配置应用权限),不推荐用户名密码流,微软已逐步限制该方式
三、MimeKit结合OAuth2发送邮件
修改原发送代码,重点修正SMTP连接的安全选项,并使用OAuth2认证:
var message = new MimeMessage(); message.From.Add(new MailboxAddress("Joey Tribbiani", "mymail@outlook.com")); message.To.Add(new MailboxAddress("Mrs. Chanandler Bong", "anothermail@outlook.com")); message.Subject = "Subject"; message.Body = new TextPart("plain") { Text = @"email message" }; using (var client = new MailKit.Net.Smtp.SmtpClient()) { // 关键:使用StartTls安全连接,而非直接SSL client.Connect("smtp.office365.com", 587, SecureSocketOptions.StartTls); // 初始化OAuth2认证机制 var oauth2 = new SaslMechanismOAuth2("mymail@outlook.com", accessToken); client.Authenticate(oauth2); client.Send(message); client.Disconnect(true); }
常见问题排查
- 检查访问令牌的权限:用JWT解析工具查看令牌的
scp字段,确认包含Mail.Send - 确保Azure应用的API权限已完成管理员同意(企业账号)
- 原代码中
Connect方法的第三个参数用false会导致安全连接不生效,这是OAuth2认证失败的常见原因,必须改为SecureSocketOptions.StartTls
内容的提问来源于stack exchange,提问作者Samuel Faioli SamuelRCS
相关产品推荐
相关产品推荐

