Я пытаюсь запланировать электронное письмо, чтобы напомнить пользователям, которым нужно выполнить задачи завтра. Я сделал кастомную команду email:reminder. Вот мой код в пользовательской команде:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Todo;
use Illuminate\Support\Facades\Mail;
class SendReminderEmail extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'email:reminder';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Remind users of items due to complete next day';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
/*
* Send mail dynamically
*/
/*
* hardcoded email
*/
Mail::queue('emails.reminder', [], function ($mail) {
$mail->to('[email protected]')
->from('[email protected]', 'To-do Reminder')
->subject('Due tomorrow on your To-do list!');
}
);
$this->info('Reminder email sent successfully!');
}
}
Я жестко запрограммировал электронное письмо, чтобы проверить его, но когда я запустил php artisan email:reminder, я получил исключение:
[InvalidArgumentException]
Only mailables may be queued.
Затем я проверил документацию Laravel, но планирование задач и очередь электронной почты - это две отдельные темы.
Любая помощь приветствуется!
Привет, Аднан, не могли бы вы уточнить, пожалуйста? Я не понимаю, как здесь можно использовать Supervisor? Я думал, что вместо этого мне может понадобиться создать задание электронной почты, но как тогда я могу запланировать регулярное выполнение этого задания?
супервизор будет следить за процессом очереди. Система рассылки Laravel основана на очередях. Отправка письма пользователю занимает много времени, и вы не хотите, чтобы пользователь его ждал. Итак, laravel публикует почту в очереди, очередь будет обрабатывать воркер. Супервизор позаботится о том, чтобы рабочий будет перезапущен, когда он остановится.






Вы должны создать команду, которая будет действовать точно так, как вы описали, но без расписания. Вы можете использовать crontab для планирования или какой-либо другой планировщик задач.
Вы следовали документации Laravel о рассылке писем? https://laravel.com/docs/5.6/mail
Как только вы дойдете до Раздел "Отправка почты", вам следует создавать не контроллер, а команду.
Когда эта команда сработает, добавьте ее в планировщик задач (например, crontab) для ежедневного выполнения.
Привет, Лерой, не могли бы вы пояснить, что вы имеете в виду под «без планирования», вы имеете в виду удаление кода в методе handle() в команде? Мое планирование выполняется в Kernel.php. Создал почту по документации, сделал работу. Теперь у меня есть SendTodoEmail.php в папке Mail и один в папке Job. Но если я поставлю Mail::to ... в команду, что я должен поместить в handle() задания очереди?
Я понял, могу запланировать работу. Спасибо за вашу помощь.
Я считаю, что ваша команда не должна выполнять какое-либо планирование. Если ваша команда может сделать то, что нужно сделать. Добавьте расписание в планировщик. У Laraval есть планировщик, как описывает @DigitalDrifter.
Да, я обнаружил это позже в документации. Ура, чувак! :)
Mail::queue('emails.reminder', [], function ($mail) {
$mail->to('[email protected]')
->from('[email protected]', 'To-do Reminder')
->subject('Due tomorrow on your To-do list!');
}
);
устарела с Laravel 5.3. В очередь могут помещаться только почтовые объекты, и он должен реализовывать интерфейс ShouldQueue.
Для выполнения заданий вам необходимо настроить queue driver и запустить php artisan queue:work.
Спасибо, Аднан, я создал почтовый класс и работу. Но как я могу выполнять задание регулярно (по расписанию)? Метод Лероя звучит многообещающе, но я не понял того, что он сказал, "без расписания".
Использовать консольное ядро для запланировать задания в очереди легко. Laravel предлагает несколько методов-оберток, которые упрощают интеграцию cron. Вот простой пример:
$schedule->job(new SendTodoReminders())->dailyAt('9:00');
Да! Я обнаружил это позже и в документации. : D Спасибо и хорошего дня!
у вас есть установка супервизора?