使用 SMTP 在 ASP.NET Core MVC 中发送电子邮件

发布:2024-09-26 10:34 阅读: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="&#xe08a  您的姓名">
                <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="&#xe06b  主题">
                <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="&#xe090  您的邮箱">
                <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="&#xe090  电话">
                <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="&#xe01d  起始地点">
                <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="&#xe01d  终点地点">
                <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="&#xe06b  时间和日期">
                <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: { requiredtrueminlength2 },
                    subject: { requiredtrueminlength4 },
                    email: { requiredtrueemailtrue },
                    mobile: { requiredtrueminlength10maxlength10numbertrue },
                    stratdestination: { requiredtrueminlength2 },
                    endDestination: { requiredtrueminlength2 },
                    timedate: { requiredtrue },
                    cartype: { requiredtrue }
                },
                messages: {
                    name: { required"请输入姓名"minlength"至少 2 个字符" },
                    subject: { required"请输入主题"minlength"至少 4 个字符" },
                    email: { required"请输入有效的邮箱" },
                    mobile: { required"请输入有效的电话号码"minlength"10 个字符" },
                    stratdestination: { required"请输入起始地点" },
                    endDestination: { required"请输入终点地点" },
                    timedate: { required"请选择日期" },
                    cartype: { required"请选择车辆类型" }
                },
                submitHandlerfunction (form{
                    // 通过 AJAX 提交表单
                    $.ajax({
                        type"POST",
                        url"/Home/SendMail",
                        data: $(form).serialize(), // 序列化表单数据
                        successfunction (response{
                            $('#sccmodl').modal('show'); // 显示成功模态框
                            $('.indxmsg').html(response); // 显示返回信息
                        },
                        errorfunction () {
                            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 应用程序中,为服务提供者和客户提供流畅的体验。