Javascript Ajax不发送电子邮件,但状态为200

Javascript Ajax不发送电子邮件,但状态为200,javascript,ajax,Javascript,Ajax,我的Ajax有问题,我有代码: const sendForm = function () { action = 'contact'; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } else { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }

我的Ajax有问题,我有代码:

    const sendForm = function () {
        action = 'contact';

        if (window.XMLHttpRequest) {
            xmlhttp = new XMLHttpRequest();
        } else {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }

        xmlhttp.onreadystatechange = function () {
            if (this.readyState == 4 && this.status == 200) {
                const getMessageSend = document.querySelector("#messageSend");
                getMessageSend.classList.add("message-send");
                getMessageSend.innerText = "Thank you for sending an email. You will receive an answer shortly.";
            } else {
                const getMessageSendError = document.querySelector("#messageSendError");
                getMessageSendError.classList.add("message-send");
                getMessageSendError.classList.add("message-send-error");
                getMessageSendError.innerText = "An error occurred and the email was not sent.";
            }
        };

        xmlhttp.open("post", action, true);
        xmlhttp.send();

    };

    const sendMail = function() {

        options.form.addEventListener('submit', function (e) {
            e.preventDefault();
            let validate = true;
            const elementsRequired = document.querySelectorAll(":scope [formHr]");

            [].forEach.call(elementsRequired, function(element) {
                const type = element.type.toUpperCase();

                if (type === 'TEXT') {
                    if (!validateText(element)) {validate = false;}
                }

                if (type === 'EMAIL') {
                    if (!validateEmail(element)) {validate = false;}
                }

                if (type === 'NUMBER') {
                    if (!validateNumber(element)) {validate = false;}
                }

                if (type === 'FILE') {
                    if (!validateFile(element)) {validate = false;}
                }

                if (type === 'CHECKBOX') {
                    if (!validateCheckbox(element)) {validate = false;}
                }

            });
            if (validate) {
                sendForm();
            } else {
                return false;
            }

        });

    };
我的操作文件是正确的,因为当我删除Ajax并尝试仅使用PHP发送电子邮件时,电子邮件发送正确

Ajax返回状态200:

POST http://mypage.com/contact [HTTP/1.1 200 OK 231ms]

但是电子邮件没有到达邮箱,我必须在
sendForm()
之后添加
this.submit()
,然后电子邮件才能正确发送。但是当我添加
this.submit()
时,页面正在重新加载,但我不希望页面被重新加载。

问题有两方面:

  • 您没有随请求发送正文(xmlhttp.send()没有参数)。请参见此处了解用法,并注意帖子示例:
  • 您的服务器返回200,但它没有所需的所有参数。让它验证是否提供了所需的所有参数,如果它没有足够的信息来处理请求,则返回422(不可处理的实体)或其他一些相关代码,这可能是有益的

  • 当您调用this.submit()时,它实际上是在提交表单(其中将包含参数)。为了发送ajax请求,您基本上需要从表单中获取值,构造一个服务器将接受的主体,然后发送它。

    观察服务器日志。如果响应状态为200,则表示客户端没有错误。在任何情况下,发送邮件都是服务器的工作,JS对此无能为力。@31piy那么,为什么当我使用PHP(我正在删除AJAX)发送电子邮件时,电子邮件会正确发送呢。但是,当我使用AJAX时,电子邮件不会到达邮箱。这意味着服务器工作正常。你没有抓住要点。当您使用AJAX时,您使用的是JavaScript。当您不使用AJAX时,您很可能直接向服务器提交表单。但在任何情况下,AJAX本身并不对邮件无法送达负责。您还需要观察服务器上发生了什么。@31如果是共享主机,我无法检查服务器上发生了什么