在ASP.NET中发送邮件通常通过System.Net.Mail命名空间实现,以下是关键步骤和最佳实践:
SMTP基础配置
核心组件:SmtpClient类
usingSystem.Net;usingSystem.Net.Mail;varsmtpClient=newSmtpClient("smtp.yourprovider.com"){Port=587,//Gmail使用587,企业邮箱可能用25Credentials=newNetworkCredential("[email protected]","app-password"),//使用应用专用密码EnableSsl=true};
注意:Gmail需开启两步验证并生成应用密码,阿里云/腾讯企业邮箱需开启SMTP服务
完整邮件发送示例
publicvoidSendEmailWithAttachment(){try{varmailMessage=newMailMessage{From=newMailAddress("[email protected]"),Subject="订单确认#20261205",Body="<h1>感谢您的购买!</h1><p>订单详情见附件</p>",IsBodyHtml=true,Priority=MailPriority.High};mailMessage.To.Add("[email protected]");mailMessage.CC.Add("[email protected]");mailMessage.Attachments.Add(newAttachment("invoice.pdf"));usingvarsmtpClient=newSmtpClient("smtp.office365.com",587){Credentials=newNetworkCredential("user","pass"),EnableSsl=true};smtpClient.Send(mailMessage);}catch(SmtpExceptionex){//记录错误日志File.WriteAllText("mail_error.log",$"{DateTime.Now}:{ex.StatusCode}-{ex.Message}");}}
异步发送与性能优化
publicasyncTaskSendBulkEmailsAsync(List<string>recipients){vartasks=recipients.Select(asyncemail=>{usingvarmessage=newMailMessage("[email protected]",email){Subject="限时优惠通知",Body="专属折扣码:SALE30"};awaitsmtpClient.SendMailAsync(message);});awaitTask.WhenAll(tasks);//并行发送提升效率}
关键优化:
- 使用
SendMailAsync避免线程阻塞
- 复用SmtpClient实例(需线程安全)
- 连接池管理:设置
ServicePointManager.DefaultConnectionLimit
企业级解决方案
场景:每日发送10万+营销邮件
//使用MailKit替代SmtpClient(更高效安全)publicvoidSendWithMailKit(){varmessage=newMimeMessage();message.From.Add(newMailboxAddress("发件人","[email protected]"));message.To.Add(newMailboxAddress("收件人","[email protected]"));message.Subject="安全验证通知";varbodyBuilder=newBodyBuilder{HtmlBody=File.ReadAllText("email_template.html"),TextBody="纯文本备用内容"};bodyBuilder.Attachments.Add("security-guide.pdf");usingvarclient=newSmtpClient();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)));
云服务集成(AWSSES示例)
varclient=newAmazonSimpleEmailServiceClient("accessKey","secretKey",RegionEndpoint.USWest2);varrequest=newSendEmailRequest{Source="[email protected]",Destination=newDestination{ToAddresses=newList<string>{"[email protected]"}},Message=newMessage{Subject=newContent("云服务邮件测试"),Body=newBody{Html=newContent("<b>HTML内容</b>")}}};awaitclient.SendEmailAsync(request);//支持直接API调用
邮件模板引擎
使用Razor模板生成动态内容:
//安装Mvc.Razor.RuntimeCompilationpublicstringGenerateOrderEmail(Orderorder){vartemplate=@"<h2>订单@Model.OrderNumber</h2><p>产品:@Model.ProductName</p><p>总价:<b>@Model.TotalPrice.ToString(""C"")</b></p>";returnRazorEngine.Engine.Razor.RunCompile(template,"orderTemplate",null,order);}
常见故障排查:
- 连接超时:检查防火墙587/25端口
- 认证失败:确认是否启用TLS1.2+协议
- 进入垃圾箱:用Mail-Tester检测评分
企业关键系统建议:使用SendGrid、MailChimp等专业服务,自带送达率分析和合规管理
您在实际项目中遇到过邮件发送的哪些挑战?是送达率问题、性能瓶颈还是安全合规需求?欢迎分享您的场景,我们将针对性解答优化方案。