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

Laravel 5.4中php artisan queue:work无法运行,邮件队列不生效求助

解决Laravel 5.4队列发送验证邮件无响应的问题

我完全理解你现在的困扰——jobs表已经有任务记录,但php artisan queue:work就是没输出,Gmail验证邮件也收不到,折腾半天找不到问题确实让人头大。咱们一步步排查,应该能快速定位问题:

1. 先确认队列驱动与配置是否正确

Laravel 5.4默认用的是sync同步驱动,这种模式下任务不会存入jobs表,会直接执行。既然你的jobs表有数据,说明你应该配置了database驱动,但还是要再核对:

  • 检查.env文件:确保QUEUE_DRIVER=database(注意Laravel 5.4用的是QUEUE_DRIVER,不是后续版本的QUEUE_CONNECTION)
  • 检查config/queue.php中的database配置:确认数据库连接和你的主应用数据库一致,避免worker连错库读不到任务
  • 如果之前执行过php artisan config:cache,一定要运行php artisan config:clear刷新配置,否则worker会使用旧的缓存配置

2. 排查Job类的序列化与依赖问题

直接传递模型实例到Job有时会遇到序列化异常,尤其是模型带有复杂关联时。可以尝试改为传递用户ID,在handle方法中重新获取用户:

// 修改SendVerificationEmail类
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Mail;
use App\User;

class SendVerificationEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $userId;

    public function __construct($userId)
    {
        $this->userId = $userId;
    }

    public function handle()
    {
        $user = User::findOrFail($this->userId);
        $data = ['email_token' => $user->email_token];
        
        Mail::send('email.email', $data, function($message) use ($user) {
            $message->subject('This mail send by Queue Laravel 5.4');
            $message->to($user->email);
        });
    }
}

然后在RegistrationController的register方法中修改dispatch代码:

dispatch(new SendVerificationEmail($user->id));

同时确认RegistrationController顶部已经引入Job类:

use App\Jobs\SendVerificationEmail;

3. 验证邮件配置本身是否正常

队列没反应也可能是邮件发送本身失败,先跳过队列测试同步发送是否可行:

  • 在routes/web.php中添加测试路由:
Route::get('/test-mail', function() {
    Mail::send('email.email', [], function($message) {
        $message->subject('Test Direct Mail')->to('your-test-email@example.com');
    });
    return 'Test mail dispatched';
});

访问该路由,如果收不到邮件,说明是Gmail配置的问题:

  • 确保.env中的Gmail配置正确:
    MAIL_DRIVER=smtp
    MAIL_HOST=smtp.gmail.com
    MAIL_PORT=587
    MAIL_USERNAME=your-gmail@gmail.com
    MAIL_PASSWORD=your-app-specific-password  // 开启2FA的账号必须用应用密码,不能用普通密码
    MAIL_ENCRYPTION=tls
    MAIL_FROM_ADDRESS=your-gmail@gmail.com
    MAIL_FROM_NAME="Your App Name"
    
  • 注意:Gmail现在禁止低安全性应用,开启2FA的账号必须在Google账号设置中创建应用密码来替代普通密码。

4. 查看队列worker的详细输出与失败任务

运行worker时加上--verbose参数,能看到详细的执行日志,方便排查错误:

php artisan queue:work --verbose --tries=1

如果任务执行失败,Laravel会把任务存入failed_jobs表(需要先创建该表):

php artisan queue:failed-table
php artisan migrate

之后可以用以下命令查看失败任务:

php artisan queue:failed

同时检查storage/logs/laravel.log文件,里面会记录队列执行或邮件发送的异常信息,比如权限问题、类找不到等。

5. 确认worker的运行环境

如果你的.env设置了APP_ENV=local,运行worker时要指定环境,否则可能读取到默认的production配置:

php artisan queue:work --env=local

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:00:20