通过Ajax与PHP发送表单

时间:2014-03-05 01:30:30

标签: php jquery ajax forms

我有一些简短的问题。我有一个表单,我通过jQuery的Ajax发送,它的工作方式我想要它。如果我禁用JavaScript,表单也通过服务器端发送,它也可以工作。当我通过Ajax发送表单时,表单发送并且我有一个微调器(添加一个带有beforeSend的类),并且成功时我会显示一条感谢信息。问题1是,(这可能很愚蠢),Ajax如何确定邮件是否成功发送? (我目前正在使用PHPMailer从我的localhost发送邮件)。

或者更确切地说,“成功”是基于能够将表单数据发送到处理文件吗?我的成功消息是“谢谢你,你的消息已被发送”,如果消息实际上没有被发送,我不想显示它,但是Ajax仍然显示它,因为它能够与邮件处理文件进行交互。我当然通过POST方法发送,我的成功函数没有参数(我不期待数据回来)。我的数据只是表单数据,使用serialize()将它们打包在一起。

我的第二个问题是,当我禁用JS并且表单发送时,它使用header()来确定邮件发送后的去向,header()代码位于同一个邮件处理文件中.ajax()在其网址中使用的内容。为什么当.ajax()发送文件时它不使用标题转到“谢谢”页面,但是当JS被禁用时它使用header()并转到感谢页面?所有代码都在同一个文件中,所以它会跳过header()部分吗?是因为页面根本没有重新加载?这可能很愚蠢,但我只是想知道这里发生了什么。非常感谢。

编辑:我应该添加代码,道歉。这是我正在制作的ajax电话:

$.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;
   }
}

2 个答案:

答案 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");
}

这不保证邮件成功。只是它试图被发送。