排队延迟,定时发送邮件

Queue delay , sending an email at a certain time

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

但它似乎没有像我预期的那样工作 所有电子邮件都一起发送,而不是在正确的时间发送

控制器

    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 测试这个 电子邮件发送延迟,但当我再次发送时,(虽然第一份工作仍然延迟)两封电子邮件立即或在某个时间后一起发送(不是在正确的时间 $add)

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

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

EG:

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

5 是延迟秒数。