Мы пытаемся отправить объемную электронную почту (100 КБ) с помощью фреймворка PHP Laravel. Как правильно отправить массовую электронную почту с помощью очереди Laravel?
//controller
public function runQueue(){
dispatch(new ShootEmailJob());
}
//job
public function handle(){
$emails = EmailList::get(['email']);
foreach($emails as $email){
Mail::to($email)->send();
}
}
//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?
Первый подход сначала извлекает все электронные письма, а затем отправляет их по одному в одном «экземпляре» задания, которое запускается как фоновый процесс, если вы ставите его в очередь.
Второй подход будет работать 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;
}
Других решений пока нет …