Php 使用laravel队列和beanstalkd发送大量电子邮件

Php 使用laravel队列和beanstalkd发送大量电子邮件,php,email,laravel,Php,Email,Laravel,我正在开发一个类似于mailchimp的应用程序,下面是我认为处理所有大规模电子邮件发送的最佳实践 有一个字母模型,它有许多列表,还有一个列表模型,它有许多联系人 1-当用户向某些列表发送新闻稿(每个列表包含许多已订阅的联系人)时,将使用Queue::push对新作业进行排队,处理此作业的函数只需使用for循环(而不是foreach)来迭代属于此信函的每个列表中的许多联系人(这是此解决方案中最糟糕的事情) 2-对于每个联系人,我使用Mail::queue将邮件发送给该特定联系人 3-我正在使用b

我正在开发一个类似于mailchimp的应用程序,下面是我认为处理所有大规模电子邮件发送的最佳实践

有一个字母模型,它有许多列表,还有一个列表模型,它有许多联系人

1-当用户向某些列表发送新闻稿(每个列表包含许多已订阅的联系人)时,将使用Queue::push对新作业进行排队,处理此作业的函数只需使用for循环(而不是foreach)来迭代属于此信函的每个列表中的许多联系人(这是此解决方案中最糟糕的事情)

2-对于每个联系人,我使用Mail::queue将邮件发送给该特定联系人

3-我正在使用beanstalkd和Amazon

问题是,我对使用for遍历联系人有一种不好的感觉,即使整个过程都在排队,如果在发送到x个联系人后,作业在某个点失败,会发生什么情况?这是否意味着当它重新启动时,它将再次向相同的联系人发送相同的电子邮件

如果有人能提出处理这种情况的最佳做法,我将不胜感激

如果在发送到x联系人后,作业在某个点失败,又会发生什么情况

如果您使用
Mail::queue()
,它会将每封电子邮件作为自己的作业进行排队。如果作业失败,则仅重试该单个作业。每封邮件发送后,都将从队列中删除

有很多方法可以解决这个问题,但我认为你的方法似乎还可以

别忘了这件事。您可以创建一个失败的表,并告诉队列尝试和重新发送失败电子邮件的次数

php artisan queue:retry 3
如果作业失败超过3次-它将停止尝试并将其放入失败表中,供您手动管理。如果需要,也可以删除失败的作业

php artisan queue:forget 3

如果您按照Laurence的建议发送批量电子邮件,则可以使用缓存计数器,如果队列失败,则检查缓存计数并从那里开始。
另一个选项是使用Laravel chunk()将10000个联系人分成不同的组块,这样每个组块将有有限的电子邮件数量。

多个列表中的联系人如何?@Sherif-这是否回答了您的问题?感谢您提供了关于“忘记”和“重试”的宝贵信息,但最让我担心的是for循环部分,假设有人正在发送10000个联系人,在所有联系人之间循环,并将每个联系人添加到队列中,如果此功能因任何原因失败(不是发送作业而是在所有联系人之间循环的作业),该怎么办?如果您担心,请在for循环中包含一个“缓存计数器”。如果函数失败-当您从“缓存计数器”的开始重新加载时-那么您可以从您停止的地方继续。