Laravel报错Unsupported mail transport []的原因排查方案
你遇到的报错:
InvalidArgumentException Unsupported mail transport [].
vendor/laravel/framework/src/Illuminate/Mail/MailManager.php:175
问题原因
报错核心是邮件配置结构错误,框架读取SMTP传输配置时拿到空值,具体有4处问题:
config/mail.php中SMTP配置多嵌套了一层smtp数组键,框架按路径mail.mailers.smtp.transport读取配置时,找不到transport字段,直接返回空值触发报错。env()函数使用错误:该函数第一个参数是.env中定义的变量名,第二个参数才是默认值,原配置直接把邮箱账号、密码写在第一个参数位置,框架无法正确读取对应值。- 注释位置错误:原配置把
failover驱动和mailers数组的闭合括号一起注释掉,导致整个配置数组结构异常。 .env文件中MAIL_USERNAME、MAIL_PASSWORD字段为空,没有填入实际发信凭证。
修复方案
- 修正
config/mail.php配置,去掉多余嵌套、调整注释位置、修正env()调用,正确配置如下:
return [ 'default' => env('MAIL_MAILER', 'smtp'), 'mailers' => [ 'smtp' => [ 'transport' => 'smtp', 'host' => env('MAIL_HOST', 'myserver.myhost.com'), 'port' => env('MAIL_PORT', 465), 'encryption' => env('MAIL_ENCRYPTION', 'ssl'), 'username' => env('MAIL_USERNAME', 'mail@mydomain.com'), 'password' => env('MAIL_PASSWORD', 'mypassword'), 'timeout' => null, 'auth_mode' => null, ], 'ses' => [ 'transport' => 'ses', ], 'mailgun' => [ 'transport' => 'mailgun', ], 'postmark' => [ 'transport' => 'postmark', ], 'sendmail' => [ 'transport' => 'sendmail', 'path' => '/usr/sbin/sendmail -bs', ], 'log' => [ 'transport' => 'log', 'channel' => env('MAIL_LOG_CHANNEL'), ], 'array' => [ 'transport' => 'array', ], /* 'failover' => [ 'transport' => 'failover', 'mailers' => [ 'smtp', 'log', ], ], */ ], 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 'name' => env('MAIL_FROM_NAME', 'Example'), ], 'markdown' => [ 'theme' => 'default', 'paths' => [ resource_path('views/vendor/mail'), ], ], ];
- 补全
.env中的邮件凭证,不要留空:
MAIL_MAILER=smtp MAIL_HOST=myserver.myhost.com MAIL_PORT=465 MAIL_USERNAME=mail@mydomain.com MAIL_PASSWORD=你的发信邮箱实际密码/授权码 MAIL_ENCRYPTION=ssl MAIL_FROM_ADDRESS=mail@mydomain.com MAIL_FROM_NAME="${APP_NAME}"
- 执行命令清除配置缓存,避免旧配置干扰:
php artisan config:clear php artisan cache:clear
校验方法
修复后可以执行php artisan tinker,输入config('mail.mailers.smtp')打印配置,返回结果中存在transport => "smtp"字段即说明配置加载正常,再测试发信即可。
内容的提问来源于stack exchange,提问作者RosaThea
相关产品推荐
相关产品推荐

