使用SmtpClient类 (System.Net.Mail)
这是ASP.NET内置的传统方法,直接利用.NET Framework的System.Net.Mail命名空间,它通过SMTP协议与邮件服务器通信。

using System.Net;
using System.Net.Mail;
public void SendEmailWithSmtpClient()
{
var fromAddress = new MailAddress("sender@example.com", "Sender Name");
var toAddress = new MailAddress("recipient@example.com", "Recipient Name");
const string subject = "Test Email via SmtpClient";
const string body = "This is a test email sent using the .NET SmtpClient class.";
var smtp = new SmtpClient
{
Host = "smtp.example.com", // 你的SMTP服务器地址
Port = 587, // 常用端口:25, 465(SSL), 587(TLS)
EnableSsl = true, // 根据服务器要求启用SSL/TLS
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential("sender@example.com", "your_password")
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body
})
{
smtp.Send(message);
}
}
核心特点与注意事项:
- 直接集成: .NET Framework/Core 原生支持。
- 配置灵活: 可通过代码或
web.config/appsettings.json配置服务器、端口、凭证等。 - 过时警告: 在.NET 6+中,
SmtpClient被标记为[Obsolete],虽然仍可使用,但官方建议考虑替代方案(如MailKit),因其同步API和设计在现代异步场景中不够理想,且维护更新有限。 - 安全性: 务必使用
EnableSsl = true(通常端口587)或显式使用SSL(端口465)加密传输,避免使用明文端口25。 - 发送附件/HTML: 使用
message.Attachments.Add(new Attachment(filePath))添加附件;设置message.IsBodyHtml = true发送HTML邮件。
使用MailKit库
MailKit是一个强大、现代、开源且跨平台的.NET邮件库,由.NET基金会成员开发,是官方推荐的SmtpClient替代品,它支持IMAP, POP3和SMTP,性能优异且完全异步。
步骤:
- 安装NuGet包:
Install-Package MailKitInstall-Package MimeKit - 编写发送代码:
using MailKit.Net.Smtp;
using MimeKit;
using MimeKit.Text;
public async Task SendEmailWithMailKitAsync()
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Sender Name", "sender@example.com"));
message.To.Add(new MailboxAddress("Recipient Name", "recipient@example.com"));
message.Subject = "Test Email via MailKit";
message.Body = new TextPart(TextFormat.Html) // 使用TextFormat.Plain发送纯文本
{
Text = "<b>This is a test email</b> sent using the <i>MailKit</i> library."
};
// 添加附件示例
var attachment = new MimePart("application", "pdf")
{
Content = new MimeContent(File.OpenRead("report.pdf")),
ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
ContentTransferEncoding = ContentEncoding.Base64,
FileName = Path.GetFileName("report.pdf")
};
var multipart = new Multipart("mixed");
multipart.Add(message.Body);
multipart.Add(attachment);
message.Body = multipart;
using (var client = new SmtpClient())
{
// 配置证书验证 (生产环境应谨慎处理)
client.ServerCertificateValidationCallback = (s, c, h, e) => true; // 仅测试,信任所有证书
await client.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls); // 推荐使用StartTls
await client.AuthenticateAsync("sender@example.com", "your_password");
await client.SendAsync(message);
await client.DisconnectAsync(true);
}
}
核心优势:

- 现代且活跃: 积极维护更新,拥抱.NET异步编程模型(
async/await)。 - 高性能与稳定: 专为高效处理和大量邮件操作设计。
- 协议支持全面: 深度支持SMTP、IMAP、POP3及其扩展功能(如IDLE)。
- 安全最佳实践: 提供更精细的SSL/TLS控制选项(
SecureSocketOptions)。 - 跨平台: 完美支持.NET Core, .NET 5/6/7/8+, Xamarin等。
- MIME处理强大:
MimeKit提供卓越的MIME消息创建和解析能力。
使用SendGrid等第三方邮件服务API
对于需要高送达率、可扩展性、邮件追踪、统计分析、模板管理等功能的应用,集成专业的云端邮件服务(ESPs – Email Service Providers)是首选,SendGrid是其中代表。
步骤:
- 注册SendGrid账号并创建API Key。
- 安装NuGet包:
Install-Package SendGrid - 编写发送代码 (使用SendGrid v12 C#库):
using SendGrid;
using SendGrid.Helpers.Mail;
public async Task SendEmailWithSendGridAsync()
{
var apiKey = Environment.GetEnvironmentVariable("SENDGRID_API_KEY"); // 从安全配置读取
var client = new SendGridClient(apiKey);
var from = new EmailAddress("sender@example.com", "Sender Name");
var to = new EmailAddress("recipient@example.com", "Recipient Name");
var subject = "Test Email via SendGrid";
var plainTextContent = "This is a plain text test email sent using SendGrid.";
var htmlContent = "<strong>This is an HTML test email</strong> sent using SendGrid.";
var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
// 添加附件
var fileBytes = File.ReadAllBytes("document.pdf");
var fileBase64 = Convert.ToBase64String(fileBytes);
msg.AddAttachment("document.pdf", fileBase64, "application/pdf");
var response = await client.SendEmailAsync(msg);
if (response.StatusCode != HttpStatusCode.Accepted)
{
// 处理发送失败情况
}
}
核心优势:
- 高送达率保障: 服务商维护优质IP信誉池,专业处理垃圾邮件规避。
- 强大的API与功能: 模板引擎、邮件追踪(打开、点击)、统计分析、事件Webhook、A/B测试、列表管理等。
- 卓越的可扩展性: 轻松应对发送量激增。
- 易集成与管理: 提供友好的控制台、详尽的文档和SDK。
- 合规性支持: 协助满足GDPR等法规要求。
- 其他提供商: Amazon SES, Mailgun, Postmark, SparkPost等也提供类似服务,选择取决于成本、功能需求和发送量。
使用FluentEmail等封装库
FluentEmail是一个流行的开源库,为发送邮件提供了一个流畅、简洁的接口,并支持多种发送后端(Renderer如Razor, SendGrid, SMTP等),它简化了邮件构造过程。

步骤:
- 安装NuGet包 (示例使用Smtp发送和Razor模板):
Install-Package FluentEmail.Core
Install-Package FluentEmail.Smtp
Install-Package FluentEmail.Razor - 配置与发送:
using FluentEmail.Core;
using FluentEmail.Razor;
using FluentEmail.Smtp;
// 配置全局发件人 (通常在Startup中配置一次)
Email.DefaultSender = new SmtpSender(() => new System.Net.Mail.SmtpClient("smtp.example.com")
{
EnableSsl = true,
Port = 587,
Credentials = new NetworkCredential("sender@example.com", "your_password")
});
Email.DefaultRenderer = new RazorRenderer();
// 发送邮件
public async Task SendEmailWithFluentEmailAsync()
{
var template = @"<html><body><h1>Hello @Model.FirstName,</h1><p>Your order id is @Model.OrderId.</p></body></html>";
var email = await Email
.From("sender@example.com", "Sender Name")
.To("recipient@example.com", "Recipient Name")
.Subject("Order Confirmation")
.UsingTemplate(template, new { FirstName = "John", OrderId = 12345 }) // 使用Razor模板和数据模型
.AttachFromFilename("invoice.pdf") // 添加附件
.SendAsync();
}
核心优势:
- 流畅易用的API: 链式调用使代码更清晰、更易读。
- 发送后端解耦: 核心API统一,可灵活切换底层发送方式(SMTP, SendGrid, Mailgun, 文件存储, 测试等)。
- 模板引擎支持: 内建支持Razor、Liquid等流行模板引擎,方便创建复杂HTML邮件。
- 简化常见任务: 附件添加、抄送/密送设置等操作更便捷。
- 测试友好: 提供
FluentEmail.Core.Models.Email对象,易于在单元测试中验证邮件内容。
关键选择因素总结与专业建议
- 新项目与现代化需求: 优先选择
MailKit,它代表了.NET邮件处理的现代最佳实践(异步、安全、跨平台、活跃维护),是SmtpClient的理想继任者,尤其在.NET Core/5+项目中是首选。 - 传统维护项目: 如果项目已稳定使用
SmtpClient且无升级压力,可继续使用,但需注意其过时状态和安全配置,评估迁移到MailKit的长期收益。 - 高要求生产环境: 强烈推荐集成SendGrid等专业邮件服务,对于需要保障送达率、获得详细分析、管理大量邮件模板、处理高发送量的应用,云邮件服务的价值远超其成本,它们解决了运维邮件服务器和IP信誉的复杂性问题。
- 追求开发体验与灵活性:
FluentEmail提供了极佳的开发体验,尤其当需要模板功能或计划支持多种发送后端时,它通常底层使用MailKit或SmtpClient或直接调用服务商API。 - 关键考量点:
- 项目类型与框架: (.NET Framework vs .NET Core/5+)
- 发送量级与可扩展性需求
- 对送达率、追踪分析、模板管理的需求强度
- 团队偏好与现有技术栈
- 安全性与合规性要求
- 预算考量 (第三方服务通常有免费层或按量付费)
哪种邮件发送方式最能解决你当前项目中的痛点?你在邮件集成方面最常遇到的挑战是什么?
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/23710.html