Сендер почты по расписанию

проект таск-менеджер, стоит следующая задача: необходимо сделать сендер-напоминалку за день до окончания задачи на почту пользователя. Примерный алгоритм:

  1. Задача создаётся с полем id и deadline, летит в очередь
  2. Шедулер подхватывает значение deadline и высчитывает дату как deadline - date.now + 24h и когда этот момент настает, вызывает сендер с данными задачи (задачу нужно отобразить в письме в таком виде, в каком и на сайте)
  3. Удаление задачи с очереди и шедулера

Если я правильно понял алгоритм, подскажите, пожалуйста, как реализовать это


Ответы (1 шт):

Автор решения: Gromfer
  1. Зачем задача летит в очередь? Она просто хранится в бд.
  2. Как вариант, шедулер раз в час запускает джоб на проверку задач по которым нужно разослать уведомления о дедлайне.
$scheduler->job(new CheckForTaskDeadlinedJob())->hourly();

В джобе берешь задачи по которым нужно отправить уведомление. Если важно уведомить только один раз, то можно добавить флаг о том что уведомление уже было отправлено.

function handle() {
    Task::whereDate('deadline_at', '<', now()->addDay())
        ->each(fn(Task $task) => dispatch(new TaskDeadlinedNotification($task)));
}
  1. Джоб с уведомлением отправляет письмо, в нем можно отправить задачу как view файл.

Если что-то не понятно, спрашивай

→ Ссылка