我有一些简短的问题。我有一个表单,我通过jQuery的Ajax发送,它的工作方式我想要它。如果我禁用JavaScript,表单也通过服务器端发送,它也可以工作。当我通过Ajax发送表单时,表单发送并且我有一个微调器(添加一个带有beforeSend
的类),并且成功时我会显示一条感谢信息。问题1是,(这可能很愚蠢),Ajax如何确定邮件是否成功发送? (我目前正在使用PHPMailer从我的localhost发送邮件)。
或者更确切地说,“成功”是基于能够将表单数据发送到处理文件吗?我的成功消息是“谢谢你,你的消息已被发送”,如果消息实际上没有被发送,我不想显示它,但是Ajax仍然显示它,因为它能够与邮件处理文件进行交互。我当然通过POST方法发送,我的成功函数没有参数(我不期待数据回来)。我的数据只是表单数据,使用serialize()
将它们打包在一起。
我的第二个问题是,当我禁用JS并且表单发送时,它使用header()
来确定邮件发送后的去向,header()
代码位于同一个邮件处理文件中.ajax()
在其网址中使用的内容。为什么当.ajax()发送文件时它不使用标题转到“谢谢”页面,但是当JS被禁用时它使用header()
并转到感谢页面?所有代码都在同一个文件中,所以它会跳过header()
部分吗?是因为页面根本没有重新加载?这可能很愚蠢,但我只是想知道这里发生了什么。非常感谢。
$.ajax(' url', {
type: "POST",
data: form.serialize(),
success: function() {
var formWrapper = $('.form-wrapper');
var confirmMessageSection = $("<section class=\"confirm-message\"></section>");
formWrapper.empty().append(confirmMessageSection);
confirmMessageSection.html("<p>Thank you! Your message has been sent.</p>").hide().fadeIn(1500);
},
error: function(request, errorType, errorMessage) {
var formWrapper = $('.form-wrapper');
var errorMessageSection = $("<section class=\"email-error\"></section>");
formWrapper.empty().append(errorMessageSection);
errorMessageSection.html("<p>Sorry, there was an error.</p><p>Request error type: " + request + "</p><p>Error type: " + errorType + "</p><p>Error Message: " + errorMessage + "</p>").hide().fadeIn(1500);
},
timeout:5000,
beforeSend: function() {
//add spinner
$('.form-wrapper').empty().addClass('is-loading');
},
complete: function() {
//remove spinner
$('.form-wrapper').removeClass('is-loading');
}
});
在处理文件的顶部,我有:
$sentMail = false;
然后它会在我的验证中运行,然后在最后:
$sentMail = $mail->Send();
if(!$sentMail) {
$errors['mailNotSent'] = true;
}
if($sentMail) {
header('Location: thankyou-nojs.php');
exit;
}
}
答案 0 :(得分:1)
关于第一部分,SMTP或电子邮件不是有保证的传递机制。如果您的本地smtp发送服务器只是接受邮件,您的邮件功能可能会返回OK,即没有语法问题,电子邮件地址看起来正确等等。但是从那里它不在你手中,在SMTP中服务器完成所有尝试将邮件发送到您想要发送的地方的工作。 不幸的是,这是一个火灾和遗忘操作的SMTP。它已经存在了很长时间,我们只是假设它适用于大多数情况。例如,如果目标收件人的SMTP服务器已关闭,则邮件服务器将稍后再次重试等。
这是一个广泛的问题,答案很广泛,但我希望有所帮助。
关于问题的第二部分:
ajax请求不遵循标题中的重定向,因为它不是用户浏览器正常流程的一部分,而是用于后台操作,因此如果您需要使用该标头显式重定向JavaScript中的用户浏览器意味着......而通过“正常”方式请求的页面中的重定向标题或浏览器正常流程将解释该标题。
答案 1 :(得分:1)
Ajax如何确定邮件是否已成功发送?
它没有。
ajax返回成功,因为它发布到目标文件并进行处理而没有错误。 ajax是否确定邮件是否随处可见。我所做的是:
在目标网页上:
if (mail(blah..blah)
{
echo "success";
}
else
{
echo "fail";
}
和ajax:
...
success: function(result){
if (result == "success")
{
alert("mail was sent");
}
if (result == "fail")
{
alert("mail did not get sent");
}
这不保证邮件成功。只是它试图被发送。