C# Windows服务发送邮件替代Basic Authentication的方案咨询
C# Windows服务替代Basic Auth发送邮件的实现方案
方案1:OAuth 2.0客户端凭据流 + SMTP AUTH(最小改动适配原有逻辑)
适合不想大幅修改现有SmtpClient发送逻辑的场景,操作步骤如下:
- 首先在Azure AD注册应用,分配
Office 365 Exchange Online > Application permissions > SMTP.SendAsApp权限,由租户管理员完成同意授权 - 提前为发件人邮箱开启SMTP AUTH权限
- 安装
Microsoft.Identity.ClientNuGet包获取访问令牌,示例代码如下:
var clientId = "你的Azure应用客户端ID"; var tenantId = "你的租户ID"; var clientSecret = "你的Azure应用客户端密钥"; var scopes = new[] { "https://outlook.office365.com/.default" }; var confidentialClient = ConfidentialClientApplicationBuilder .Create(clientId) .WithClientSecret(clientSecret) .WithTenantId(tenantId) .Build(); var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync(); var accessToken = authResult.AccessToken;
- 构造OAuth格式的认证凭证替换原有Basic Auth凭证,原有发送逻辑基本不变:
var senderEmail = "发件人邮箱地址"; var oauthLoginStr = $"user={senderEmail}\u0001auth=Bearer {accessToken}\u0001\u0001"; var authBase64 = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(oauthLoginStr)); using var client = new SmtpClient("smtp.office365.com", 587); client.EnableSsl = true; client.Credentials = new System.Net.NetworkCredential(senderEmail, authBase64); // 原有MailMessage构造、发送逻辑保持不变 client.Send(mailMessage);
方案2:Microsoft Graph API发送邮件(官方推荐长期方案)
SmtpClient已经被微软官方标记为过时接口,Graph API是后续主推的邮件操作方案,稳定性和功能扩展性更强,操作步骤如下:
- 在Azure AD注册应用,分配
Microsoft Graph > Application permissions > Mail.Send权限,由租户管理员完成同意授权 - 安装
Microsoft.Graph和Microsoft.Identity.ClientNuGet包,发送代码示例如下:
var clientId = "你的Azure应用客户端ID"; var tenantId = "你的租户ID"; var clientSecret = "你的Azure应用客户端密钥"; var scopes = new[] { "https://graph.microsoft.com/.default" }; var confidentialClient = ConfidentialClientApplicationBuilder .Create(clientId) .WithClientSecret(clientSecret) .WithTenantId(tenantId) .Build(); var authProvider = new ClientCredentialProvider(confidentialClient); var graphClient = new GraphServiceClient(authProvider); var message = new Message { Subject = "邮件主题", Body = new ItemBody { ContentType = BodyType.Html, Content = "邮件正文内容" }, ToRecipients = new List<Recipient>() { new Recipient { EmailAddress = new EmailAddress { Address = "收件人邮箱地址" } } } }; // 指定发件人邮箱发送邮件 await graphClient.Users["发件人邮箱地址"].SendMail(message, SaveToSentItems: false).Request().PostAsync();
其他可选适配方案
- 如果使用第三方邮件服务商(如SendGrid、国内企业邮等),可直接调用服务商提供的官方SDK,通过服务商的API密钥体系发送邮件,无需适配微软OAuth规则
- 如果是本地部署的Exchange服务器,不受Exchange Online停用Basic Auth的政策影响,原有逻辑可直接保留使用
内容的提问来源于stack exchange,提问作者Manthan Makani
相关产品推荐
相关产品推荐

