You need to enable JavaScript to run this app. PHP mail发送HTML表单邮件时From头未显示表单提交的发件人邮箱问题
优惠活动
大模型
产品
解决方案
定价
更多

PHP mail发送HTML表单邮件时From头未显示表单提交的发件人邮箱问题

表单邮件发送异常问题排查与修正

问题现象

  • 前端收集用户提交的姓名、联系邮箱、留言内容后,调用PHP原生mail()函数发送通知邮件时出现两个核心异常:
    • 邮件发件人(From)头部无法显示用户在表单中填写的联系邮箱
    • 最终收到的邮件,无论发件人字段还是收件人字段,都显示代码中预设的固定收件人地址

现有实现代码

前端HTML表单

<!DOCTYPE html>
<head>
<title>Form submission</title>
</head>
<body>

<form action="mail_handler.php" method="post">
First Name: <input type="text" name="first_name"><br>
Last Name: <input type="text" name="last_name"><br>
Email: <input type="text" name="email"><br>
Message:<br><textarea rows="5" name="message" cols="30"></textarea><br>
<input type="submit" name="submit" value="Submit">
</form>

</body>
</html>

后端PHP处理逻辑

<?php 
if(isset($_POST['submit'])){
    $to = "bestwayhomemaintenance@gmail.com"; 
    $from = $_POST['email']; 
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $subject = "Form submission";
    $subject2 = "Copy of your form submission";
    $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message'];
    $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message'];

    //$headers = "From:" . $from;
    $headers = "From: $to \r\n";
    $headers .= "Reply-To: $from \r\n";
    //$headers2 = "From:" . $to;
    mail($to,$subject,$message,$headers);
    //mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender
    echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly.";
    
    }
?>

问题根因

  • 代码逻辑设置反向:原本用来接收用户提交信息的固定收件人$to,被硬设成了邮件的From头部值,原本正确的“取用户提交邮箱设为发件人”的代码被注释掉了。
  • 忽略了PHPmail()函数的环境限制:绝大多数主机环境下,直接在From头部填写任意第三方邮箱地址,会被邮件系统的反垃圾规则拦截,自动将From字段改写为服务器预设的系统发件人地址,甚至直接退回邮件。
  • 副本发送逻辑存在变量缺失:取消注释发送副本的代码时,$headers2变量从未被定义,会直接触发发送失败。

修正方案

  • 调整头部逻辑:使用站点域名下的合法邮箱作为实际发件人(From字段),将用户提交的联系邮箱设置为回复地址(Reply-To),既保证邮件能正常送达,点击回复时也能直接回应用户。
  • 增加基础输入校验:对用户提交的邮箱做合法性判断,过滤空值和恶意的头部注入字符。

修正后的完整代码

<?php 
if(isset($_POST['submit'])){
    $to = "bestwayhomemaintenance@gmail.com"; 
    $userEmail = trim($_POST['email']);
    $first_name = trim($_POST['first_name']);
    $last_name = trim($_POST['last_name']);
    $userContent = trim($_POST['message']);

    // 基础合法性校验
    if(!filter_var($userEmail, FILTER_VALIDATE_EMAIL) || empty($userContent)){
        echo "请填写合法的联系邮箱和留言内容";
        exit;
    }

    $subject = "表单提交:来自 " . $first_name . " " . $last_name;
    $subject2 = "您的表单提交副本";
    $message = $first_name . " " . $last_name . " 提交了以下内容:" . "\n\n" . $userContent;
    $message2 = "这是您提交内容的副本 " . $first_name . "\n\n" . $userContent;

    // 构造邮件头部,替换为你站点域名下的合法发件地址
    $officialSender = "no-reply@your-domain.com";
    $headers = "From: 站点表单通知 <" . $officialSender . "> \r\n";
    $headers .= "Reply-To: " . $first_name . " " . $last_name . " <" . $userEmail . "> \r\n";
    $headers .= "MIME-Version: 1.0 \r\n";
    $headers .= "Content-Type: text/plain; charset=utf-8 \r\n";

    $copyHeaders = "From: 站点表单通知 <" . $officialSender . "> \r\n";

    $sendStatus = mail($to, $subject, $message, $headers);
    // 取消注释即可向提交用户发送内容副本
    // mail($userEmail, $subject2, $message2, $copyHeaders);

    if($sendStatus){
        echo "邮件已发送,感谢 " . $first_name . ",我们会尽快与您联系。";
    } else {
        echo "邮件发送失败,请稍后重试。";
    }
}
?>

注意事项

  • 不要直接把用户提交的邮箱作为From字段,否则会触发邮件系统的SPF校验拦截,导致邮件被判定为垃圾邮件。
  • 所有用户输入的内容必须做转义和合法性校验,避免恶意的邮件头部注入攻击。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 06:36:04