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

使用C#与MimeKit发送邮件时的OAuth2认证问题求助

实现Outlook OAuth2认证发送邮件的正确方案

一、Azure AD应用注册准备

  • 登录Azure门户,进入Azure Active Directory → 应用注册,创建新应用:
    • 桌面/移动应用选「移动和桌面应用」,重定向URI填https://login.microsoftonline.com/common/oauth2/nativeclient
    • Web应用选「Web应用/API」,配置对应重定向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:22:09