PHPMailer本地发信正常 线上报SMTP Error: Could not authenticate如何解决
PHPMailer部署到托管服务器后SMTP验证失败排查方案
- 首先排查托管服务器端口连通性
绝大多数共享托管服务商默认会封禁SMTP常用的25、465、587端口,你可以先在服务器端运行端口连通测试代码:
若连通失败,联系主机商开放对应端口,也可以尝试切换加密方式与端口组合,比如将SSL 465换成TLS 587重试。$conn = fsockopen('smtp.gmail.com', 465, $errno, $errstr, 10); if (!$conn) echo "端口连通失败:$errstr ($errno)"; else echo "端口连通正常"; - 修正Gmail账号认证逻辑
谷歌从2022年5月起已全面停止普通谷歌账号的「低安全性应用访问」支持,新注册的账号即便开启对应开关也无法正常通过SMTP验证,本地能发送大概率是本地IP为你常用登录IP,触发了谷歌的临时放行规则,服务器IP属于异地登录直接被拦截。
正确操作是先给Gmail账号开启两步验证,之后生成应用专用密码,用该密码替换你PHPMailer配置里的原账号密码即可。 - 核对PHPMailer配置项正确性
确认部署后的配置未出现参数错误:SMTPAuth必须设为true,SMTPSecure参数要和端口匹配,465端口对应ssl、587端口对应tls,同时检查是否存在本地与线上两套配置,线上配置的账号、密码是否存在输入错误。 - 开启SMTP调试定位具体问题
将PHPMailer的SMTPDebug参数设为2,输出完整的SMTP交互日志,若日志提示需通过网页端登录验证,就是明确的Gmail安全拦截,按上述账号配置步骤处理即可;若日志提示TLS握手失败,继续往下排查。 - 排查服务器SSL证书问题
部分托管服务器的CA根证书不全,无法验证Gmail的SMTP服务端证书,会导致握手失败被判定为认证失败。你可以临时添加配置跳过证书验证测试:
若测试可正常发送,说明是服务器证书问题,后续给服务器补全CA根证书即可,不建议长期关闭证书验证。$mail->SMTPOptions = [ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ] ];
内容的提问来源于stack exchange,提问作者KenTay7
相关产品推荐
相关产品推荐

