【问题标题】:PHP mail function with jQuery / AJAX and Google ReCaptcha带有 jQ​​uery / AJAX 和 Google ReCaptcha 的 PHP 邮件功能
【发布时间】:2015-04-19 01:04:04
【问题描述】:

我需要使用 PHP 发送邮件,通过带有 Google Recaptcha 的 HTML 表单;发送邮件后,会在表单所在的位置显示一条消息(这是使用 jQuery 完成的)。

如果我删除所有与 Recaptcha 相关的代码,则会发送邮件并且 jQuery 工作正常。这是 index.php 中的代码:

 <script>

            $(document).ready(function() {
                $("#mail").click(function() {
                    $.post("form.php",
                        {
                            message: document.myForm.message.value,
                            from: document.myForm.from.value,
                            email: document.myForm.email.value,
                        },
                        function(data,status) {
                            $("#form").hide(1000);
                            $("button").hide(1000);
                            $(".tp_contact_left").html(data);
                        }
                    );
                });
            });

        </script>

        <!-- Formulario -->
        <span class="tp_contact_left">

            <form name="myForm" id="form" method="post" action="" />

                <fieldset>
                    <input type="text" name="from" placeholder="Tu nombre" required><br>
                    <input type="text" name="email" placeholder="Tu e-mail" required><br>
                    <textarea name="message" rows="15" cols="40" required draggable="false" placeholder="Escribe aquí tu mensaje"></textarea><br>
                    <input type="reset" value="Delete">
                </fieldset>

            </form>

            <button id="mail">Send</button>

        </span>

在form.php中:

 $to = 'yourmail@domain.com';
 $subject = 'Contact';

 $message = 'Text content<br /><br />'
. 'Nombre: '
. $_POST["from"]
. '<br />Email: '
. $_POST["email"]
. '<br />Mensaje: '
. $_POST["message"];

 $headers = 'From: mail@domain.com' . "\r\n";
 $headers .= 'MIME-Version: 1.0' . "\r\n";
 $headers .= 'Content-type: text/html; charset=iso-8859-1';

 if (!mail ($to, $subject, $message, $headers)) {
    echo 'Error.';
}
else {
    echo 'Thanks. Message sent.';
}

但是当我添加 ReCaptcha 代码时,我不知道在使用 jQuery post 方法时将 g-recaptcha-response 变量放在哪里。使用grecaptcha.getResponse(),我得到了 json 响应,但我无法将发布请求发送到 form.php。此外,$response = grecaptcha.getResponse(); 之前的任何内容都不会被执行:

 <script>

            $(document).ready(function() {
                $("#mail").click(function() {
                    // New line
                    $response = grecaptcha.getResponse();
                    alert($response);
                    $.post("form.php",
                        {
                            message: document.myForm.message.value,
                            from: document.myForm.from.value,
                            email: document.myForm.email.value,
                            // Modified line
                            grecaptcharesponse: $response
                        },
                        function(data,status) {
                            $("#form").hide(1000);
                            $("button").hide(1000);
                            $(".tp_contacto_left").html(data);
                        }
                    );
                });
            });

        </script>

 <span class="tp_contact_left">

            <form name="myForm" id="form" method="post" action="" />

                <fieldset>
                    <input type="text" name="from" placeholder="Tu nombre" required><br>
                    <input type="text" name="email" placeholder="Tu e-mail" required><br>
                    <textarea name="message" rows="15" cols="40" required draggable="false" placeholder="Escribe aquí tu mensaje"></textarea><br>
                    <div class="g-recaptcha" data-sitekey="sitekey"></div>
                    <input type="reset" value="Borrar">
                    <input id="mail" name="enviar_mail" type="submit" value="Enviar">
                </fieldset>

            </form>

        </span>

form.php中的代码是:

 <?php

if (isset ($_POST['grecaptcharesponse'])) {
    $captcha = $_POST['grecaptcharesponse'];
}

if (!$captcha) {
    echo 'Por favor, haz click en el checkbox';
    exit;
}

$to = 'mail@mail.com';
$subject = 'Formulario de contacto';

$message = 'Nuevo mensaje recibido desde el formulario de la web<br /><br />'
    . 'Nombre: '
    . $_POST["from"]
    . '<br />Email: '
    . $_POST["email"]
    . '<br />Mensaje: '
    . $_POST["message"];

$headers = 'From: Formulario web <mail@mail.com' . "\r\n";
$headers .= 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1';

$response = file_get_contents ("https://www.google.com/recaptcha/api/siteverify?secret=SECRETKEY&response="
    . $captcha . "&remoteip="
    . $_SERVER['REMOTE_ADDR']);

$result = json_decode ($response);

if (!$result->success) {
    echo 'Spam';
    exit;
}

if (!mail ($to, $subject, $message, $headers)) {
    echo 'Error en el envío.';
}
else {
    echo 'Gracias por contactar con nosotros.';
}

?>

有没有办法将 g-recaptcha-response 数据发送到 jQuery post 方法?

【问题讨论】:

    标签: php jquery ajax email recaptcha


    【解决方案1】:

    grecaptcha.getResponse() 会给你用户的响应。

    另外,$response.success 会报错,因为:

    1. 语法不正确。这是 PHP,所以正确的语法是: $response -> 成功。
    2. 服务器的响应是一个 json 字符串,而不是一个对象。

    你需要将json字符串解码成一个对象; json_decode($response);应该做的伎俩。 现在您可以使用 $response -> success 来验证验证码。

    【讨论】:

    • 感谢您的回答,@user3847106,您的语法是正确的...我现在可以解码响应,并正确处理 recaptcha。但是当我尝试传递 grecaptcha.getResponse () 到 .post() jQuery 函数,它只是不起作用。见上面修改后的代码。
    猜你喜欢
    • 2011-05-24
    • 2015-06-16
    • 2012-04-17
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多