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中注册应用,为应用分配
- 代码改造示例:
// 先通过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访问令牌,调用发送邮件接口即可
- 在Azure AD注册应用,为应用分配
- 代码示例:
// 提前安装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
相关产品推荐
相关产品推荐

