PHP邮件表单提交后接收邮件缺失姓名、邮箱等输入数据
问题排查结论
邮件只显示message字段内容,核心原因是mail.php中调用mail()发信时,正文参数只传了单独的用户留言变量,没有把姓名、发件邮箱、主题这些字段拼接进正文。除此之外代码里还有3个会导致功能异常的隐藏bug:
- 邮件头拼接错误:用单引号包裹
'\r\n'作为换行符,PHP单引号不会解析转义字符,会直接输出字面量字符串,导致邮件头格式非法,容易被邮件服务商判为垃圾邮件,出现发件人不显示、丢件等问题 - Session成功提示赋值错误:写的
$_SESSION['Thanks for contacting us, we will be in touch shortly!']是把提示文本当成了Session数组的键名,没有给对应键赋值,页面根本读不到提交成功的提示 - 发件人格式不规范:直接把用户填写的邮箱放到From头中,没有附带发件人姓名,不符合多数邮件服务商的格式要求,容易被拦截。
修正代码
1. 修复mail.php
核心是拼接完整的邮件正文,修正邮件头格式:
<?php // 读取配置中的收件人邮箱 $config = require_once __DIR__ . '/../config/app.php'; $recipient_email = $config['mail']['to_email']; // 读取用户提交的所有字段 $contact_name = $inputs['name']; $contact_email = $inputs['email']; $user_subject = $inputs['subject']; $user_message = $inputs['message']; // 拼接完整HTML格式邮件正文,把所有字段都加进去 $mail_body = <<<HTML <p>网站表单收到新留言:</p> <p><strong>提交人姓名:</strong>{$contact_name}</p> <p><strong>提交人邮箱:</strong>{$contact_email}</p> <p><strong>留言主题:</strong>{$user_subject}</p> <p><strong>留言内容:</strong></p> <p>{$user_message}</p> HTML; // 构造合规邮件头 $headers[] = 'MIME-Version: 1.0'; $headers[] = 'Content-type: text/html; charset=utf-8'; $headers[] = "To: $recipient_email"; $headers[] = "From: {$contact_name} <{$contact_email}>"; // 换行符必须用双引号包裹才能正确解析转义 $header = implode("\r\n", $headers); // 发送邮件 mail($recipient_email, $user_subject, $mail_body, $header);
2. 修复index.php的Session赋值错误
找到POST分支里设置成功提示的代码,把原来的错误写法:
$_SESSION['Thanks for contacting us, we will be in touch shortly!'];
替换为正确的赋值写法:
$_SESSION['message'] = 'Thanks for contacting us, we will be in touch shortly!';
额外优化建议
- 你当前post.php里加了nickname字段的蜜罐校验,但表单里没有加对应的隐藏字段,蜜罐不会生效。可以在表单里加一行
<input type="hidden" name="nickname" value="">,正常用户看不到这个字段不会填写,爬虫自动填充内容时就会被直接拦截 - 原生PHP的
mail()函数投递成功率较低,对发件域名校验严格,如果后续出现收不到邮件、进垃圾箱的问题,建议改用PHPMailer通过SMTP服务发信,稳定性更高。
内容的提问来源于stack exchange,提问作者David Feudale
相关产品推荐
相关产品推荐

