Laravel 5.8 如何实现邮件秒/分钟级延迟发送?相关报错如何解决?
Laravel 5.8 延迟发送邮件解决方案
错误原因
之前的写法混淆了Laravel邮件系统的队列/延迟方法调用逻辑:later本身就是触发队列投递的方法,不需要再链式调用send或queue,错误的调用顺序导致框架无法正确识别可队列化的Mailable实例,所以抛出Only mailables may be queued报错。
正确实现方式
Laravel 5.8中支持两种常用的延迟发送邮件写法,可按秒或分钟自定义延迟时长:
写法1:直接使用later方法
later方法的第一个参数为延迟时长(整数单位为秒,也可传入Carbon实例指定时间),第二个参数为Mailable实例,无需额外调用send/queue:
// 延迟5秒发送 Mail::to($email)->later(5, new PasswordMail($data)); // 延迟10分钟发送 Mail::to($email)->later(now()->addMinutes(10), new PasswordMail($data));
写法2:给Mailable实例绑定延迟后调用queue
如果习惯用queue方法投递,可以给Mailable实例调用delay方法配置延迟时长:
// 延迟5秒发送 Mail::to($email)->queue( (new PasswordMail($data))->delay(5) ); // 延迟10分钟发送 Mail::to($email)->queue( (new PasswordMail($data))->delay(now()->addMinutes(10)) );
注意事项
- 确保你的
PasswordMail类继承了Illuminate\Mail\Mailable基类,这是邮件可队列化的前提。 - 队列驱动需配置为
database、redis等支持延迟队列的类型,不要使用默认的sync同步驱动,否则延迟配置不会生效。 - 配置完成后需要启动队列worker进程,才能正常消费延迟邮件任务。
内容的提问来源于stack exchange,提问作者Pistone Sanjama
相关产品推荐
相关产品推荐

