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
相关产品推荐
相关产品推荐

