.NET Core环境下基于Exchange实现Outlook邮件发送的技术咨询
.NET Core 基于Exchange(Office365)邮件发送服务实现指南
标准服务配置参数
使用Outlook/Office365 Exchange服务发信,SMTP配置固定为:
- 服务器地址:smtp.office365.com
- 端口:587
- 加密方式:STARTTLS
- 认证要求:需使用有效的域账号邮箱及对应密码,账号需开启SMTP提交权限
现有代码问题修正
你当前的代码存在两处核心错误:
NetworkCredential构造方法的第三个参数为域名字段,不是SMTP服务器地址,Office365个人账号无需传该参数,企业域账号传入企业所属域名即可- .NET Core/.NET 5+ 官方已将原生
SmtpClient标记为过时,更推荐使用MailKit库实现邮件发送,兼容性和安全性更优
推荐实现方案(MailKit)
步骤1:安装依赖NuGet包
Install-Package MailKit Install-Package MimeKit
步骤2:配置类定义(适配Options模式)
public class MailOptions { // 发信人邮箱 public string SenderEmail { get; set; } // 发信人昵称 public string SenderName { get; set; } // 邮箱密码/应用密码 public string Password { get; set; } // SMTP服务器地址:固定填smtp.office365.com public string SmtpServer { get; set; } // SMTP端口:固定填587 public int SmtpPort { get; set; } // 企业域名(个人账号可留空) public string Domain { get; set; } }
步骤3:邮件发送实现代码
using MailKit.Net.Smtp; using MimeKit; using Microsoft.Extensions.Options; public class MailService { private readonly MailOptions _mailOptions; public MailService(IOptions<MailOptions> mailOptions) { _mailOptions = mailOptions.Value; } public async Task<bool> SendMailAsync(string receiverEmail, string subject, string emailBody, bool isBodyHtml = true) { // 构建邮件内容 var message = new MimeMessage(); message.From.Add(new MailboxAddress(_mailOptions.SenderName, _mailOptions.SenderEmail)); message.To.Add(new MailboxAddress("", receiverEmail)); // 抄送自己,和原有逻辑保持一致 message.Cc.Add(new MailboxAddress(_mailOptions.SenderName, _mailOptions.SenderEmail)); message.Subject = subject; message.Body = new TextPart(isBodyHtml ? "html" : "plain") { Text = emailBody }; // 发送邮件 using var client = new SmtpClient(); // 连接SMTP服务器,最后一个参数useSsl填false,服务会自动升级为STARTTLS加密 await client.ConnectAsync(_mailOptions.SmtpServer, _mailOptions.SmtpPort, false); // 关闭OAuth2认证,使用密码认证 client.AuthenticationMechanisms.Remove("XOAUTH2"); // 传入认证信息,域名非必填 if (string.IsNullOrEmpty(_mailOptions.Domain)) { await client.AuthenticateAsync(_mailOptions.SenderEmail, _mailOptions.Password); } else { await client.AuthenticateAsync(_mailOptions.Domain, _mailOptions.SenderEmail, _mailOptions.Password); } await client.SendAsync(message); await client.DisconnectAsync(true); return true; } }
原生SmtpClient修正版(不推荐)
如果你坚持使用原生SmtpClient,修正后的代码如下:
MailMessage mailMessage = new MailMessage(_options.Value.Mailbox, receiverEmail, subject, emailBody); mailMessage.IsBodyHtml = true; mailMessage.BodyEncoding = System.Text.UTF8Encoding.UTF8; mailMessage.CC.Add(_options.Value.Mailbox); using SmtpClient client = new SmtpClient(_options.Value.Server, _options.Value.Port); client.EnableSsl = true; client.Timeout = 100000; client.DeliveryMethod = SmtpDeliveryMethod.Network; client.UseDefaultCredentials = false; // 修正:第三个参数为域名,无域名则不传该参数 client.Credentials = new NetworkCredential(_options.Value.Email, _options.Value.Password); await client.SendMailAsync(mailMessage); return true;
注意事项
- 如果账号开启了多因素认证(MFA),需要在账号后台生成应用专用密码用于SMTP认证
- 企业租户管理员需要开启对应账号的SMTP提交权限,否则会发送失败
内容的提问来源于stack exchange,提问作者sachind
相关产品推荐
相关产品推荐

