2010-03-23 59 views
0

好了,这里是我的问题:在PHP延迟电子邮件,以避免超出服务器限制

我有一个网站上的会员名单,以及管理员的周期性一个我的网站(谁是不太网站或科技知识)将发送简讯给会员名单。 我目前的会员名单长度超过800人。

所以,我写的是发送电子邮件到全会员,在密件抄送标题列出的成员的电子邮件的脚本。

然而,我发现,我的主机服务器每小时300个电子邮件,即使成员在密件抄送字段中列出我显然超出极限。 (我以前没有意识到,密件的行为是派遣独立的电子邮件。对名单上的每一个名字......)

经过一番思考,我得出的结论是我唯一的解决办法是让我脚本只会将电子邮件发送给前300封电子邮件,等待一个小时,然后再发送另一封电子邮件给另外300封电子邮件,再等一小时,等等,直到我将电子邮件发送到整个成员列表。

在互联网上环顾四周,我已经看到了一些其他的解决方案,人们纷纷拿出在PHP延缓电子邮件。 Sleep()显然不是一种选择,因为我不能将脚本保持打开并运行3到4个小时。我见过一些人提出cron作业,但我不确定在每次发送电子邮件时创建三个新的cron作业,使用它们一次,然后删除它们,这是多么可行。 我见过的最终(和我认为最聪明的)解决方案是在我的数据库中有一张表来临时存储要延迟并稍后发送的电子邮件,然后创建一个cron作业,每次检查此sql表小时左右,将该行的时间戳与当前时间戳进行比较,然后在一小时后发送电子邮件。

所以我问你所有推荐的方法。有没有更容易的解决方案,我已经完全查看了(除了获得不同的托管计划,哈!),还是有比数据库/ cron工作方法更干净的方法吗?

tl; dr:我有超过800封电子邮件在服务器上发送,一小时内将我限制为300个小时。使用PHP,找到一种方法来解决这个问题,发送电子邮件的人只需点击“发送”即可。

回答

1

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

+0

我对Gearman没有任何经验,但从我的链接中读到的内容看起来非常有趣。 那么,Gearman的工作人员会允许我在后台运行睡眠呼叫过程?或者,我是否也必须将流程转移到另一台服务器? – Polyonymy 2010-03-24 02:19:26

+0

啊,在GearmanClient类中找到我的答案。 doBackground()将完美工作。 谢谢多米尼克! – Polyonymy 2010-03-24 02:28:43

0

听起来像是你需要设置从消息池中拉来发送和处理X每次cron的过程中其运行一个批处理功能。然后,您将拥有一张跟踪已发送邮件和谁的邮件的表格,以便您可以跟踪谁收到了电子邮件。

0

我建议您创建一个队列,并在每次需要发送电子邮件时从队列中处理X个项目。邮件的发件人只是将电子邮件放入队列中,并且处理代码将拾取发送该时段内最大数量项目的项目。偶尔你会失败并且使用队列将允许简单的恢复。处理时只能从队列中删除项目。

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

另一个建议是寻找到外部电子邮件服务,如Strongmail。这些将帮助您每小时发送更多电子邮件。

+0

这就和我一样 - >每小时CRON工作的简单队列。它似乎工作正常,你可以将它们标记为已发送或删除一次发送的条目。 – niggles 2010-03-24 04:35:38