在ASP.NET中发送邮件通常通过System.Net.Mail命名空间实现,以下是关键步骤和最佳实践:

SMTP基础配置
核心组件:SmtpClient类
using System.Net;
using System.Net.Mail;
var smtpClient = new SmtpClient("smtp.yourprovider.com")
{
Port = 587, // Gmail使用587,企业邮箱可能用25
Credentials = new NetworkCredential("your@email.com", "app-password"), // 使用应用专用密码
EnableSsl = true
};
注意:Gmail需开启两步验证并生成应用密码,阿里云/腾讯企业邮箱需开启SMTP服务
完整邮件发送示例
public void SendEmailWithAttachment()
{
try
{
var mailMessage = new MailMessage
{
From = new MailAddress("sender@domain.com"),
Subject = "订单确认 #20261205",
Body = "<h1>感谢您的购买!</h1><p>订单详情见附件</p>",
IsBodyHtml = true,
Priority = MailPriority.High
};
mailMessage.To.Add("recipient@domain.com");
mailMessage.CC.Add("manager@domain.com");
mailMessage.Attachments.Add(new Attachment("invoice.pdf"));
using var smtpClient = new SmtpClient("smtp.office365.com", 587)
{
Credentials = new NetworkCredential("user", "pass"),
EnableSsl = true
};
smtpClient.Send(mailMessage);
}
catch (SmtpException ex)
{
// 记录错误日志
File.WriteAllText("mail_error.log", $"{DateTime.Now}: {ex.StatusCode}-{ex.Message}");
}
}
异步发送与性能优化
public async Task SendBulkEmailsAsync(List<string> recipients)
{
var tasks = recipients.Select(async email =>
{
using var message = new MailMessage("noreply@site.com", email)
{
Subject = "限时优惠通知",
Body = "专属折扣码:SALE30"
};
await smtpClient.SendMailAsync(message);
});
await Task.WhenAll(tasks); // 并行发送提升效率
}
关键优化:
- 使用
SendMailAsync避免线程阻塞- 复用SmtpClient实例(需线程安全)
- 连接池管理:设置
ServicePointManager.DefaultConnectionLimit
企业级解决方案
场景:每日发送10万+营销邮件
// 使用MailKit替代SmtpClient(更高效安全)
public void SendWithMailKit()
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("发件人", "sender@domain.com"));
message.To.Add(new MailboxAddress("收件人", "recipient@domain.com"));
message.Subject = "安全验证通知";
var bodyBuilder = new BodyBuilder
{
HtmlBody = File.ReadAllText("email_template.html"),
TextBody = "纯文本备用内容"
};
bodyBuilder.Attachments.Add("security-guide.pdf");
using var client = new SmtpClient();
client.Connect("smtp.mailgun.org", 587, SecureSocketOptions.StartTls);
client.Authenticate("api-key", "your-password");
client.Send(message);
client.Disconnect(true);
}
安全与反垃圾策略
- DKIM/DMARC配置:
<!-- 在DNS记录添加 --> v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC... ```过滤: - 避免使用"免费"、"促销"等敏感词 - HTML邮件中文本占比>60%
- 发送频率控制:
// 使用Polly实现重试策略 Policy.Handle<SmtpException>() .WaitAndRetry(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
云服务集成(AWS SES示例)
var client = new AmazonSimpleEmailServiceClient(
"accessKey",
"secretKey",
RegionEndpoint.USWest2);
var request = new SendEmailRequest
{
Source = "verified-email@yourdomain.com",
Destination = new Destination { ToAddresses = new List<string> { "to@example.com" } },
Message = new Message
{
Subject = new Content("云服务邮件测试"),
Body = new Body { Html = new Content("<b>HTML内容</b>") }
}
};
await client.SendEmailAsync(request); // 支持直接API调用
邮件模板引擎
使用Razor模板生成动态内容:
// 安装Mvc.Razor.RuntimeCompilation
public string GenerateOrderEmail(Order order)
{
var template = @"
<h2>订单 @Model.OrderNumber</h2>
<p>产品: @Model.ProductName</p>
<p>总价: <b>@Model.TotalPrice.ToString(""C"")</b></p>";
return RazorEngine.Engine.Razor.RunCompile(template, "orderTemplate", null, order);
}
常见故障排查:

- 连接超时:检查防火墙587/25端口
- 认证失败:确认是否启用TLS1.2+协议
- 进入垃圾箱:用Mail-Tester检测评分
企业关键系统建议:使用SendGrid、MailChimp等专业服务,自带送达率分析和合规管理
您在实际项目中遇到过邮件发送的哪些挑战?是送达率问题、性能瓶颈还是安全合规需求?欢迎分享您的场景,我们将针对性解答优化方案。
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/23519.html