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

Laravel使用队列发送邮件时报stdClass::$subscription未定义错误

问题根因

该问题核心原因有两个,优先级从高到低排列:

  • 队列进程加载的是旧版本代码:Laravel 队列 Worker 启动后会将所有代码载入内存,后续代码修改不会自动同步到运行中的队列进程。你同步发信正常说明 Web 侧运行的是最新代码,但是队列进程还在执行旧版本逻辑,旧版本中大概率存在$subscription属性的调用代码。
  • SerializesModels Trait 与入参类型不兼容:你在 Mailable 类中引入的SerializesModels是为 Eloquent 模型序列化设计的,你传入的是自定义stdClass对象,序列化反序列化过程中可能触发异常的属性检测逻辑,导致报错。
  • 额外隐性问题:你构造函数的注释标注入参为数组类型,但实际传入的是stdClass对象,弱类型虽然不会直接报错,但会提升类型相关的异常概率。

解决步骤

  1. 重启队列进程
    在项目根目录执行命令重启队列,强制加载最新代码:
php artisan queue:restart

如果使用 supervisor 管理队列,执行命令后 supervisor 会自动拉起新的队列进程,旧进程执行完当前任务后自动退出。

  1. 清理所有缓存
    依次执行命令清理项目残留缓存:
php artisan config:clear
php artisan view:clear
php artisan cache:clear
  1. 代码兼容性优化(可选建议)
    如果后续不想出现同类序列化问题,可以做二选一调整:
  • 控制器传入数组替代stdClass,对应调整 Mailable 类中属性调用的语法为数组格式,避免序列化异常。
// 控制器代码调整示例
$mail = [
    'to' => ['email' => 'someemail@gmail.com', 'name' => 'Name test'],
    'subject' => 'Subject test',
    'body' => 'Body test'
];
\Mail::queue(new \App\Mail\NewCustomer($mail));
  • 确定不需要序列化 Eloquent 模型的前提下,直接移除NewCustomer类中的SerializesModels Trait 即可。
  1. 极端情况排查
    如果执行完上述步骤仍然报错,直接打开服务器上/home/sm/public_html/app/Mail/NewCustomer.php文件,核对第45行的实际代码,确认是否存在本地未同步到服务器的$subscription调用逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:48:02