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

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.Client NuGet包获取访问令牌,示例代码如下:
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.Client NuGet包,发送代码示例如下:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:15:04