立即发送电子邮件或将其放入队列?

时间:2019-05-03 00:43:22

标签: php email queue

说明:

我们将使用MailGunSendgrid在用PHP编写的Web应用程序上发送电子邮件。

此应用将需要发送以下电子邮件(所有html表单均需要输入验证码):

  • 注册后确认用户的电子邮件地址
  • 应用户请求重新发送电子邮件确认代码
  • 重置密码
  • 批准对帐户的重要更改

在大多数情况下,应用程序每秒将有约50个活动用户。每分钟可能有大约15-20封电子邮件...

问题:

  1. (为了提高应用程序的性能和安全性)即时发送电子邮件是否更好,还是应该将它们放入数据库表队列中,然后由cron-job 发送(我真的更喜欢即时发送,但是不确定不利因素)
  2. 每种方法的优缺点是什么?
  3. 如果我们必须将它们放入队列(AFAIK),那么cron作业的最短时间是每1分钟,因此用户应该等一分钟才能收到他们的电子邮件?

1 个答案:

答案 0 :(得分:1)

如果您排在队列中,如果正在使用的服务(例如MailGun或Sendgrid)已关闭,或者Internet连接断开,或者网络硬件处于混乱状态,则可以忽略错误,然后重试。如果您立即发送但出现错误,除非您将失败的项目排队,否则不会发送这些项目。如果您的解决方案是对失败的项目进行排队,那么为什么不将它们全部排队-似乎是最简单的方法(这是我经常使用的方法)。

您每分钟运行一次的cron作业程序或脚本可以发送邮件。等待2秒,发送更多,等待2秒,依此类推,例如说29次。因此,基本上,您每2秒就会收到一次发送。

以上并不是推测,在非基于云的邮件中继服务器关闭等情况下,我已经中断了数小时,但是当恢复连接时,邮件终于被发送了。

排队的风险是,如果您不能正确处理错误或正确地使电子邮件出队,则可能会轰炸您的收件人。我自己还没有做过,但这是我能想到的最重要的缺点。