Laravel 5.5 Redis队列发送邮件报错:对象不完整
我之前帮朋友排查过一模一样的问题,正好匹配你的场景:用Laravel 5.5框架,Redis存储队列任务,执行Mail::to($customer)->queue(new WelcomeMail($customer))时触发了这个报错:
Illuminate\Mail\SendQueuedMailable::handle() : The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Security\Mail\WelcomeMail" of the object you are trying to operate on was loaded before unserialize() gets called or provide an autoloader to load the class definition in /var/www/html/vendor/laravel/framework/src/Illuminate/Mail/SendQueuedMailable.php
结合你给出的WelcomeMail代码,我整理了问题根源和具体解决步骤:
问题本质
这个错误核心是队列Worker进程在反序列化任务时,找不到Security\Mail\WelcomeMail类的定义。Laravel会把队列任务序列化后存在Redis中,Worker取出任务执行时需要反序列化,但如果Worker启动时没加载到目标类,就会报“不完整对象”的错误。
具体解决步骤
1. 补上类的命名空间(最可能的问题根源)
你贴出的WelcomeMail代码里没有声明命名空间,但错误提示明确指向Security\Mail\WelcomeMail,所以必须在类文件顶部加上正确的命名空间:
namespace Security\Mail; // 这一行必须添加 use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class WelcomeMail extends Mailable implements ShouldQueue { // ... 你的其他代码 }
同时要确保文件路径和命名空间严格对应:文件必须放在app/Security/Mail/WelcomeMail.php(Laravel默认app目录是自动加载的根目录)。
2. 重启队列Worker
Laravel的Worker是常驻进程,如果你是在创建WelcomeMail类之后才启动的Worker,它不会自动加载新的类文件。执行以下命令重启:
# 先让所有正在运行的Worker完成当前任务后退出 php artisan queue:restart # 重新启动Redis队列的Worker进程 php artisan queue:work redis
3. 更新Composer自动加载映射
执行Composer命令更新类的自动加载规则,确保Composer能正确找到你的类:
composer dump-autoload -o
-o参数会生成优化后的类映射,能提升自动加载的准确性和效率。
4. 清理环境缓存(生产环境必做)
如果是在生产环境部署,还要清理配置和缓存,避免旧配置干扰:
php artisan config:clear php artisan cache:clear
验证方法
完成以上步骤后,重新执行Mail::to($customer)->queue(new WelcomeMail($customer))推送任务,观察Worker日志,应该就能正常处理邮件发送任务了。
内容的提问来源于stack exchange,提问作者Ghassan Barghouti

