在插入表后,我已经使用 PHPmailer 构建了一个电子邮件脚本,但是,由于脚本超时,我收到了错误的网关 502。发送 300 多封电子邮件来响应网络请求对我来说听起来不是一个好主意。所以我的问题是如何构建一个在后台发送电子邮件的队列?
据我了解,我需要新桌子email_queue_table
插入电子邮件地址、内容,然后有一个名为status
发送或排队创建一个 while 循环,例如if($status == "queued"){ //then send the email here} else{ // nothing to be sent.}
如果您知道更有效/更好的方法来做到这一点,我会洗耳恭听。谢谢你的帮助。
它如何工作的逻辑——用一些代码来帮助你——是这样的:
将以下字段添加到您的email_queue_table
table:
-
email_address
, 电子邮件地址(至:)
-
content
,留言内容。如果它是the same要发送给每个用户的消息,您最好将其存储在其他地方。如果只是需要更改内容中的一些内容(例如用户名),则使用 PHPstr_replace()
做类似的事情str_replace('%name%', 'Andy')
where %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()
- On each loop (each person you're sending mail to):
- 使用 PHPMailer 尝试发送
content
to email_address
- 阅读
return
来自 PHPMailer 的状态。如果发送成功flagsent_status
作为“已发送”(1
)。如果没有,则将其标记为“未发送”(0
).
- 延迟,例如
sleep(60)
每批 50 份之间。这会将脚本的执行暂停 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 调用触发它并更新浏览器中的进度。看:在php中为长时间运行的进程创建后台进程 https://stackoverflow.com/questions/21605585/creating-background-processes-in-php-for-long-running-process
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)