Laravel使用邮件队列时env变量中西里尔文发件人名称乱码如何解决
问题原因
这个问题是Laravel配置加载机制和CLI进程编码差异共同导致的:
- 运行过
php artisan config:cache生成配置缓存后,Laravel会禁止在业务代码中直接调用env()函数读取环境变量,只有配置文件中定义的配置项可以通过config()函数正常读取。同步发送走web请求,每次请求都会重新加载.env,不会触发这个限制;但队列任务跑在常驻的CLI工作进程中,进程启动时就已经加载完配置缓存,此时在任务执行阶段调用env()只能拿到无效值。 - 服务器CLI进程的默认编码如果不是UTF-8,直接用
env()读取西里尔文这类非ASCII字符时,会出现编码解析错误,无法识别字符编码就返回NULL,最终显示为乱码。
彻底解决方案
完全不需要手动传参到构造函数,按照Laravel官方规范修改代码即可:
- 所有环境变量统一在
config目录的配置文件中定义,你需要的邮件参数Laravel默认已经在config/mail.php中预置了配置项:
// config/mail.php 默认已存在以下配置,不需要额外修改 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 'name' => env('MAIL_FROM_NAME', 'Example'), ], // 可以自行添加收件人配置项 'mail_to' => env('MAIL_TO'),
- 所有业务代码中替换
env()调用为config()调用,比如发送代码修改为:
Mail::to(config('mail.mail_to'))->queue(new MortgageApplication($validatedReqest['name'], $validatedReqest['phone']));
Mailable的build方法修改为:
public function build() { return $this->subject('test') ->from(config('mail.from.address'), config('mail.from.name')) ->view('mortgage-application') ->with([ 'name' => $this->name, 'phone' => $this->phone, ]); }
- 确认你的.env文件是UTF-8无BOM编码保存,避免文件本身编码异常。
- Linux服务器可以执行
locale命令检查CLI默认编码,如果不是UTF-8,修改系统locale为对应语言的UTF-8编码即可。 - 修改完成后执行以下命令生效:
# 重新生成配置缓存 php artisan config:cache # 重启队列进程加载新配置 php artisan queue:restart
内容的提问来源于stack exchange,提问作者Krezo
相关产品推荐
相关产品推荐

