Php 如何处理带有队列超时的群发邮件发送

Php 如何处理带有队列超时的群发邮件发送,php,laravel,queue,Php,Laravel,Queue,我有一张表,上面有10万封以上的电子邮件,我想每天发送一些电子邮件: 我在app\Console\Kernel.php中添加了时间表: $schedule->job(new SendDailyEmails)->dailyAt('09:00'); 我的内部工作是: $users = User::all(); foreach($users as $user){ Maill:to($user->email)->send(new DailyMail($user));

我有一张表,上面有10万封以上的电子邮件,我想每天发送一些电子邮件:

我在app\Console\Kernel.php中添加了时间表:

$schedule->job(new SendDailyEmails)->dailyAt('09:00');
我的内部工作是:

$users = User::all();
foreach($users as $user){
    Maill:to($user->email)->send(new DailyMail($user));
    $status = 'sent';
    if( in_array($user->email, Mail::failures()) ){
        $status = 'failed';
        Log::error($user->email . ' was not sent.');
    }else{
        Log::info($user->email . ' was sent.');
    }
    SentMail::create([
        'email' => $user->email,
        'status' => $status
    ]);

}
这可以正常工作,但一段时间后可能会因为作业超时而停止。在failed_jobs表中,我得到一条消息,表明作业尝试次数太多或运行时间太长。由于我在管理器中将队列尝试最大值设置为3,所以它应该并且只运行3次。通过测试,它不再尝试再次尝试,因为我收到了一封邮件,而不是三封

所以说到超时,我不确定默认值是多少,但这是否重要,因为我不知道发送所有电子邮件需要多少时间

我是否应该将邮件分成50个组,并为每个组调用单独的作业实例

有人对此有一个很好的工作答案吗?

如果你看一下,你会发现每封邮件都可以排队

所以,你应该把你的工作从

Mail:to($user->email)->send(newdailymail($user));

Mail:to($user->email)->队列(newdailymail($user));
通过这种方式,您可以将作业生成的每一封邮件推送到队列中。我建议您创建一个特定的队列,并使用类似的系统进行更好的监控


另外,请记住分块并延迟发送,因为您的应用程序可能会运行超时错误,但是,如果提供程序(如)发现异常活动,可能会阻止您的发送。

与其尝试在一个类中一次性发送100k+封电子邮件,不如将100k+个作业实例发送给队列工作人员

$users=User::all();
foreach($users作为$user){
$schedule->job(新发送的每日电子邮件($user))->dailyAt('09:00');
}
现在,Laravel将在队列中堆叠一个超过100k的作业s,并尝试一次为每个用户发送一封电子邮件

类SendDailyEmails实现ShouldQueue
{
公共用户;
公共函数构造(用户$User)
{
$this->user=$user;
}
Maill:to($this->user->email)->send(newdailymail($user));
$status='sent';
if(在数组中($this->user->email,Mail::failures()){
$status='失败';
日志::错误($this->user->email.“未发送”);
}否则{
日志::信息($this->user->email.“已发送”);
}
SentMail::创建([
'email'=>this->user->email,
“状态”=>$status
]);

你的工作是否实现了
应该排队
?是的……你能解释一下你的答案和球童的答案之间的区别吗?如果你调用
send()
对于实现了
ShouldQueue
的邮件,无论您如何发送,它都应该已经将其推入队列。然后您必须调用
php artisan queue:work…
来开始发送它们。@学习者最终的结果是相同的,但他正在调度作业,当队列执行作业时,它将在如果邮件抛出一个错误,那么作业就会失败。在我的回答中,邮件也会排队,这样Laravel就会分派另一个作业。如果邮件抛出一个错误,第一个作业就不会失败。如果你必须为一个用户发送多个邮件,这是很有用的。如果其中一个失败,其余的代码都会被执行。Flame comment呢?W嗯,我在看答案,他是对的。但我的答案只是一个例子……我只是想给你一个不同的视角。你能给我解释一下你和伊加拉的答案之间的区别吗?基本上是一样的,我们在同一时间发布了它们,他的答案更简单