队列延迟,在特定时间发送电子邮件

时间:2016-08-22 05:26:57

标签: php laravel email queue laravel-5.3

想要实现的是在选定的时间(由用户)发送和发送电子邮件 所以我的方法是计算时差,然后把它作为队列的延迟时间。

但它似乎没有像我期望的那样工作 所有电子邮件都在一起而不是在合适的时间交付

控制器

    public function notifyme($add)
{

    $created = Carbon::now()->addMinutes($add);
    $now = Carbon::now();

    $days = 1440*$created->diff($now)->days;
    $hours = 60*$created->diff($now)->h;
    $minutes = $days + $hours + $created->diff($now)->i;

    $user = Auth::user();


    $user->notify((new notifyme($user))->delay($minutes));

     return redirect('/notif');
}

路线

Route::get('notifyme/{add}', 'HomeController@notifyme');

.env

QUEUE_DRIVER="database"

即时使用laravel 5.3,以便notifyme控制器实现ShouldQueue合约。

现在,当我运行php artisan queue:workphp artisan queue:listen并对其进行测试时 电子邮件发送被延迟了,但是当我再次这样做时(虽然第一份工作仍然被延迟),这两封电子邮件会立即发送到一起或者在一段时间之后(不是在合适的时间加上)。

知道这里有什么问题吗? 有更好的方法吗?喜欢使用时间表?或者什么?

2 个答案:

答案 0 :(得分:0)

可以遵循一种方法来实现发送电子邮件的队列延迟是使用具有队列功能的Laravel内置邮件功能。 您可以参考Laravel Delay Mail Queue

EG:

 Mail::later(5, 'emails.welcome', $data, function ($message) {
//
});

5是延迟秒。

答案 1 :(得分:0)

对于Laravel 6 +

Delaying Emails

如果您希望延迟发送排队的电子邮件,则可以使用后面的方法。作为第一个参数,后一种方法接受一个DateTime实例,该实例指示何时发送消息:

$when = now()->addMinutes(10);

Mail::to($request->user())
    ->later($when, new OrderShipped($order));