Laravel 9部署Linux主机后无法连接SMTP服务器发送邮件问题
核心原因判断
报错Network is unreachable说明你的Linux主机根本无法建立到SMTP服务器的网络连接,和Laravel配置、邮箱账号权限关系不大,重点排查主机的网络限制。
具体排查步骤
直接在主机上测试SMTP端口连通性
登录Linux主机,用telnet或nc命令验证端口是否能通:# 测试Gmail 587端口 telnet smtp.gmail.com 587 # 或者用nc命令 nc -zv smtp.gmail.com 587如果返回“Connection refused”或“Network is unreachable”,实锤主机网络被限制。
检查主机防火墙/安全组规则
多数云服务商(如阿里云、腾讯云)默认封禁出站的25、587、465端口,需要去服务商的安全组控制台手动开启这些端口的出站权限。另外主机本地的iptables或ufw防火墙也可能拦截,可临时关闭测试:# Ubuntu/Debian系统关闭ufw sudo ufw disable # CentOS/RHEL系统关闭firewalld sudo systemctl stop firewalld测试完成后记得重新开启防火墙,别留安全隐患。
确认主机运营商是否封禁SMTP端口
部分虚拟主机或廉价VPS运营商会封禁外部SMTP出站端口,强制用户使用自家邮件服务。直接联系服务商确认是否有端口限制。改用主机服务商自带的SMTP服务
如果是运营商封禁了外部端口,换成主机服务商提供的SMTP(比如cPanel内置SMTP、阿里云企业邮箱SMTP),一般能绕过限制。再次确认Laravel配置缓存
虽然你说清过缓存,但再执行一遍确保配置生效:php artisan config:clear php artisan cache:clear php artisan route:clear也可以在控制器里临时打印
env('MAIL_HOST'),确认加载的是.env里的正确配置。
代码小优化建议
你的ContactFormMessage里直接调用env()函数,建议改成读取配置文件:在config/mail.php里添加'admin_contact' => env('APP_ADMIN_CONTACT'),然后邮件类里用config('mail.admin_contact'),这样配置缓存后也能正常读取。
内容的提问来源于stack exchange,提问作者Sam

