在PHP中延迟电子邮件以避免超出服务器限制

时间:2010-03-23 18:04:46

标签: php email cron delay

好的,所以这是我的问题:

我在网站上有一个成员列表,并且我的网站(不是非常网络或技术娴熟)的管理员定期向会员列表发送新闻通讯。 我现在的会员名单已超过800人。

所以,我编写了一个电子邮件脚本,将电子邮件发送到完整的成员列表,其成员列在Bcc标题中。

但是,我发现我的主机服务器每小时限制为300封电子邮件,即使成员列在“密件抄送”字段中,我显然也超过了这封邮件。 (我以前没有意识到Bcc的行为是为列表中的每个名字发送单独的电子邮件......)

经过一番思考后,我得出的结论是,我的唯一解决方案是让我的脚本只发送电子邮件到前300封电子邮件,等待一个小时,然后再发送一封电子邮件到下三百封等待另一个小时,依此类推,直到我将电子邮件发送到整个会员名单。

在互联网上四处看看,我已经看到了人们用PHP推迟发送电子邮件的其他一些解决方案。 Sleep()显然不是一个选项,因为我不能让脚本打开并运行3到4个小时。我见过一些人建议cron工作,但我不确定每次发送电子邮件,使用它们一次,然后删除它们后创建三个新的cron作业是多么可行。 我见过的最终(以及我认为最聪明的)解决方案是在我的数据库中有一个表来临时存储要延迟并稍后发送的电子邮件,然后创建一个每小时检查一次这个sql表的cron作业或者,将行的时间戳与当前时间戳进行比较,然后在一小时过后发送电子邮件。

所以我问你要推荐哪种方法。是否有一个更简单的解决方案,我已经完全看了一下(除了获得不同的托管计划。哈!),还是有比数据库/ cron作业方法更简洁的方法?

tl; dr:我在服务器上一小时内发送了大约800封电子邮件,限制为300 /小时。使用PHP,找到一种解决此问题的方法,使发送电子邮件的人只需单击“发送”。

3 个答案:

答案 0 :(得分:1)

你可以将它发送到一个齿轮人队列,然后让一个齿轮工人进行适当的睡眠呼叫。请参阅http://gearman.org/http://php.net/gearman

答案 1 :(得分:0)

听起来你需要设置一个批处理函数,该函数从要发送的消息池中提取,并在cron期间每次运行时处理X.然后你会有一个表格来跟踪发送的邮件和谁,这样你就可以跟踪谁收到了电子邮件。

答案 2 :(得分:0)

我建议您创建一个队列,并在每次需要发送电子邮件时处理队列中的X个项目。邮件的发件人只是将电子邮件放入队列中,您的处理代码会选择发送该期间内最大项目数的项目。偶尔您会遇到故障并且使用队列将允许简单恢复。您只能在处理队列时从队列中删除它们。

您可以使用简单的数据库表作为队列,但您可能更喜欢使用专家排队解决方案。

另一项建议是调查Strongmail等外部电子邮件服务。这些将帮助您每小时发送更多电子邮件。