如何使用PHPmailer构建电子邮件队列?

时间:2017-08-01 15:06:03

标签: php email queue phpmailer

我在插入表格之后用PHPmailer构建了一个电子邮件脚本,然而,我得到一个糟糕的网关502因为脚本超时了。并发送300多封电子邮件以回应网络请求对我来说听起来不是一个好主意。所以我的问题是我如何建立一个将在后台发送电子邮件的队列?

据我了解,我需要新表,让我们说email_queue_table插入电子邮件地址,内容然后有一个名为status的字段发送或排队创建一个类似{{1}的while循环}

如果你知道一种更有效/更好的方法,我会全神贯注。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

它如何工作的逻辑 - 用一些代码来帮助你一路走来 - 是这样的:

将以下字段添加到email_queue_table表格中:

  • email_address,电子邮件地址(收件人:)
  • content,留言内容。如果它相同的消息要发送给每个用户,那么您最好将其存储在其他地方。如果只是需要更改内容的一些内容(例如用户名),请使用PHP str_replace()执行str_replace('%name%', 'Andy')所在的事项%name%您的模板,并将在每个循环中适当替换。 理想情况下,您不会拥有此列或在此重复相同的数据 - 如果您的邮件是50 Kb并且您有3000个用户,例如,您要存储150 Mb的数据表不一定。
  • sent_status,已发送状态(默认="未发送"或0
  • retry_attempts重试尝试次数(默认= 0

创建一个执行以下操作的PHP脚本:

  • SELECT email_address, content FROM email_queue_table LIMIT 0, 50。每个循环可以让你50个人。重复直到列表的结尾 - 要执行此操作,您需要知道表格中可以使用COUNT()
  • 执行的记录总数
  • 在每个循环中(您发送邮件的每个人):
    • 使用PHPMailer尝试将content发送到email_address
    • 从PHPMailer中读取return状态。如果已成功发送标记sent_status为"已发送" (1)。如果没有,请将其标记为"未发送" (0)。
  • 延迟,例如每批50个之间的sleep(60)。暂停执行脚本1分钟(60秒),可以帮助缓解您的服务器被标记为一次发送大量电子邮件。

当发送完所有消息后,您可以选择返回表格尝试重新发送任何未发送的消息。仍然保留LIMIT逻辑,因为它可能没有发送大量数字,例如

SELECT email_address, content FROM email_queue_table WHERE sent_status = 0 AND retry_attempts < 5 LIMIT 0, 50

增加retry_attempts字段。如果超过5次尝试就停止。

您无法通过浏览器执行上述脚本,因为它会超时。

相反,您可以从命令行手动触发它,例如

php send_email.php

或者将上面的内容设置在Cron上,每晚运行,或者以任何需要的频率运行。

或者您可以从ajax调用触发它并更新浏览器中的进度。请参阅:creating background processes in php for long running process