Иногда отдельные процессы требуют много времени для выполнения, например, отправка электронной почты, платежный шлюз и т.п. Когда вы отправляете электронную почту для проверки, это занимает время. Если вы не хотите заставлять пользователя ждать, то необходимо использовать очереди. Это позволит сделать ваш сервис быстрым для пользователя.
В статье ниже мы разберем как сделать очередь на базе данных для отправки почты. Это очень просто. Поехали!
Для начала установил новый Laravel 8
composer create-project --prefer-dist laravel/laravel blog
Затем создадим новое письмо
php artisan make:mail SendEmailTest
После выполнения кода выше, Laravel создаст новый файл письма app/Mail/SendEmailTest.php
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SendEmailTest extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Build the message.
*
* @return $this
*/
publicfunction build()
{
return $this->view('emails.test');
}
}
Теперь нам потребуется создать новое представление для этого письма resources/views/emails/test.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Как отправлять письма Laravel 8, используя очереди? - maxyc.ru</title>
</head>
<body>
<center>
<h2 style="padding: 23px;background: #b3deb8a1;border-bottom: 6px green solid;">
<a href="https://maxyc.ru">Посетите наш сайт: maxyc.ru</a>
</h2>
</center>
<p>Hi, Sir</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<strong>Thank you Sir. :)</strong>
</body>
</html>
Теперь нам необходимо настроить отправку почты
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=xyz@gmail.com
MAIL_PASSWORD=123456
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=xyz@gmail.com
MAIL_FROM_NAME="${APP_NAME}"
Следующим шагом мы будет настраивать уже сами очереди. Для начала в файле .env укажем в качестве драйвера очередей – базу даных
QUEUE_CONNECTION=database
Затем нам необходимо сгенерировать миграцию и создать таблицы для очередей
php artisan queue:table
php artisan migrate
Теперь, создаем обработчик задач очереди
php artisan make:job SendEmailJob
Данная команда создаст файл app/Jobs/SendEmailJob.php. Давайте наполним его следующим кодом
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Mail\SendEmailTest;
use Mail;
class SendEmailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $details;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($details)
{
$this->details = $details;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$email = new SendEmailTest();
Mail::to($this->details['email'])->send($email);
}
}
Давайте протестируем работу очередей. В первую очередь создадим маршрут, в котором будет создаваться новая задача для очереди
routes/web.php
Route::get('email-test', function(){
$details['email'] = 'your_email@gmail.com';
dispatch(new App\Jobs\SendEmailJob($details));
dd('done');
});
Ок, маршрут создан. Запустим слушателя очередей используя следующую команду
php artisan queue:listen
Запустим сервер командой
php artisan serve
Переходим по ссылке
http://localhost:8000/email-test
В командной строке вы можете увидеть следующее