我正在开发一个类似于mailchimp的应用程序,这就是我认为处理所有大量电子邮件发送的最佳做法
有一个Letter模型,其中包含多个列表,以及一个包含多个联系人的列表模型
1-当用户向某些列表发送简报时(每个列表包含多个订阅的联系人),新作业将使用Queue :: push排队,处理此作业的函数只使用for循环(不是foreach)迭代属于这封信的每个列表的许多联系人(这是此解决方案中最糟糕的事情)
2-对于每个联系人,我使用Mail :: queue将邮件发送给该特定联系人
3-我使用beanstalkd和Amazon SES smtp
问题是即使整个过程排队,我也不好意思使用for迭代联系人,如果在发送给x联系人后某个时刻作业失败会发生什么?这是否意味着重新启动它会再次向同一个联系人发送相同的电子邮件?
如果有人能提出最佳实践来处理这种情况,我将不胜感激。
答案 0 :(得分:2)
如果在发送给x个联系人之后某个时刻作业失败会发生什么?
如果您使用Mail::queue()
- 它会将每封电子邮件排队为自己的工作。如果作业失败,则仅重试该单个作业。发送每封邮件后,它将从队列中删除。
有很多方法可以解决这个问题 - 但我认为您的方法似乎没问题。
别忘了failed jobs section of queues。您可以创建一个失败的表,并告诉您的队列尝试重新发送失败的电子邮件的次数
php artisan queue:retry 3
如果作业失败超过3次 - 它将停止尝试并将其放入失败表中,以便您手动管理。或者,如果需要,可以删除失败的作业
php artisan queue:forget 3
答案 1 :(得分:0)
如果您按照Laurence的建议发送大量电子邮件,则可以使用“高速缓存”计数器;如果队列失败,请检查高速缓存计数并从此处开始。 另一种选择是使用Laravel chunk()将10000个联系人分成不同的块,因此每个块将只有有限数量的电子邮件。