当前位置:首页 > 技术教程 > 正文

如何用ASP.NET发送邮件?两种方法解决常见发送失败问题

在ASP.NET中发送邮件主要有两种常用方法:使用 .NET Framework 内置的 System.Net.Mail 命名空间(已过时但可用)或使用更现代的第三方库 MailKit,以下是两种方法的详细说明和代码示例:

方法1:使用 System.Net.Mail(.NET 内置)

适用于 .NET Framework 或兼容环境,但官方已标记为过时(.NET Core 3.0+ 及 .NET 5+ 推荐用 MailKit)。

核心步骤:

  1. 添加命名空间:using System.Net; using System.Net.Mail;
  2. 配置 SMTP 客户端 (SmtpClient)
  3. 创建邮件对象 (MailMessage)
  4. 发送邮件

示例代码:

public void SendEmail(string to, string subject, string body) { try { // 发件人邮箱和密码(或应用专用密码) string from = "sender@example.com"; string password = "your_password"; // 推荐使用配置存储 // 配置 SMTP 客户端 SmtpClient smtpClient = new SmtpClient("smtp.example.com", 587); // 如 smtp.gmail.com smtpClient.EnableSsl = true; // 启用 SSL/TLS smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new NetworkCredential(from, password); // 创建邮件 MailMessage mailMessage = new MailMessage(); mailMessage.From = new MailAddress(from); mailMessage.To.Add(to); mailMessage.Subject = subject; mailMessage.Body = body; mailMessage.IsBodyHtml = true; // 支持 HTML 内容 // 添加附件(可选) Attachment attachment = new Attachment("C:/file.pdf"); mailMessage.Attachments.Add(attachment); // 发送邮件 smtpClient.Send(mailMessage); // 清理资源 attachment.Dispose(); } catch (Exception ex) { // 错误处理 Console.WriteLine($"发送失败: {ex.Message}"); } }

注意事项:

  • 安全性:避免硬编码密码,使用 ConfigurationManager 或环境变量存储凭据。
  • 端口:常用端口 587(TLS)或 465(SSL)。
  • 邮箱服务配置:需开启 SMTP 服务(如 Gmail 需启用“安全性较低的应用”或生成应用专用密码)。
  • 过时警告:在 .NET Core 3.0+ 中 SmtpClient 已被标记为 [Obsolete]。


方法2:使用 MailKit(推荐跨平台方案)

适用于所有 .NET 版本(包括 .NET Core/5/6+),更安全、高效且支持异步。

如何用ASP.NET发送邮件?两种方法解决常见发送失败问题 第1张

如何用ASP.NET发送邮件?两种方法解决常见发送失败问题 第2张

安装 NuGet 包:

Install-Package MailKit Install-Package MimeKit

示例代码:

using MimeKit; using MailKit.Net.Smtp; public async Task SendEmailAsync(string to, string subject, string body) { try { var message = new MimeMessage(); message.From.Add(new MailboxAddress("发件人名称", "sender@example.com")); message.To.Add(new MailboxAddress("收件人名称", to)); message.Subject = subject; // 构建邮件内容(支持 HTML + 纯文本) var bodyBuilder = new BodyBuilder(); bodyBuilder.HtmlBody = body; // HTML 内容 bodyBuilder.TextBody = "请使用支持HTML的邮件客户端查看"; // 纯文本回退 message.Body = bodyBuilder.ToMessageBody(); // 添加附件(可选) bodyBuilder.Attachments.Add("C:/file.pdf"); using (var client = new SmtpClient()) { // 连接 SMTP 服务器 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); } } catch (Exception ex) { Console.WriteLine($"发送失败: {ex.Message}"); } }

MailKit 优势:

  1. 跨平台支持:兼容 .NET Framework/Core/5/6+。
  2. 异步操作:原生支持 async/await 避免阻塞。
  3. 更安全的协议:支持 SecureSocketOptions(如 StartTls)。
  4. 高级功能:更完善的 MIME 处理、附件、邮件头控制等。


关键配置说明

配置项 值示例 说明
SMTP 服务器地址 smtp.gmail.com 根据邮箱服务商查询
端口 587 (TLS) / 465 (SSL) 优先使用 TLS
启用加密 EnableSsl=true 或 SecureSocketOptions.StartTls 必需启用加密
认证凭据 邮箱账号 + 密码/应用密码 Gmail 等需开启“允许不安全应用”


方法 适用场景 是否推荐新项目
System.Net.Mail 旧版 .NET Framework 项目维护 过时
MailKit 所有新项目(尤其 .NET Core/5/6+) 强烈推荐

推荐实践

  1. 新项目统一使用 MailKit
  2. 敏感凭据通过 Azure Key Vault环境变量AppSettings.json 存储。
  3. 使用 async/await 提升并发性能。

示例配置存储(appsettings.json):

{ "EmailSettings": { "SmtpServer": "smtp.example.com", "Port": 587, "Username": "sender@example.com", "Password": "your_secure_password" } }

如何用ASP.NET发送邮件?两种方法解决常见发送失败问题 第3张

0