PHP mail()函数无报错却无法发送邮件的问题排查求助
故障排查点及修复方案
变量名不匹配,核心逻辑未执行/邮件内容无效
- HTML表单中尺寸单选框的
name属性为tsize,但PHP代码中获取该字段的写法为$tsize = $_POST['size'];,无法正确拿到表单提交的尺寸值 - 邮件HTML模板中输出尺寸的变量写为
$tutasize,该变量不存在,会导致邮件内容出现未定义变量警告,部分服务商可能拦截内容异常的邮件
修复:将PHP中对应代码改为$tsize = $_POST['tsize'];,同时把邮件模板里的$tutasize替换为$tsize
- HTML表单中尺寸单选框的
验证码校验逻辑大概率未通过,发信代码根本没执行
- 首先检查你的服务器是否能正常访问谷歌服务:验证码校验需要请求谷歌的recaptcha接口,如果是中国大陆地区的服务器,该请求会直接失败,
$responseData->success永远为false,不会走到发信分支 - 你当前没有加任何分支的错误提示,建议在验证码校验失败的else分支、验证码参数为空的else分支都加上错误打印,快速定位是不是卡在了验证码校验环节
- 确认谷歌验证码的站点密钥、服务端密钥是匹配的,你代码里贴的密钥不完整,确认实际运行时填的是完整正确的密钥
- 首先检查你的服务器是否能正常访问谷歌服务:验证码校验需要请求谷歌的recaptcha接口,如果是中国大陆地区的服务器,该请求会直接失败,
邮件头不符合规范导致被服务商拦截
$headers变量未初始化就使用.=拼接,会导致头部开头出现未定义警告的内容,破坏邮件头格式From字段值仅写了Moving,不符合邮件规范,必须为合法邮箱格式,示例:From: 搬家表单 <noreply@你的站点域名.com>,发件域名需要和你实际发信的服务器域名匹配,否则极大概率被反垃圾规则拦截
修复:在拼接headers前添加$headers = '';初始化,修改From字段为带合法邮箱的格式
mail()函数本身配置/执行失败
- 你当前没有判断
mail()函数的执行结果,函数执行失败返回false的话你也感知不到,建议修改发信代码为:
$sendResult = mail($to, $subject, $main, $headers); if (!$sendResult) { // 可打印错误信息或者记录日志,也可以用error_get_last()查看具体报错 print_r(error_get_last()); }- 大部分服务器默认没有配置SMTP发信服务,PHP原生的
mail()函数需要依赖系统的sendmail组件或者配置好的SMTP服务,如果服务器没有做对应配置,mail()会直接执行失败。如果不想折腾服务器配置,建议改用PHPMailer等第三方发信库,直接对接第三方SMTP发信服务,发信成功率更高
- 你当前没有判断
其他排查点
- 即使
mail()返回成功,邮件也可能被收信方的反垃圾规则拦截,优先去收信邮箱的垃圾邮件、广告邮件文件夹查找 - 确认你代码里填写的收信邮箱是你实际在用的正确邮箱
- 即使
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

