You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用邮件队列时env变量中西里尔文发件人名称乱码如何解决

问题原因

这个问题是Laravel配置加载机制和CLI进程编码差异共同导致的:

  1. 运行过php artisan config:cache生成配置缓存后,Laravel会禁止在业务代码中直接调用env()函数读取环境变量,只有配置文件中定义的配置项可以通过config()函数正常读取。同步发送走web请求,每次请求都会重新加载.env,不会触发这个限制;但队列任务跑在常驻的CLI工作进程中,进程启动时就已经加载完配置缓存,此时在任务执行阶段调用env()只能拿到无效值。
  2. 服务器CLI进程的默认编码如果不是UTF-8,直接用env()读取西里尔文这类非ASCII字符时,会出现编码解析错误,无法识别字符编码就返回NULL,最终显示为乱码。
彻底解决方案

完全不需要手动传参到构造函数,按照Laravel官方规范修改代码即可:

  1. 所有环境变量统一在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'),
  1. 所有业务代码中替换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,
        ]);
}
  1. 确认你的.env文件是UTF-8无BOM编码保存,避免文件本身编码异常。
  2. Linux服务器可以执行locale命令检查CLI默认编码,如果不是UTF-8,修改系统locale为对应语言的UTF-8编码即可。
  3. 修改完成后执行以下命令生效:
# 重新生成配置缓存
php artisan config:cache
# 重启队列进程加载新配置
php artisan queue:restart

内容的提问来源于stack exchange,提问作者Krezo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:24:03