我在插入表格之后用PHPmailer构建了一个电子邮件脚本,然而,我得到一个糟糕的网关502因为脚本超时了。并发送300多封电子邮件以回应网络请求对我来说听起来不是一个好主意。所以我的问题是我如何建立一个将在后台发送电子邮件的队列?
据我了解,我需要新表,让我们说email_queue_table
插入电子邮件地址,内容然后有一个名为status
的字段发送或排队创建一个类似{{1}的while循环}
如果你知道一种更有效/更好的方法,我会全神贯注。谢谢你的帮助。
答案 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()
content
发送到email_address
return
状态。如果已成功发送标记sent_status
为"已发送" (1
)。如果没有,请将其标记为"未发送" (0
)。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