首页 > 解决方案 > 无法发送电子邮件 - Azure MVC 站点在尝试通过控制器将表单发布到 ajax 请求时从 jquery.min.js:2 返回 404

问题描述

今晚部署一个网络应用程序。为什么找不到 /contact,我尝试了 fullurl.com/contact 和其他想法,但文件在那里,页面上的提交按钮一直告诉我不是。您是否发现以下可能导致此问题的任何问题?

在我使用新的 smtp 凭据重新部署之前,它运行良好。我可能错过的任何 azure 部署步骤会导致它在发布请求中找不到 /contact?

来自网站的错误:

contact 404 xhr jquery.min.js:2 222 B   44 ms

send    @   jquery.min.js:2
ajax    @   jquery.min.js:2
(anonymous) @   contact:381

家庭控制器.cs:

        [HttpPost]
        [Route("contact")]
        public JsonResult SendContactEmail(string name, string email, string message, string phone, string bot)
        {
            if (string.IsNullOrWhiteSpace(email) || string.IsNullOrWhiteSpace(message) || string.IsNullOrWhiteSpace(name))
            {
                return Json(false);
            }

            if (string.IsNullOrEmpty(bot))
            {
                string subject = String.Format("{0} my contact form", "");
                string messageBody = "<html><body style=\"font-family: Segoe UI, Helvetica, sans-serif;\">";

                var sb = new StringBuilder();

                sb.Append("Name: " + name);
                sb.Append("<br />");

                sb.Append("Email: " + email);
                sb.Append("<br />");

                sb.Append("Phone number: " + phone);
                sb.Append("<br />");

                sb.Append("Message: " + message);
                sb.Append("<br /> ");

                messageBody += sb.ToString();

                EmailHelper.SendEmail(new EmailInfo
                {
                    Body = messageBody,
                    FromName = "my name",
                    Subject = subject,
                    ToAddresses = new StringCollection { "myemail@email.com" }
                }, "");
            }

            return Json(true);
        }



        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }

    public class EmailInfo
    {
        public string FromName { get; set; }

        public StringCollection ToAddresses { get; set; }

        public string Subject { get; set; }

        public string Body { get; set; }
    }

    public class EmailHelper
    {
        public static bool SendEmail(EmailInfo emailInfo, string attachmentPath)
        {
            //TODO: From Email information -- Needs to be your email account username and password
            string smtpMailServer = "smtp.sendgrid.net";
            string smtpUserName = "account";
            string smtpPassword = "key";
            int smtpPort = 587;

            var oMailMessage = new MailMessage();
            var fromMailAddress = new MailAddress(smtpUserName, "my addy");
            oMailMessage.From = fromMailAddress;
            oMailMessage.IsBodyHtml = true;
            oMailMessage.Priority = MailPriority.High;
            oMailMessage.Subject = emailInfo.Subject;
            oMailMessage.Body = emailInfo.Body;

            foreach (string to in emailInfo.ToAddresses)
            {
                oMailMessage.To.Add(to);
            }

            var oSmtpClient = new SmtpClient(smtpMailServer, smtpPort);
            oSmtpClient.Credentials = new NetworkCredential(smtpUserName, smtpPassword);
            oSmtpClient.EnableSsl = false;

            try
            {
                oSmtpClient.Send(oMailMessage);
                return true;
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                return false;
            }
        }
    }
}

/contact 页面上出现的 Ajax 脚本:

    document.querySelector("form").addEventListener("submit", function (e) {
        e.preventDefault();

        $.ajax({
            type: 'post',
            url: '/contact',
            data: $(this).serialize(),
            success: function (res) {
                $(window).scrollTop(350);
                if (res) {
                    $(".contact-form").html("<h3 style='color: #c2ae79; text-align: center' class='wow fadeInUp' data-wow-duration='1s'>Thank you for contacting us! We will be in touch shortly.</p>");
                } else {
                    $(".contact-form").prepend("<h3 style='color: red; text-align: center'>Please check all required fields.</p>");
                }
            }
        });
    });

标签: jqueryajaxasp.net-mvcazure

解决方案


sendgrid 的帐户必须始终是“apikey”

        //TODO: From Email information -- Needs to be your email account username and password
        string smtpMailServer = "smtp.sendgrid.net";
        string smtpUserName = "account";
        string smtpPassword = "key";
        int smtpPort = 587;

因此,当您将其转换为电子邮件构造函数时:

var fromMailAddress = new MailAddress(smtpUserName, "my addy");

它会引发错误,如果您在实时网站上的已编译二进制文件中执行此操作,则会引发 404。

您可以在控制器文件中使用断点和 localhost 以查看更准确的错误消息。

更改电子邮件构造函数以接受实际电子邮件可解决此问题。


推荐阅读