Отправка электронной почты с использованием очереди laravel

Мы пытаемся отправить объемную электронную почту (100 КБ) с помощью фреймворка PHP Laravel. Как правильно отправить массовую электронную почту с помощью очереди Laravel?

Случай 1.

//controller
public function runQueue(){
dispatch(new ShootEmailJob());
}

//job
public function handle(){
$emails = EmailList::get(['email']);

foreach($emails as $email){
Mail::to($email)->send();
}
}

Случай 2

//controller
public function runQueue(){

$emailList = EmailList::get(['email']);

foreach($emailList as $emailAddress){
dispatch(new ShootEmailJob($emailAddress->email));
}
}

//job
public function handle(){
Mail::to($emailAddress)->send(new ShootMail($emailAddress));
}

Какой из них является правильным подходом к случаю 1 или случаю 2?

1

Решение

Первый подход сначала извлекает все электронные письма, а затем отправляет их по одному в одном «экземпляре» задания, которое запускается как фоновый процесс, если вы ставите его в очередь.

Второй подход будет работать n «экземпляры» заданий, по одному на каждое письмо в фоновом процессе.

Так что по производительности вариант 1 это лучший подход. Вы также можете обернуть его в try - catch блокировать в случае исключений, чтобы задание не завершалось сбоем в случае сбоя одного из электронных писем, например:

try {

$emails = EmailList::get(['email']);

foreach($emails as $email){
Mail::to($email)->send();
}

} catch (\Exception $e) {
// Log error
// Flag email for retry
continue;
}
1

Другие решения

Других решений пока нет …