簡體   English   中英

Ajax對php mail()腳本的調用成功失敗,不返回json數據

[英]Ajax call to php mail() script failing on success, no json data is returned

我對ajax調用php mail()腳本失敗時遇到問題,沒有返回json數據。 基本上,它只是將表單發布到php腳本,驗證並返回一些json。

如果遇到驗證錯誤,則json會正確返回,並且我的jquery會按預期執行。

如果沒有遇到錯誤,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腳本。

我這是什么錯誤?

問題在這里:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM