
PHP 的 mail() 函数要求邮件头字段使用标准英文标识(如 From:),若误用本地化字段(如 Od:),会导致发件人地址被忽略或被服务器覆盖为默认系统邮箱。
php 的 `mail()` 函数要求邮件头字段使用标准英文标识(如 `from:`),若误用本地化字段(如 `od:`),会导致发件人地址被忽略或被服务器覆盖为默认系统邮箱。
在您提供的脚本中,关键问题出在邮件头(headers)的定义部分:
$headers = "Od: " . $fromEmail; // ❌ 错误:波兰语“Od”不被SMTP协议识别 $headers2 = "Od: " . $mailto; // ❌ 同样无效
RFC 5322 明确规定,邮件头字段名(如 From, To, Subject)必须使用英文且区分大小写。PHP 的 mail() 函数底层依赖系统 sendmail 或 SMTP 服务,它们只解析标准头字段;Od: 不是合法头名,因此被完全忽略——结果就是系统自动填充默认发信地址(例如 www-data@your-server.com 或 nobody@localhost),而非您期望的客户邮箱或您的邮箱。
✅ 正确写法应统一使用 From::
// 接收方邮件头:显示您的邮箱为发件人(给客户的确认信)
$headers2 = "From: " . $mailto . "\r\n" .
"Reply-To: " . $mailto . "\r\n" .
"X-Mailer: PHP/" . phpversion();
// 注意:\r\n 是必需的换行符,用于分隔多个头字段
// 发给您自己的邮件头:显示客户邮箱为发件人(便于您直接回复)
$headers = "From: " . $fromEmail . "\r\n" .
"Reply-To: " . $fromEmail . "\r\n" .
"X-Mailer: PHP/" . phpversion();⚠️ 重要注意事项:
立即学习“PHP免费学习笔记(深入)”;
-
必须使用
\r\n换行:Windows 风格的回车换行是 RFC 强制要求,仅用\n可能导致头解析失败或被拒收; -
避免邮件头注入攻击:
$_POST['email']未过滤,恶意用户可注入额外头(如"test@example.com\r\nCc: spam@evil.com")。务必校验邮箱格式并清理换行符:$fromEmail = filter_var(trim($_POST['email']), FILTER_SANITIZE_EMAIL); if (!filter_var($fromEmail, FILTER_VALIDATE_EMAIL)) { die("Invalid email address"); } -
mail()函数局限性高:无内置错误日志、不支持附件、易被标记为垃圾邮件。生产环境强烈推荐使用 PHPMailer 或 Symfony Mailer 等专业库,它们自动处理头编码、UTF-8、DKIM 签名和 SMTP 认证; -
主机商限制:多数共享主机禁止自定义
From地址(仅允许域名下邮箱,如@tłumaczgdanski.pl),否则邮件会被拦截。请确认$mailto和$fromEmail均属于您的托管域名,并配置 SPF/DKIM 记录以提升送达率。
总结:将 "Od:" 全部替换为 "From:",添加 \r\n 换行与必要安全校验,即可让发件人地址正确显示。但长远来看,迁移到现代邮件库是保障可靠性与安全性的必选项。



















