PHP发送用户注册验证邮件失败,原正常运行代码近期失效如何排查
问题原因排查及修复方案
代码层面可直接修复的问题
- HTML内容标签不匹配
你的邮件内容HTML存在标签闭合错误:<h3>Account activation code: </h4>用h3开头却用h4闭合,<h2 style="color:#ec5f06;">' . $tempCode . '</h3>用h2开头用h3闭合。当前主流邮件服务商对邮件内容的HTML合法性校验规则收紧,不规范的标签会直接导致发送请求被拦截。 - 收件人邮箱处理逻辑错误
你对收件人邮箱使用了htmlspecialchars()处理,邮箱地址不需要做HTML实体转义,该操作会把合法特殊字符转义为无效字符串,导致收件人地址非法。 - 邮件头格式不规范
PHP原生mail()函数要求邮件头每一行必须以\r\n(CRLF)结尾,且必须明确指定字符集,PHP版本更新后对头部格式的校验更严格,你当前的写法缺少字符集声明,换行符如果和服务器操作系统不匹配也会直接导致发送失败。 - 发件人缺少合法性声明
你的发件人头部只有邮箱地址,未按照标准格式书写,容易被邮件服务商判定为垃圾邮件触发拒收。
修复后代码
// 收件人邮箱只做必要的转义和清理,去掉htmlspecialchars $mail = trim($conn->real_escape_string($_POST["mail"])); $subject = "FULLBX.COM"; // 修正HTML标签闭合 $message = '<h3>Account activation code: </h3> <h2 style="color:#ec5f06;">' . $tempCode . '</h2>'; // 规范邮件头格式,统一用\r\n换行,增加字符集声明 $header = "From: FULLBX Support <support@fullbx.com>\r\n"; $header .= "Cc: support@fullbx.com\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-type: text/html; charset=utf-8\r\n"; $mailsent = mail($mail,$subject,$message,$header); if ($mailsent) { $_SESSION["tempcode"] = $tempCode; $_SESSION["username"] = $username; $_SESSION["mail"] = $mail; $_SESSION["phone"] = $phone; $_SESSION["pass"] = $pass; }else{ // 调试阶段可打开下方注释查看具体错误,上线后关闭 // var_dump(error_get_last()); echo "email is not sending please try again"; exit(); }
额外排查建议
- 打开PHP错误提示,通过
error_get_last()获取mail()函数返回的具体错误信息,可快速定位是参数错误还是服务器邮件服务配置问题 - 检查服务器域名的SPF、DKIM记录是否配置正确,近期如果有服务器IP更换、域名解析变更,会导致发件人合法性校验失败被邮件服务商拒收
- 原生
mail()函数容错性极低,长期使用建议替换为成熟的邮件发送类库,可大幅降低格式校验、发送失败的概率
内容的提问来源于stack exchange,提问作者Tako Kobaxidze
相关产品推荐
相关产品推荐

