使用 C# (.NET) 发送电子邮件:System.Net.Mail 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

使用 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}");                    

推荐