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

PHP联系表单header重定向失效 邮件未发送返回action路径

PHP联系表单发信失败、重定向不生效问题修复

问题根因

现有代码存在语法错误、逻辑冲突、格式不规范三类问题,直接导致脚本运行中断、重定向头无法正常发送、邮件被拒收:

  • 语法层面:字符串值未加引号、secretKey赋值行直接写#触发解析错误,脚本运行到对应行直接终止,完全无法执行后续逻辑
  • 逻辑层面:所有header()跳转后未终止脚本执行,分支内的跳转语句执行完后代码会继续向下运行,最终触发最外层的跳转逻辑;如果中途有任何报错输出,会直接触发「Headers already sent」错误,导致重定向头完全无法下发
  • 格式层面:邮件头不符合RFC规范,缺少必要字段,大概率被邮件服务商直接拒收;reCAPTCHA请求未做异常容错,接口请求失败时会直接抛出致命错误

修复后完整代码

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

if(isset($_POST['submit'])){
    // 校验邮箱格式
    if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
        header("Location: ../contact/?message_failed", true, 303);
        exit;
    }

    // 接收表单参数,做基础过滤
    $firstname = htmlspecialchars(trim($_POST['firstname']));
    $surname = htmlspecialchars(trim($_POST['surname']));
    $email = filter_var(trim($_POST['email']), FILTER_SANITIZE_EMAIL);
    $tel = htmlspecialchars(trim($_POST['tel']));
    $service = htmlspecialchars(trim($_POST['service']));
    $message = htmlspecialchars(trim($_POST['message']));

    // 注意:以下值替换为真实配置时必须用引号包裹为字符串
    $mailTo = "你的真实收件邮箱@example.com";
    $fromEmail = "你的站点发件邮箱@example.com";
    $secretKey = "你的reCAPTCHA密钥";

    // 组装符合规范的邮件头
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/plain; charset=utf-8\r\n";
    $headers .= "From: 站点联系表单 <".$fromEmail.">\r\n";
    $headers .= "Reply-To: ".$email."\r\n";

    // 组装邮件正文
    $txt = "You have received an e-mail from ". $firstname . " " . $surname . ".\r\n";
    $txt .= $message . ".\r\n";
    $txt .= "Contact Number: " . $tel . ".\r\n";
    $txt .= "Email: " . $email;

    // 请求reCAPTCHA验证,加容错处理
    $responseKey = $_POST['g-recaptcha-response'] ?? '';
    $userIP = $_SERVER['REMOTE_ADDR'];
    $url = "https://www.google.com/recaptcha/api/siteverify?secret=$secretKey&response=$responseKey&remoteip=$userIP";
    
    $response = @file_get_contents($url);
    $response = $response ? json_decode($response) : null;
    
    if($response && $response->success){
        // 发送邮件,判断发送结果
        $mailSent = mail($mailTo, $service, $txt, $headers);
        if($mailSent){
            header("Location: ../contact/?message_sent", true, 303);
        }else{
            header("Location: ../contact/?mail_send_failed", true, 303);
        }
    }
    else{
        // 人机验证失败
        header("Location: ../contact/?captcha_failed", true, 303);
    }
    exit;
}
// 未正常提交表单的跳转
header("Location: ../contact/?form_failed", true, 303);
die();
?>

关键修复点说明

  • 所有配置值统一包裹为字符串,修复语法解析错误
  • 每一处header()调用后都加exit终止后续代码执行,避免逻辑冲突,同时给header函数加第二个参数true强制替换之前可能存在的同名响应头
  • 修正邮件头格式,增加Reply-To字段方便直接回复用户提交的邮箱,避免被邮件服务商判定为垃圾邮件
  • 对reCAPTCHA接口请求增加空值判断,避免接口不通时抛出致命错误
  • 对所有用户输入做基础的过滤转义,避免邮件头注入风险
  • 增加邮件发送结果判断,方便定位发信失败问题

注:如果服务器未配置sendmail等发信服务,mail()函数本身就无法正常工作,这种情况建议替换为成熟的邮件类库通过SMTP发信,稳定性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:24:34