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

Office 365禁用SMTP基本身份验证后.NET Framework如何实现邮件发送

可行的.NET Framework环境下对接Office 365邮件服务的身份验证方案

方案1:SMTP协议 + OAuth 2.0身份验证

微软目前仅淘汰了SMTP协议下的基本身份验证,SMTP协议本身仍可正常使用,该方案可沿用原有System.Net.Mail.SmtpClient组件做少量改造即可实现:

  • 操作步骤:
    • 在Azure AD中注册应用,为应用分配Office 365 Exchange Online下的SMTP.Send委托权限或应用权限,完成管理员同意
    • 实现OAuth 2.0客户端凭据流/资源所有者密码流(根据场景选择)获取访问令牌
    • 构造XOAUTH2格式的身份验证凭证传入SmtpClient即可
  • 代码改造示例:
// 先通过Azure AD身份验证接口获取到accessToken
string xoauth2Token = $"user={senderEmail}\u0001auth=Bearer {accessToken}\u0001\u0001";
var encodedToken = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(xoauth2Token));

SmtpClient objSmtpClient = new SmtpClient("smtp.office365.com", 587);
objSmtpClient.UseDefaultCredentials = false;
// 传入构造好的OAuth凭证,不需要使用明文密码
objSmtpClient.Credentials = new NetworkCredential(senderEmail, encodedToken);
objSmtpClient.EnableSsl = true;
// 其余邮件构造、发送逻辑保持原有实现即可
  • 适用场景:原有SMTP发送逻辑改动量极小,适合不想重构大量代码的场景。

方案2:调用Microsoft Graph API发送邮件

这是微软官方首推的替代方案,完全脱离SMTP协议,不存在身份验证兼容性问题,更适合后台无人值守的Azure WebJob场景:

  • 操作步骤:
    • 在Azure AD注册应用,为应用分配Microsoft Graph下的Mail.Send应用权限,完成管理员全局同意
    • 集成对应.NET Framework版本支持的Microsoft Graph SDK
    • 用客户端凭据流获取Graph访问令牌,调用发送邮件接口即可
  • 代码示例:
// 提前安装Microsoft.Graph、Microsoft.Identity.Client对应版本NuGet包
var confidentialClient = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithTenantId(tenantId)
    .Build();

var scopes = new[] { "https://graph.microsoft.com/.default" };
var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();

var graphClient = new GraphServiceClient(
    new DelegateAuthenticationProvider(async (requestMessage) => {
        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
    })
);

var message = new Message
{
    Subject = "邮件主题",
    Body = new ItemBody { ContentType = BodyType.Html, Content = "邮件正文内容" },
    ToRecipients = new List<Recipient> { new Recipient { EmailAddress = new EmailAddress { Address = "收件人邮箱地址" } } }
};

// 发件人邮箱需要和Azure AD应用权限绑定的目标邮箱一致
await graphClient.Users[senderEmail].SendMail(message, saveToSentItems: false).Request().PostAsync();
  • 适用场景:批量发送邮件稳定性更高,权限管控更精细,支持更多邮件拓展功能,推荐长期使用。

通用注意事项

  • 两种方案都要求运行环境的TLS版本不低于1.2,你已在App Service配置了TLS 1.2,无需额外调整
  • 若使用应用权限发送邮件,需提前限制Azure AD应用的发送权限仅作用于指定的发件人邮箱,避免权限过大引发安全问题

内容的提问来源于stack exchange,提问作者hiFI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:24:05