Laravel调用Mail::send触发Swift_TransportException连接错误
解决Mail::send连接mailtrap.io被拒绝(Connection refused #111)的问题
嘿,我之前也踩过这个坑,给你几个实打实的排查方向,应该能快速解决:
先核对.env邮件配置,这是最常见的问题
确保你的.env里的邮件参数完全和mailtrap提供的一致,别写错端口或者加密方式:MAIL_MAILER=smtp MAIL_HOST=mailtrap.io MAIL_PORT=2525 # 划重点!mailtrap默认用2525,别写成25或465 MAIL_USERNAME=你的mailtrap专属用户名 MAIL_PASSWORD=你的mailtrap专属密码 MAIL_ENCRYPTION=tls # 这里用tls而非ssl MAIL_FROM_ADDRESS=test@example.com MAIL_FROM_NAME="${APP_NAME}"改完配置必须清缓存,不然Laravel会读旧配置:
php artisan config:clear php artisan cache:clear排查网络/防火墙限制
如果配置没问题,大概率是你的机器或服务器封了2525端口。用telnet测下连通性:telnet mailtrap.io 2525要是连不上,就得找运维开放端口,或者试试mailtrap的备用端口(比如465、587)。
确认mailtrap账户状态
偶尔免费版mailtrap账号会因为长期闲置或异常操作被临时限制,登录mailtrap后台看看你的收件箱是不是正常,有没有收到限制通知。检查config/mail.php的硬编码覆盖
有些时候会不小心在config/mail.php里硬写了配置,覆盖了.env的值,确保smtp驱动的配置是读取env变量的:'smtp' => [ 'transport' => 'smtp', 'host' => env('MAIL_HOST', 'mailtrap.io'), 'port' => env('MAIL_PORT', 2525), 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'timeout' => null, 'auth_mode' => null, ],用极简代码测试排除业务逻辑问题
写个简单的路由测试,排除是你业务代码里的邮件逻辑导致的问题:Route::get('/test-mail', function () { Mail::raw('这是测试邮件内容', function ($message) { $message->to('test@example.com')->subject('测试邮件'); }); return '邮件发送请求已提交!'; });访问这个路由如果还是报错,就是基础配置/网络问题;如果能发,那就是你业务代码里的邮件逻辑有问题。
另外提个Docker环境的小坑:如果是在容器里跑Laravel,要确保容器用的是能访问外部的网络模式,别用封闭的网络配置。
内容的提问来源于stack exchange,提问作者Elite
相关产品推荐
相关产品推荐

