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

.NET Core环境下基于Exchange实现Outlook邮件发送的技术咨询

.NET Core 基于Exchange(Office365)邮件发送服务实现指南

标准服务配置参数

使用Outlook/Office365 Exchange服务发信,SMTP配置固定为:

  • 服务器地址:smtp.office365.com
  • 端口:587
  • 加密方式:STARTTLS
  • 认证要求:需使用有效的域账号邮箱及对应密码,账号需开启SMTP提交权限

现有代码问题修正

你当前的代码存在两处核心错误:

  1. NetworkCredential构造方法的第三个参数为域名字段,不是SMTP服务器地址,Office365个人账号无需传该参数,企业域账号传入企业所属域名即可
  2. .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;

注意事项

  1. 如果账号开启了多因素认证(MFA),需要在账号后台生成应用专用密码用于SMTP认证
  2. 企业租户管理员需要开启对应账号的SMTP提交权限,否则会发送失败

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

相关产品推荐
方舟 Agent Plan

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

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