使用 SMTP 在 ASP.NET Core MVC 中发送电子邮件
阅读:127
点赞:0
一. 背景介绍
在一个旅行预订系统中,当用户预定车辆时,系统会触发两个电子邮件的发送。一封是发送给公司的服务邮件,包含预订的详细信息;另一封是发送给客户的确认邮件。本文将展示如何使用 C# 的 MailMessage
和 SmtpClient
类实现这一功能,并通过 AJAX 和 HTML 表单集成到前端。
二. CSHTML 代码及 AJAX 集成
以下是带有 AJAX 集成、验证和验证码功能的 CSHTML 代码示例:
<div class="booking_content">
<h2>在线预订您的行程</h2>
<form action="" method="post" id="booking_form" novalidate="novalidate" class="row booking_form">
<div class="col-md-6">
<div class="form-group">
<input type="text" class="form-control" name="name" placeholder=" 您的姓名">
<label class="border_line"></label>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<input type="text" class="form-control" name="subject" placeholder=" 主题">
<label class="border_line"></label>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<input type="text" class="form-control" name="email" placeholder=" 您的邮箱">
<label class="border_line"></label>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<input type="text" class="form-control" name="mobile" placeholder=" 电话">
<label class="border_line"></label>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<input type="text" class="form-control" name="stratdestination" placeholder=" 起始地点">
<label class="border_line"></label>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<input type="text" class="form-control" name="endDestination" placeholder=" 终点地点">
<label class="border_line"></label>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<input type="text" class="form-control date-input-css" name="timedate" placeholder=" 时间和日期">
<label class="border_line"></label>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<select class="form-control" name="cartype">
<option>--选择车辆类型--</option>
<option value="A/C Tata Indigo">A/C Tata Indigo</option>
<!-- 添加其他车辆类型 -->
</select>
<label class="border_line"></label>
</div>
</div>
<div class="col-lg-12">
<div class="form-group">
<button type="submit" value="submit" class="btn slider_btn dark_hover btnBookNow" id="btnSubmit">立即预订</button>
</div>
</div>
</form>
</div>
2.1. AJAX 功能及验证
@section Scripts {
<script type="text/javascript">
var iNumber = Math.floor(1000 + Math.random() * 9000); // 生成随机验证码
$(document).ready(function () {
$("#btnSubmit").prop("disabled", true); // 禁用按钮
$("#divGenerateRandomValues").html("<input id='txtNewInput' value='" + iNumber + "' disabled/>"); // 显示验证码
// 验证验证码
$("#btnSubmit").click(function (e) {
e.preventDefault(); // 阻止默认提交
if ($("#textInput").val() != iNumber) {
$('.errCap').text('验证码无效!'); // 显示错误信息
} else {
$('.errCap').text(''); // 清空错误信息
submitForm(); // 提交表单
}
});
// 实时检查验证码输入
$("#textInput").bind('input', function () {
$("#btnSubmit").prop('disabled', $("#textInput").val() != iNumber); // 根据验证码状态启用或禁用按钮
});
});
function submitForm() {
$('#booking_form').validate({
rules: {
name: { required: true, minlength: 2 },
subject: { required: true, minlength: 4 },
email: { required: true, email: true },
mobile: { required: true, minlength: 10, maxlength: 10, number: true },
stratdestination: { required: true, minlength: 2 },
endDestination: { required: true, minlength: 2 },
timedate: { required: true },
cartype: { required: true }
},
messages: {
name: { required: "请输入姓名", minlength: "至少 2 个字符" },
subject: { required: "请输入主题", minlength: "至少 4 个字符" },
email: { required: "请输入有效的邮箱" },
mobile: { required: "请输入有效的电话号码", minlength: "10 个字符" },
stratdestination: { required: "请输入起始地点" },
endDestination: { required: "请输入终点地点" },
timedate: { required: "请选择日期" },
cartype: { required: "请选择车辆类型" }
},
submitHandler: function (form) {
// 通过 AJAX 提交表单
$.ajax({
type: "POST",
url: "/Home/SendMail",
data: $(form).serialize(), // 序列化表单数据
success: function (response) {
$('#sccmodl').modal('show'); // 显示成功模态框
$('.indxmsg').html(response); // 显示返回信息
},
error: function () {
alert("发送表单时出错。"); // 错误提示
}
});
}
});
}
</script>
}
三. 邮件发送功能的控制器
3.1. 发送邮件的主要控制器动作
[HttpPost]
public ActionResult SendMail(string name, string email, string mobile, string subject, string timedate, string stratdestination, string endDestination, string cartype)
{
try
{
// 创建邮件消息
MailMessage mail = new MailMessage(); // 创建服务邮件
MailMessage forCustomer = new MailMessage(); // 创建客户确认邮件
SmtpClient smtpClient = new SmtpClient("mail.prakash.in", 587); // SMTP 客户端配置
// 配置 SMTP 客户端
smtpClient.UseDefaultCredentials = false; // 不使用默认凭据
smtpClient.Credentials = new NetworkCredential("service@prakash.in", "Bmbn0Dn26g6i~kybW"); // 设置凭据
smtpClient.EnableSsl = false; // 禁用 SSL
// 配置服务邮件
mail.To.Add("demopk@gmail.com"); // 发送到公司邮箱
mail.Bcc.Add("demo1pk.dev@gmail.com"); // 抄送
mail.From = new MailAddress("service@prakash.in", "公司名称"); // 发件人信息
mail.Subject = subject; // 邮件主题
mail.Body = GenerateServiceMailBody(name, email, mobile, subject, timedate, stratdestination, endDestination, cartype); // 生成邮件内容
mail.IsBodyHtml = true; // 邮件为 HTML 格式
// 配置客户确认邮件
forCustomer.To.Add(email); // 发送到客户邮箱
forCustomer.From = new MailAddress("service@prakash.in", "公司名称"); // 发件人信息
forCustomer.Subject = subject; // 邮件主题
forCustomer.Body = GenerateCustomerMailBody(name); // 生成客户邮件内容
forCustomer.IsBodyHtml = true; // 邮件为 HTML 格式
// 发送邮件
smtpClient.Send(mail); // 发送服务邮件
smtpClient.Send(forCustomer); // 发送客户邮件
return Json("邮件发送成功!请检查您的邮箱。"); // 返回成功信息
}
catch (SmtpException smtpEx)
{
// 记录 SMTP 异常
return Json($"SMTP 错误: {smtpEx.Message}"); // 返回错误信息
}
catch (Exception ex)
{
// 记录一般异常
return Json($"错误: {ex.Message}"); // 返回错误信息
}
}
四. 邮件模板生成
4.1. 服务邮件模板
private string GenerateServiceMailBody(string name, string email, string
mobile, string subject, string timedate, string stratdestination, string endDestination, string cartype)
{
return "<table cellspacing='0'>" +
"<tr><td colspan='2'>您的联系人信息:<br/></td></tr>" +
"<tr><td colspan='2'><b><br/> 姓名: " + name + " <br/> 邮箱: " + email + " <br/> 手机: " + mobile + " <br/> 主题: " + subject + " <br/> 预订日期: " + timedate + " <br/> 起始地点: " + stratdestination + " <br/> 终点地点: " + endDestination + " <br/> 预订车辆: " + cartype + " </b></td></tr>" +
"<tr><td colspan='2'><br/>请尽快与上述联系人联系。<br />谢谢!</td></tr>" +
"</table>";
}
4.2. 客户邮件模板
private string GenerateCustomerMailBody(string name)
{
return "<table cellspacing='0'>" +
"<tr><td colspan='2'>您好,<br/></td></tr>" +
"<tr><td colspan='2'><b><br/> " + name + " </b></td></tr>" +
"<tr><td colspan='2'><br/>感谢您的邮件。</td></tr>" +
"<tr><td colspan='2'><br/>请与我们联系。</td></tr>" +
"</table>";
}
五. 错误处理
错误处理是与外部服务(如 SMTP)交互时的关键部分。以下是两种异常处理机制:
catch (SmtpException smtpEx)
{
return Json($"SMTP 错误: {smtpEx.Message}"); // 处理 SMTP 错误
}
catch (Exception ex)
{
return Json($"错误: {ex.Message}"); // 处理其他一般错误
}
六. 结论
本文介绍了如何在 ASP.NET MVC 应用程序中使用 MailMessage
和 SmtpClient
实现结构化 HTML 邮件的发送。通过这种方式,您可以轻松自定义邮件模板、管理多个收件人并有效处理错误。在处理敏感信息(如邮件凭据)时,建议将这些值安全地存储在配置文件中,而不是硬编码在源代码中。
通过遵循这些结构,您可以无缝地将电子邮件功能添加到 MVC 应用程序中,为服务提供者和客户提供流畅的体验。