You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Google reCaptcha的PHP邮件表单突发失效问题求助

问题排查与解决方法

一、先确认reCaptcha相关潜在问题

2022年Google确实对reCaptcha做了响应逻辑和字段调整,先验证这部分是否真的正常:

  • 验证请求方式问题:你的代码用file_get_contents发送GET请求验证reCaptcha,当响应字符串变长后,GET请求的URL长度限制可能导致参数截断,引发验证异常。建议在if ($responseKeys["success"]) {后添加var_dump($responseKeys);,查看是否存在error-codes字段,比如timeout-or-duplicate(重复提交)、invalid-input-response(响应无效)等错误。
  • 版本兼容检查:确认前端reCaptcha加载脚本为最新版本:<script src="https://www.google.com/recaptcha/api.js" async defer></script>,旧版本脚本可能无法适配新的响应格式。

二、邮件发送失败核心排查(重点)

mail()返回false和reCaptcha未必直接相关,先聚焦邮件本身的问题:

  1. Headers格式错误
    PHP的mail()函数要求邮件头的换行必须是\r\n,你的代码里用了普通换行,这会被邮件服务器判定为无效头,直接导致发送失败。修正代码:
    $headers = "From: *** my email ***.com\r\n";
    $headers .= "Reply-To: $visitor_email\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
    $headers .= "X-Mailer: PHP/".phpversion();
    
  2. 发件地址合法性
    如果你用的是Luxsci服务器,From地址必须是该服务器已验证的域名邮箱,随意填写会被反垃圾机制拦截,确认发件地址符合主机商要求。
  3. 获取mail()具体错误信息
    在邮件发送失败的分支中添加错误捕获,明确失败原因:
    if (!$mail_check) {
        $mail_error = error_get_last();
        echo "<pre>".print_r($mail_error, true)."</pre>";
    }
    
    能直接看到诸如“Failed to connect to mailserver”(邮件服务器连接失败)、“Invalid sender address”(发件地址无效)等具体提示。
  4. 邮件主题编码问题
    主题中的C&H未做MIME编码,可能引发乱码或拦截,用编码函数处理:
    $email_subject = mb_encode_mimeheader("C&H form v2c inquiry", "iso-8859-1", "Q");
    

三、代码优化建议

  1. reCaptcha验证增强
    即使success为true,也要检查警告字段,避免隐性问题:
    if ($responseKeys["success"]) {
        if (!empty($responseKeys["error-codes"])) {
            echo '<h3>reCaptcha验证警告:</h3>';
            print_r($responseKeys["error-codes"]);
            exit;
        }
        // 继续邮件发送流程
    }
    
  2. 替换file_get_contents为cURL
    改用POST方式验证reCaptcha,避免GET的URL长度限制,同时提升稳定性:
    $secretKey = "你的密钥";
    $captcha = $_POST['g-recaptcha-response'];
    $ip = $_SERVER['REMOTE_ADDR'];
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
        'secret' => $secretKey,
        'response' => $captcha,
        'remoteip' => $ip
    ]));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    
    $responseKeys = json_decode($response, true);
    
  3. 输入过滤
    对用户输入做基本验证,比如用filter_var($visitor_email, FILTER_VALIDATE_EMAIL)校验邮箱格式,避免无效数据引发邮件问题。

内容的提问来源于stack exchange,提问作者Nicholas Bourbaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:31:18