Laravel отправляет каждое письмо несколько раз - PullRequest
0 голосов
/ 23 сентября 2019

Когда происходит определенное событие, мое приложение на основе Laravel должно отправить ровно одно транзакционное электронное письмо каждому пользователю в списке рассылки.

Вот код цикла:

$users = User::where('notifiable', 1)->get();

foreach($users as $user) {

    $info = [
        'email' => $user->email,
        'name'  => $user->name
    ];

    $data = [
        'message'   => 'Sample text'
    ];

    Mail::send(['emails.html.notification', 'emails.text.notification',], $data, function($message) use ($info) {
        $message
            ->to($info['email'], $info['name'])
            ->subject('example')
            ->from('admin@example.com','Example');
    });

}

К сожалению, несколько пользователей получают одну и ту же почту несколько раз.Я не могу понять, что происходит:

  • При перенаправлении писем в журнал я вижу точно одно письмо для каждого пользователя, как и ожидалось;
  • Любые другие события вызывают отправку писемодному пользователю.Тем не менее, никто не получил несколько сообщений от этих событий.

Приложение использует Sendinblue в качестве внешней службы SMTP.Некоторые подсказки, которые я получил:

  • Почасовая почтовая квота была очень низкой -> письмо было получено 3 раза (и очередь на Sendinblue была немедленно заполнена)
  • Почасовая почтовая квота былаподнял 10x -> больше нет очередей на Sendinblue, но теперь пользователи получают одно и то же письмо до 7 раз!

1 Ответ

0 голосов
/ 24 сентября 2019

Очевидно, что постановка электронной почты в очередь и установка отложенного события решили проблему.

Теперь новая работа запрашивается каждые 10 секунд.

$users = User::where('notifiable', 1)->get();

$counter = 0;

foreach($users as $user) {

    $payload = [
        'email' => $user->email,
        'name'  => $user->name,
        'message'   => 'Sample text'
    ];

    dispatch(new SendNotification($payload))
    ->delay(now()->addSeconds($counter * 10));

    $counter++;

}

Спасибо за вашу поддержку!

...