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

时间:2018-08-18 13:30:53

标签: javascript ajax

我的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]

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

1 个答案:

答案 0 :(得分:1)

问题是双重的:

  1. 您没有随请求发送正文(xmlhttp.send()没有参数)。有关用法,请参见此处,并注意POST示例:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/send
  2. 您的服务器未提供所需的所有参数时,将返回200。如果它没有提供足够的信息来处理请求,则验证它是否已提供所需的所有参数,并返回422(不可处理实体)或其他相关代码,可能会是有益的。

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