在 C# (.NET) 中发送电子邮件:SmtpClient、MailKit 和 MimeKit
发送电子邮件是现代应用程序中的基本任务之一。在 C# (.NET) 生态系统中,既有内置工具(SmtpClient 类),也有强大的第三方库(MailKit 和 MimeKit)。在本指南中,我们将详细分析这两种方法,查看代码示例、SMTP 服务器配置、附件处理和 HTML 邮件编写。
1. 内置 SmtpClient (System.Net.Mail)
SmtpClient 类在 .NET Framework 和 .NET Core/5+(有限制)中可用。它易于使用,但不支持现代协议(例如 OAuth2),并且被认为已过时,不适用于新项目。
2. 安装和引入 MailKit
MailKit 是一个用于处理电子邮件的跨平台库。它完全异步,支持 SSL/TLS、OAuth2、S/MIME 和其他现代功能。通过 NuGet 安装:
dotnet add package MailKitdotnet add package MimeKit或者通过包管理器控制台:
Install-Package MailKitInstall-Package MimeKit3. 使用 SmtpClient 发送简单邮件的示例
使用内置 SmtpClient 的基本示例:
using System.Net;using System.Net.Mail;
public void SendSimpleEmail(){ var fromAddress = new MailAddress("sender@example.com", "发件人"); var toAddress = new MailAddress("recipient@example.com", "收件人"); const string fromPassword = "your_password"; const string subject = "邮件主题"; const string body = "邮件正文";
var smtp = new SmtpClient { Host = "smtp.example.com", Port = 587, EnableSsl = true, DeliveryMethod = SmtpDeliveryMethod.Network, UseDefaultCredentials = false, Credentials = new NetworkCredential(fromAddress.Address, fromPassword) };
using (var message = new MailMessage(fromAddress, toAddress) { Subject = subject, Body = body }) { smtp.Send(message); }}重要提示: 对于 Gmail、Yandex 和其他服务,必须使用应用密码或 OAuth2。
4. 使用 MailKit 发送电子邮件(推荐方式)
MailKit 提供了更灵活、更现代的 API。发送简单文本邮件的示例:
using MailKit.Net.Smtp;using MailKit.Security;using MimeKit;using System.Threading.Tasks;
public async Task SendEmailWithMailKitAsync(){ var message = new MimeMessage(); message.From.Add(new MailboxAddress("发件人", "sender@example.com")); message.To.Add(new MailboxAddress("收件人", "recipient@example.com")); message.Subject = "邮件主题"; message.Body = new TextPart("plain") { Text = "邮件正文" };
using (var client = new SmtpClient()) { await client.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls); await client.AuthenticateAsync("sender@example.com", "your_password"); await client.SendAsync(message); await client.DisconnectAsync(true); }}5. 发送带附件的 HTML 邮件
使用 MimeKit 创建多部分邮件(HTML + 附件):
public async Task SendHtmlEmailWithAttachmentAsync(){ var message = new MimeMessage(); message.From.Add(new MailboxAddress("发件人", "sender@example.com")); message.To.Add(new MailboxAddress("收件人", "recipient@example.com")); message.Subject = "带附件的 HTML 邮件";
var bodyBuilder = new BodyBuilder { HtmlBody = @"<h1>你好!</h1><p>这是一封带附件的 HTML 邮件。</p>", TextBody = "这是文本