Ajax调用php mail()脚本成功失败,没有返回json数据

时间:2018-04-16 17:37:45

标签: php jquery ajax

我有一个问题,ajax调用php mail()脚本失败成功,没有返回json数据。它基本上只是将表单发布到php脚本,验证&回来一些json。

如果我遇到验证错误,则会正确返回json&我的jquery按预期执行。

如果遇到NO错误,PHP会正确处理和发送邮件,但不会将数据返回给我的jquery脚本。

这是我的代码:

    <?php

require "gump.class.php";

$gump = new GUMP();

$mailto = 'me@mydomain.com';

$subject = 'A new form inquiry has been submitted.';

$output = array(
    'status' => 'success',
    'msg' => 'Mail processed successfully',
    'success' => 'success',
);



function render_email($input) {
    //error_log("render_email " . print_r($input,TRUE), 0);
    ob_start();
    include "email-template.phtml";
    return ob_get_contents();
}

$input = $gump->sanitize($_POST);

$gump->validation_rules(array(
    'first_name'    => 'required',
    'last_name'    => 'required',
    'email'    => 'required',
    //'country'       => 'required|valid_email',
    //'gender'      => 'required|exact_len,1',
    //'company' => 'required|valid_cc|max_len,2|min_len,1',
    //'bio'       => 'required'
));

$gump->filter_rules(array(
    'first_name'      => 'trim|sanitize_string',
    'last_name'       => 'trim|sanitize_string',
    'email'       => 'trim|sanitize_string',

));

$validated = $gump->run($_POST);

if($validated === false){
    error_log("GUMP: validation Error: " . print_r($gump->get_readable_errors(true),TRUE));
    $output = array(
            'status' => 'error',
            'msg' => '<strong>Validation Error: </strong>' . $gump->get_readable_errors(true),
            'error' => 'error',
        );
}else{
    error_log("GUMP: Successful Validation, processing mail",0);
    // ghead & mail the form
    $to = $mailto ;
    $subject = $subject;
    $body = render_email($input);
    $headers = "From: Metz Tea <sales@mydomain.com>" . "\r\n";
    $headers .= "Reply-To: sales@mydomain.com\r\n";
    $headers .= "Return-Path: info@example.com\r\n";
    $headers .= "X-Mailer: PHP\n";
    $headers .= "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
    if(!mail($to,$subject,$body,$headers)){
        $output = array(
            'status' => 'error',
            'msg' => 'The system failed to send mail.',
            'error' => 'error',
        );
    };
    error_log("mail complete",0);
}

header("HTTP/1.1 200 OK");

header('Content-type: application/json');

$output = json_encode($output);

echo $output;

return;

和jquery:

$('form').submit(function(event){
        event.preventDefault();
    })


    $(document).on("forminvalid.zf.abide", function(event,frm) {

        var modal = $('form').closest('.reveal').attr('id');
        $(".success").hide();
        $(".alert").show();
        console.log("Form id "+event.target.id+" is invalid");
        formToTop(modal);

      }).on("formvalid.zf.abide", function(event,frm) {

        console.log("Form id "+event.target.id+" is VALID");
        var modal = $('form').closest('.reveal').attr('id');
        var data = frm.serializeArray();

        $.ajax({
            type        : 'POST', 
            url         : 'process.php', 
            data        : data, 
            dataType    : 'json', 
            encode          : true
        }).done(function(data) {
            console.log('completed successfully '+ data);
            if (data.status != 'success') {
                console.log('AJAX returned error = ' + data.msg);
                $('.callout p').html(data.msg);
                $('.alert').show();
                formToTop(modal);
            } else {
                console.log( 'AJAX returned success = ' + data.status);
                $('.callout p').html(data.msg);
                $('#orderform').find("input[type=text], textarea, select").val("");
                $('.alert').hide();
                $('.success').show();
                $('form').slideUp('500');
                formToTop(modal);
            }
        }).fail(function(data) {
            //error
        });
        event.preventDefault();
    });

它必须是mail()函数,它会成功发送邮件,但不会将数据发送回ajax脚本。

我的错误是什么?

1 个答案:

答案 0 :(得分:1)

问题在于:

function render_email($input) {
    //error_log("render_email " . print_r($input,TRUE), 0);
    ob_start();
    include "email-template.phtml";
    return ob_get_contents();
}

您有副作用,将渲染模板的内容留在缓冲区中,并启用缓冲。您想要将其更改为:

function render_email($input) {
    //error_log("render_email " . print_r($input,TRUE), 0);
    ob_start();
    include "email-template.phtml";
    $ret = ob_get_contents();
    ob_end_clean();
    return $ret;
}