首页 > 解决方案 > 如何正确延迟laravel中的每100封邮件

问题描述

如果我有 1000 封电子邮件,我运行的工作会遍历这 1000 封电子邮件并发送电子邮件。

我本可以有:

$users = User::all();
$count = 0;
$hours = 0;
foreach($users as $user) {
  if($count % 100 === 0) {
    $hours++;
  }
  Main::to($user->email)->later(now()->addHours($hours), new MyEmail($user));
  $count++;
}

我还没有对此进行测试,但我想每小时发送 100 封电子邮件,这是正确的方法吗?

标签: phplaravel

解决方案


sleep(1);在这里无济于事,您的解决方案还可以,请记住前 100 个将延迟一个小时。Laravel 文档

此外,正如您所说MailTrap,几秒钟内只允许 2 封电子邮件,您可以为每封添加几小时 + 几秒100,这样每封电子邮件100批量将延迟 1 小时 + 秒,从 1 到 100;

或另一种解决方案使用--sleep=3参数queue:work,这将处理 1 封电子邮件睡眠 3 秒等。

这将在(Redis / 数据库)中创建一个队列,取决于您使用的内容,并将在指定的日期时间处理它们。

$users = User::all();
$count = 0;
$hours = 0;

foreach($users as $user) {

  if($count % 100 === 0) {
    $hours++;
  }

  Mail::to($user)->later(now()->addHours($hours), new MyEmail($user));
  $count++;

}

推荐阅读