PHP联系表单无法发送邮件,附HTML与PHP代码求错误排查
问题排查与修复方案
1 HTML表单参数冲突
你在HTML表单里定义了两个name="Email"的元素:
- 邮箱输入框的name属性是
Email - 提交按钮的name属性也设成了
Email
表单提交时后出现的元素会覆盖前面的参数值,导致PHP里拿到的$_POST['Email']值是提交按钮的submit,而非用户输入的邮箱地址,这是核心问题之一。
修复方法
把提交按钮的name属性改成其他值,比如name="submit",同时PHP里的触发判断也对应改成if (isset($_POST['submit']))即可。
2 错误被屏蔽无法定位问题
你在调用mail()函数前加了错误抑制符@,会直接屏蔽掉所有邮件发送的报错信息,就算发送失败你也看不到任何提示,无法定位具体问题。
修复方法
先把@符号去掉,开启PHP错误提示,就能看到是函数调用失败、还是服务器没有配置邮件服务等具体错误。
3 邮件头配置不符合规范容易被拒收
你直接把用户提交的邮箱作为邮件的From发件人,大部分主流邮箱服务商都会判定这种伪造发件人的邮件为垃圾邮件,要么直接拒收,要么投进垃圾箱,导致你无法正常收到。
修复方法
把From头改成你服务器对应域名下的官方邮箱,比如no-reply@yourdomain.com,用户提交的邮箱只放在Reply-To头里即可,这样你收到邮件后回复,还是会直接发送到用户的邮箱,同时不会被判定为伪造发件人。
4 其他排查方向
- 先检查你的邮箱垃圾箱,很多时候测试邮件会被自动归类到垃圾箱
- 大部分默认的服务器环境并没有配置邮件发送服务,
mail()函数本身就无法运行,这种情况建议改用SMTP方式发送邮件,绑定第三方邮箱的SMTP服务发送,成功率会高很多 - 可以加一行发送结果的判断,直接查看发送状态:
$send_result = mail($email_to, $email_subject, $email_message, $headers); if($send_result) { echo "发送成功"; } else { echo "发送失败,错误信息:".error_get_last()['message']; }
内容的提问来源于stack exchange,提问作者MD Sulaiman
相关产品推荐
相关产品推荐

