PHPMailer成功发送邮件但无法返回$ .ajax成功部分

时间:2017-05-02 04:49:59

标签: php jquery ajax callback phpmailer

我使用PHPMailer(gmail smtp)从静态网站表单发送电子邮件。问题是,电子邮件已成功发送,但我无法在$ .ajax'成功:功能(结果){}'中获得正确的回复。部分,每次进入错误:功能(错误){}'代替。

网络服务器: XAMPP(localhost)

代码如下:

HTML表单:

#standardSQL
WITH table1 AS (
  SELECT value 
  FROM UNNEST([1, 4, 9, 10]) AS value
),
table2 AS (
  SELECT chunk.start, chunk.`end` 
  FROM UNNEST([STRUCT<start INT64, `end` INT64>(0,5),(6,9),(10,15)]) AS chunk
)
SELECT * 
FROM `table1` a
INNER JOIN `table2` b 
ON a.value BETWEEN b.start AND b.`end`
-- ORDER BY value

JS:

<div id="contactus-form">
    <form id="contactUs" method="post">
        <p>
            <label for="name">Name:</label>
            <input type="text" id="name" class="formbox" name="name"/>
        </p>
        <p>
            <label for="email">Email:</label>
            <input type="email" id="email" class="formbox" name="email"/>
        </p>
        <p>
            <label for="comments">Comments:</label>
            <textarea name="comments" id="comments" rows="8"></textarea>
        </p>
        <p>
            <button form="contactUs" name="send" id="send" type="submit">Send Message</button>
        </p>
    </form>
</div>

PHP:

$('#contactUs').submit(function() {
    var message = $("#comments").val();
    var name = $('#name').val();
    var email = $('#email').val();
    $.ajax({
        url: "PHPMailer/gmail.php", 
        method: "POST",
        data: {
            name: name,
            email: email,
            message: message
        },
        dataType: "json",
        success: function(result) {
            console.log(result);
        },
        error: function(err) {
            console.log(err);
        }
    });
});

我也为gmail.php添加了<?php header('Content-Type: application/json'); require 'PHPMailerAutoload.php'; //Get data send by ajax $name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message']; $mail = new PHPMailer; $mail->isSMTP(); $mail->SMTPDebug = 0; $mail->Debugoutput = 'html'; $mail->Host = gethostbyname('ssl://yoursmpt.com'); $mail->Port = ***; $mail->SMTPSecure = 'ssl'; $mail->SMTPAuth = true; $mail->Username = "youraccount@email.com"; $mail->Password = "yourpassword"; $mail->setFrom("from@email.com", "from name"); $mail->addReplyTo($email, $name); $mail->addAddress('admin@yourdomail.com', 'Admin'); $mail->Subject = 'Message From Website'; $mail->msgHTML('<h4>Name: </h4>'.$name.'<br>'.'<h4>Email: </h4>'.$email.'<br>'.'<h4>Message: </h4>'.$message); $mail->AltBody = 'This is a plain-text message body'; //send the message, check for errors if (!$mail->send()) { $result = array('status'=>"error", 'message'=>"Mailer Error: ".$mail->ErrorInfo);// echo json_encode($result); } else { $result = array('status'=>"success", 'message'=>"Message sent."); echo json_encode($result); }

当我点击&#34; SendMessage&#34;按钮,我收到了取消请求:

request gmail.php

Cancelled request details

如果我在submit()函数结束时添加header('Content-Type: application/json');,它在本地工作正常。任何人都可以帮我弄清楚在这种情况下发生的事情,请?非常感谢你。

4 个答案:

答案 0 :(得分:0)

验证,替换你的php的最后一部分,你在那里检查错误:

if(!$mail->send())
    $result = "Error";
else
    $result = "Success";

并在js中插入成功和错误的字符串化警报。从成功中删除一个并尝试相同的错误后,从一个成功开始。

alert(JSON.stringify(result));

alert(JSON.stringify(err));

如果您在验证时出现问题,首先会看到。我可能是错的,但我认为它来自那一部分。如果你再次收到错误的成功,那就来自其他地方。

我希望它会对你有所帮助。

答案 1 :(得分:0)

你的关键价值是给予&#34;状态&#34;但我认为关键价值是成功&#34;。

您的代码:

$result = array('status'=>"success", 'message'=>"Message sent.");

替换为:

$result = array('success'=>"successfully send", 'message'=>"Message sent.");

方法2: 以上解决方案不起作用,其他方法就是这个。我正在使用它。

echo json_encode(array('success' => true, 'result' => "You contact information has been sent"));

得到这样的结果:

    success: function (response) {
       console.log(response);
        if(response.success)
           jQuery('#success').html(response.result).show();
        else
            jQuery('#error').html(response.result).show();  
},

我不确定这一点但只是尝试一下。我希望用得好吗

答案 2 :(得分:0)

问题是我没有阻止默认的提交功能。

解决方案1:在提交功能结束时添加return false;

$('#contactUs').submit(function() {
    ...
    $.ajax({
        url: "PHPMailer/gmail.php", 
        method: "POST",
        data: {...},
        dataType: "json",
        success: function(result) {
            console.log(result);
        },
        error: function(err) {
            console.log(err);
        }
    });
    return false;
});

解决方案2:在提交功能

中添加event.preventDefault()
$('#contactUs').submit(function(e) {
    ...
    e.preventDefault();
    $.ajax({
        url: "PHPMailer/gmail.php", 
        method: "POST",
        data: {...},
        dataType: "json",
        success: function(result) {
            console.log(result);
        },
        error: function(err) {
            console.log(err);
        }
    });
});

在这种情况下,Solution1和Solution2之间没有区别。但是,如果您不想也阻止事件传播(父元素中的任何相同事件),最好使用event.preventDefault()。请检查https://css-tricks.com/return-false-and-prevent-default/

如果有人可以添加更多解释,为什么不阻止默认提交会导致$ .ajax响应错误,我将不胜感激。

答案 3 :(得分:0)

尝试删除它:

$mail->SMTPDebug = 0;
$mail->Debugoutput = 'html';

它对我有用。

相关问题