Laravel项目上线后无法发送邮件:SMTP证书CN不匹配问题求助
这个问题我之前帮不少开发者排查过,本质是你的服务器在请求Google SMTP时拿到的证书不对——不是Google的smtp.googlemail.com证书,而是你自己服务器whm001.smart1marketing.com的证书,这说明网络层面肯定有拦截或者配置问题,咱们一步步来解决:
1. 先排查DNS解析是否正常
首先登录你的服务器,执行以下命令检查smtp.googlemail.com的解析结果:
dig smtp.googlemail.com
或者用nslookup:
nslookup smtp.googlemail.com
如果解析出来的IP不是Google官方的SMTP服务器IP(比如显示成你自己服务器的IP或者其他陌生IP),那就是DNS解析出问题了。解决办法是把服务器的DNS换成公共DNS,比如Google的8.8.8.8或者Cloudflare的1.1.1.1,具体操作根据你的主机面板(比如WHM/cPanel)或者服务器系统调整。
2. 更换SMTP端口和加密方式试试
本地用465+SSL正常,但上线后可能被主机商拦截,试试改用587端口+TLS加密,修改你的.env配置:
MAIL_PORT=587 MAIL_ENCRYPTION=tls
改完后一定要清除Laravel缓存:
php artisan config:clear php artisan cache:clear
很多时候587端口的TLS连接不会被拦截,能绕过这个证书问题。
3. 检查服务器是否有SMTP拦截/代理服务
如果你的服务器用的是WHM/cPanel这类主机面板,可能开启了SMTP Restrictions或者类似的邮件中继服务,强制把出站SMTP流量转向本地服务器,导致证书不匹配。你可以在主机面板里查找相关设置,暂时关闭后测试是否正常。另外,也可能是服务器上的防火墙、安全插件(比如ModSecurity)拦截了出站SMTP请求,需要检查相关规则。
4. 临时测试:跳过证书验证(不推荐正式环境使用)
如果上面的方法都不行,可以临时添加配置跳过证书验证,确认是不是证书验证的问题。修改config/mail.php里的smtp配置数组,加入stream参数:
'smtp' => [ 'transport' => 'smtp', 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 'port' => env('MAIL_PORT', 587), 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'timeout' => null, 'auth_mode' => null, // 添加这一段 'stream' => [ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ], ], ],
⚠️ 注意:这个方法只是用来测试,正式环境绝对不能用,因为会跳过证书验证,导致你的邮件数据有被窃听的风险。
5. 联系主机商确认限制
如果以上都没解决,大概率是主机商封锁了Google SMTP的出站连接(不少主机商为了防止垃圾邮件会这么做),直接联系主机商的技术支持,询问是否限制了smtp.googlemail.com的465/587端口,或者是否需要特殊配置才能使用外部SMTP服务。
内容的提问来源于stack exchange,提问作者user12773215

