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

PHP联系表单发送邮件后无法跳转至指定页面求助

解决邮件发送后无法跳转页面的问题

Hey,我看了你的代码和遇到的问题,邮件发送后跳不到目标页面这个情况其实挺常见的,主要和PHP的header()函数的运行规则有关,结合你的代码来看,有两个核心问题需要调整:


1. 跳转前存在隐性输出(最常见诱因)

header()函数有个严格要求:必须在任何输出(包括空格、换行、HTML标签甚至<?php标签前的空白)之前调用。如果你的表单文件里,<?php标签前面有空白、换行,或者PHP代码后面跟着表单的HTML内容,PHP会提前发送HTTP头部,直接导致跳转指令失效,这是这类问题的头号原因。

另外,你在跳转后设置的$success变量完全是多余的——跳转后浏览器已经加载新页面了,这部分代码根本不会被用户看到。

2. 跳转后未终止脚本执行

调用header("Location: test.php");之后,脚本还会继续执行后续的变量重置操作,虽然这不会直接阻止跳转,但规范来说,发送跳转指令后应该立刻终止脚本,避免潜在的执行冲突或输出干扰。


修复后的完整代码

我给你调整了代码逻辑,同时优化了细节,你可以直接参考使用:

<?php 
// 注意:这个<?php标签前面绝对不能有任何空格、换行或者HTML内容!

// 初始化变量
$name_error = $email_error = $phone_error =  "";
$name = $email = $phone = $message = $success = "";

// 处理POST提交
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  // 验证姓名
  if (empty($_POST["name"])) {
    $name_error = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
    if (!preg_match("/^[a-zA-Z ]*$",$name)) {
      $name_error = "Only letters and white space allowed"; 
    }
  }

  // 验证邮箱
  if (empty($_POST["email"])) {
    $email_error = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $email_error = "Invalid email format"; 
    }
  }

  // 验证电话
  if (empty($_POST["phone"])) {
    $phone_error = "Phone is required";
  } else {
    $phone = test_input($_POST["phone"]);
    if (!preg_match("/^(\d[\s-]?)?[\(\[\s-]{0,2}?\d{3}[\)\]\s-]{0,2}?\d{3}[\s-]?\d{4}$/i",$phone)) {
      $phone_error = "Invalid phone number"; 
    }
  }

  // 处理消息内容
  $message = empty($_POST["message"]) ? "" : test_input($_POST["message"]);

  // 所有验证通过,发送邮件
  if (empty($name_error) && empty($email_error) && empty($phone_error)){
      $message_body = '';
      unset($_POST['submit']);
      foreach ($_POST as $key => $value){
          $message_body .=  "$key: $value\n";
      }

      $to = 'test@gmail.com';
      $subject = 'Test';
      if (mail($to, $subject, $message_body)){
          // 确保这里之前没有任何输出,然后执行跳转
          header("Location: test.php");
          // 立即终止脚本,避免后续执行
          exit();
      } else {
          // 邮件发送失败的提示(如果需要在原页面显示的话)
          $success = "Oops, failed to send your message. Please try again later.";
      }
  }
}

// 输入清理函数
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

// 如果这个文件同时包含表单的HTML,一定要放在PHP逻辑之后,这样跳转时不会输出HTML
?>

额外要检查的点

  • 路径正确性:确认test.php和当前脚本在同一个目录,或者使用正确的相对/绝对路径(比如根目录下的话写成/test.php)。
  • 开启错误提示:可以在代码最开头加上error_reporting(E_ALL); ini_set('display_errors', 1);,这样如果header()因为已输出内容失效,会直接显示错误信息,方便排查。
  • mail()函数是否真的成功:有时候mail()返回true但实际邮件没发出去,你可以加个日志或者调试语句,确认这一步确实执行成功了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:22:11