Hostinger共享服务器原有正常PHP邮件表单提交成功却无法发信问题
Hostinger共享服务器PHP表单假发送成功排查方案
一、优先排查服务器端限制
Hostinger近期收紧了共享主机的PHP mail() 函数规则,这是绝大多数原有正常代码突然失效的核心原因:
- 禁止使用非当前主机绑定域名下的邮箱作为发件人,你代码中直接用访客提交的
$email作为From参数,会被服务器直接拦截邮件,但mail()函数仍会返回布尔值true,造成发送成功的假象 - 检查你的域名DNS解析是否配置了正确的SPF记录,没有SPF记录的发件会被绝大多数邮箱服务商拒收,默认Hostinger的SPF记录值为
v=spf1 include:spf.mx.hostinger.com include:relay.mailchannels.net ~all - 先查看你收件邮箱的垃圾邮件文件夹,确认是否是邮件被识别为垃圾邮件拦截
- 登录Hostinger主机面板,在「高级」分类下找到「邮件日志」,可查看所有被拦截邮件的具体失败原因
二、代码修复方案
现有代码除了发件人规则不符合服务器要求外,还存在变量未初始化的小问题,优化后的代码参考如下:
<?php // 初始化变量避免警告 $name = isset($_POST["name"]) ? trim($_POST["name"]) : ''; $email = isset($_POST["email"]) ? trim($_POST["email"]) : ''; $subject = isset($_POST["subject"]) ? trim($_POST["subject"]) : ''; $message = isset($_POST["message"]) ? trim($_POST["message"]) : ''; $EmailTo = "你的真实收件邮箱@xxx.com"; $Title = "New Message Received"; // 发件人必须替换为你当前主机绑定域名下的邮箱,比如info@你的域名.com $senderEmail = "info@你自己的域名.com"; // 准备邮件内容 $Fields = "Name: " . $name . "\n"; $Fields .= "Email: " . $email . "\n"; $Fields .= "Subject: " . $subject . "\n"; $Fields .= "Message: " . $message . "\n"; // 配置邮件头,添加Reply-To让回复可以直接回到用户邮箱 $headers = "From: " . $senderEmail . "\r\n"; $headers .= "Reply-To: " . $email . "\r\n"; $headers .= "X-Mailer: PHP/" . phpversion() . "\r\n"; $headers .= "Content-Type: text/plain; charset=utf-8\r\n"; // 发送邮件 $success = mail($EmailTo, $Title, $Fields, $headers);
三、备选更稳定方案
如果修改后仍无法正常发信,建议放弃原生mail()函数,改用PHPMailer走SMTP协议发信,SMTP发信不受共享主机mail()函数规则限制,投递成功率远高于原生函数,可直接使用你域名下的邮箱SMTP配置、或者Gmail/Outlook等第三方邮箱的SMTP服务。
内容的提问来源于stack exchange,提问作者thealakeshsaha
相关产品推荐
相关产品推荐

