-2

当某个事件被触发时,我基于 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 上的队列立即被填满)
  • 每小时的邮件配额提高了 10 倍 -> Sendinblue 上不再有队列,但现在用户收到了多达 7 次相同的电子邮件!
4

1 回答 1

0

显然,排队电子邮件和设置延迟事件已经解决了这个问题。

现在每 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++;

}

谢谢你的支持!

于 2019-09-24T08:56:30.013 回答