Laravel 5.6 Как запланировать очередь электронной почты

Я пытаюсь запланировать электронное письмо, чтобы напомнить пользователям, которым нужно выполнить задачи завтра. Я сделал кастомную команду 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, но планирование задач и очередь электронной почты - это две отдельные темы.

  • Как я могу добиться отправки очереди электронной почты с помощью планирования задач в Laravel 5.6 пожалуйста?
  • Также как я могу передать данные, то есть задачи из базы данных, на свой адрес электронной почты просмотрите пожалуйста?

Любая помощь приветствуется!

у вас есть установка супервизора?

Adnan Mumtaz 06.05.2018 11:03

Привет, Аднан, не могли бы вы уточнить, пожалуйста? Я не понимаю, как здесь можно использовать Supervisor? Я думал, что вместо этого мне может понадобиться создать задание электронной почты, но как тогда я могу запланировать регулярное выполнение этого задания?

Wei 06.05.2018 11:36

супервизор будет следить за процессом очереди. Система рассылки Laravel основана на очередях. Отправка письма пользователю занимает много времени, и вы не хотите, чтобы пользователь его ждал. Итак, laravel публикует почту в очереди, очередь будет обрабатывать воркер. Супервизор позаботится о том, чтобы рабочий будет перезапущен, когда он остановится.

Leroy 06.05.2018 11:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
3
7 968
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вы следовали документации Laravel о рассылке писем? https://laravel.com/docs/5.6/mail

Как только вы дойдете до Раздел "Отправка почты", вам следует создавать не контроллер, а команду.

Когда эта команда сработает, добавьте ее в планировщик задач (например, crontab) для ежедневного выполнения.

Привет, Лерой, не могли бы вы пояснить, что вы имеете в виду под «без планирования», вы имеете в виду удаление кода в методе handle() в команде? Мое планирование выполняется в Kernel.php. Создал почту по документации, сделал работу. Теперь у меня есть SendTodoEmail.php в папке Mail и один в папке Job. Но если я поставлю Mail::to ... в команду, что я должен поместить в handle() задания очереди?

Wei 06.05.2018 12:57

Я понял, могу запланировать работу. Спасибо за вашу помощь.

Wei 06.05.2018 13:18

Я считаю, что ваша команда не должна выполнять какое-либо планирование. Если ваша команда может сделать то, что нужно сделать. Добавьте расписание в планировщик. У Laraval есть планировщик, как описывает @DigitalDrifter.

Leroy 06.05.2018 15:28

Да, я обнаружил это позже в документации. Ура, чувак! :)

Wei 06.05.2018 15:43
 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.

Спасибо, Аднан, я создал почтовый класс и работу. Но как я могу выполнять задание регулярно (по расписанию)? Метод Лероя звучит многообещающе, но я не понял того, что он сказал, "без расписания".

Wei 06.05.2018 12:28
Ответ принят как подходящий

Использовать консольное ядро ​​для запланировать задания в очереди легко. Laravel предлагает несколько методов-оберток, которые упрощают интеграцию cron. Вот простой пример:

$schedule->job(new SendTodoReminders())->dailyAt('9:00');

Да! Я обнаружил это позже и в документации. : D Спасибо и хорошего дня!

Wei 06.05.2018 15:41

Другие вопросы по теме