使用 C# (.NET) 发送电子邮件:System.Net.Mail 完全指南
在现代 .NET 平台开发中,发送电子邮件的任务由标准库 System.Net.Mail 解决。这个内置工具无需安装额外的 NuGet 包,并提供了灵活的 API,用于通过 SMTP 服务器创建和发送邮件。在本文中,我们将详细解析该库的所有关键组件,查看代码示例、错误处理以及最佳实践。
库的主要类
System.Net.Mail 库包含三个主要类:
SmtpClient— 负责连接到 SMTP 服务器并发送消息。MailMessage— 表示邮件本身:主题、正文、发件人、收件人、附件。Attachment— 允许向邮件添加文件。
发送电子邮件的基本示例
让我们看一个最简单的场景:通过 Gmail SMTP 服务器发送纯文本邮件。请注意,由于双因素身份验证,使用 Gmail 需要应用密码(App Password)。
using System;using System.Net;using System.Net.Mail;
class Program{ static void Main() { var fromAddress = new MailAddress("your@gmail.com", "您的姓名"); var toAddress = new MailAddress("recipient@example.com", "收件人"); const string fromPassword = "您的应用密码"; const string subject = "来自 .NET 的测试邮件"; const string body = "你好!这封邮件是用 C# 发送的。";
var smtp = new SmtpClient { Host = "smtp.gmail.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); }
Console.WriteLine("邮件已发送!"); }}发送带附件的 HTML 邮件
通常需要发送 HTML 格式的邮件并附带文件。为此,请设置属性 IsBodyHtml = true 并使用 Attachments 集合。
using (var message = new MailMessage(fromAddress, toAddress)){ message.Subject = "月度报告"; message.IsBodyHtml = true; message.Body = "<h2>您好!</h2><p>您的报告在附件中。</p>";
// 添加附件 var attachment = new Attachment(@"C:\\reports\\report.pdf"); message.Attachments.Add(attachment);
smtp.Send(message);}异步发送 (async/await)
为了在现代应用程序中实现非阻塞发送,请使用 SendMailAsync。这在 Web 应用程序(ASP.NET Core)和带 UI 的桌面程序中尤为重要。
public async Task SendEmailAsync(){ using (var message = new MailMessage(fromAddress, toAddress) { Subject = "异步发送", Body = "邮件已异步发送" }) { await smtp.SendMailAsync(message); }}异常处理
在使用邮件服务器时,可能会出现错误:凭据错误、超时、DNS 问题。始终将发送操作包裹在 try-catch 中。
try{ smtp.Send(message); Console.WriteLine("发送成功。");}catch (SmtpException ex){ Console.WriteLine($"SMTP 错误:{ex.StatusCode} - {ex.Message}");}catch (Exception ex){ Console.WriteLine($"一般错误:{ex.Message}");