Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中延迟电子邮件以避免超过服务器限制_Php_Email_Cron_Delay - Fatal编程技术网

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

在PHP中延迟电子邮件以避免超过服务器限制,php,email,cron,delay,Php,Email,Cron,Delay,好吧,我的问题是: 我在一个网站上有一个成员列表,我的网站的一个管理员(不太懂网络或技术)会定期向成员列表发送一份时事通讯。 我目前的会员名单有800多人 因此,我编写了一个电子邮件脚本,将电子邮件发送到完整的成员列表,成员列在密件抄送标题中 然而,我发现我的主机服务器每小时有300封电子邮件的限制,即使成员列在密件抄送字段中,我也显然超过了这一限制。(我以前不知道密件抄送的行为是为名单上的每个名字发送单独的电子邮件…) 经过一番思考,我得出结论,我唯一的解决办法是让我的脚本只向前300封电子邮

好吧,我的问题是:

我在一个网站上有一个成员列表,我的网站的一个管理员(不太懂网络或技术)会定期向成员列表发送一份时事通讯。 我目前的会员名单有800多人

因此,我编写了一个电子邮件脚本,将电子邮件发送到完整的成员列表,成员列在密件抄送标题中

然而,我发现我的主机服务器每小时有300封电子邮件的限制,即使成员列在密件抄送字段中,我也显然超过了这一限制。(我以前不知道密件抄送的行为是为名单上的每个名字发送单独的电子邮件…)

经过一番思考,我得出结论,我唯一的解决办法是让我的脚本只向前300封电子邮件发送电子邮件,等待一个小时,然后向下300封电子邮件发送第二封电子邮件,再等待一个小时,依此类推,直到我将电子邮件发送到整个成员列表

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

所以我想问大家,你们会推荐哪种方法。有没有一个更简单的解决方案,我已经完全看过了(除了得到一个不同的托管计划.ha!),或者有没有比数据库/cron作业方法更干净的方法呢


tl;dr:我在一个服务器上一小时要发送800封以上的电子邮件,这个服务器限制我每小时发送300封。使用PHP,找到一种解决此问题的方法,让发送电子邮件的人只需单击“发送”。

听起来您需要设置一个批处理函数,从要发送的消息池中提取消息,并在cron期间每次运行X时处理它。然后,您将有一个表,用于跟踪发送的消息和发送给谁的消息,以便跟踪谁收到了电子邮件。

您可以将此消息发送到gearman队列,然后让gearman worker进行相应的睡眠呼叫。请参见和

我建议您创建一个队列,并在每次需要发送电子邮件时从队列中处理X个项目。消息的发送者只是将电子邮件放入队列中,您的处理代码将拾取在此期间发送最大数量邮件的邮件。有时会出现故障,使用队列可以进行简单的恢复。只有在处理项目时才从队列中删除项目

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


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

我对Gearman没有任何经验,但从我从您的链接中读到的内容来看,这似乎非常有趣。那么,Gearman worker会允许我在后台使用睡眠调用运行进程吗?或者我还必须将进程分包到另一台服务器吗?啊,在GearmanClient类中找到了我的答案。doBackground()将非常有效。谢谢多米尼克!这和我做的一样->简单队列,每小时执行一次CRON作业。它似乎工作正常,您可以将它们标记为已发送,也可以在发送后删除条目。