javascript - Ajax 不发送电子邮件,但状态为 200
问题描述
我的 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()
页面时重新加载,但我不希望页面重新加载。
解决方案
问题是双重的:
- 您没有在请求中发送正文( xmlhttp.send() 没有参数)。用法见这里,注意POST示例:https ://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/send
- 当您的服务器没有所需的所有参数时,它会返回 200。如果它没有足够的信息来处理请求,则让它验证是否提供了它需要的所有参数,并返回 422(不可处理实体)或其他一些相关代码可能会很有用。
当您调用 this.submit() 时,它实际上是在提交表单(其中将包含参数)。为了发送 ajax 请求,您基本上需要从表单中获取值,构造一个您的服务器将接受的主体,然后发送它。
推荐阅读
- python - 循环绘制地图
- pytorch - Pytorch:参数的梯度保持为0
- c - C - 传递对malloc函数指针的引用?
- c# - 如何使用文件结果在.net core web api中取消正在进行的下载?
- java - 如果我的 searchView 搜索视图中没有任何内容,则显示所有用途为空
- angular - 公共临时 url .Net Core API Angular
- r - 按组更改绘图的 x 轴值和背景颜色
- javascript - 将道具传递到屏幕没有出现拳头时间
- java - Android 过滤“mp3”文件
- databricks - 从 Python 中的 Databricks Filestore 下载 CSV 文件不起作用