
php联系表单邮件头中“from:”字段因缺少必要空格导致邮箱被错误解析(如自动追加当前域名),正确写法需在姓名与尖括号邮箱间保留一个空格,并避免html/cloudflare邮箱混淆。
php联系表单邮件头中“from:”字段因缺少必要空格导致邮箱被错误解析(如自动追加当前域名),正确写法需在姓名与尖括号邮箱间保留一个空格,并避免html/cloudflare邮箱混淆。
在PHP构建邮件头时,From: 字段遵循RFC 5322标准格式:From: Display Name <email></email>。关键细节在于——显示名称与左尖括号 之间必须存在且仅存在一个英文空格。若遗漏该空格(如 "From: John<john>"</john>),部分MTA(邮件传输代理)或安全层(如Cloudflare Email Protection)会将整个字符串误判为非法邮箱格式,进而触发“修复行为”:自动补全本地域名(如 @domain1.com),导致收件方看到类似 johnsmith429@domain1.com <john></john> 的异常结构。
你原始代码:
$header = "From: " . $name . "<". $email .">\r\n";
生成的是 From: John Smith<john></john> —— 缺少空格,违反语法规范。
✅ 正确写法(含空格 + 姓名可选):
立即学习“PHP免费学习笔记(深入)”;
// 推荐:保留姓名(更专业)+ 严格空格分隔 $header = "From: " . $name . " <" . $email . ">\r\n"; // 或仅邮箱(简洁但无显示名) $header = "From: " . $email . " <" . $email . ">\r\n";
⚠️ 特别注意:你的HTML中使用了Cloudflare邮箱保护(<a class="__cf_email__"></a>),这会导致PHP接收到的是HTML标签而非纯文本邮箱!务必在提交前剥离HTML:
$email = filter_var(strip_tags($_POST['email']), FILTER_SANITIZE_EMAIL);
$name = filter_var(strip_tags($_POST['name']), FILTER_SANITIZE_STRING);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("无效邮箱格式");
}? 进阶建议:
-
永远验证并清理用户输入:
filter_var()是基础防线; -
使用专业库替代原生mail():如 PHPMailer 或 Symfony Mailer,它们自动处理RFC合规性、编码、附件及反垃圾邮件头(如
Reply-To,X-Mailer); -
测试真实环境:在Gmail、Outlook等客户端中检查原始邮件头,确认
From:字段完全符合Name <user></user>格式。
一句话总结:一个空格决定邮件可信度——规范格式是防止域名劫持、提升送达率的第一道防线。



















