从PHP发送大量电子邮件

从PHP发送大量电子邮件,php,email,massmail,Php,Email,Massmail,我的网站上有80000名用户,最近我放弃了我一直使用的论坛脚本,自己构建了一个非常简单的东西,效果也很好(对于我的简单网站来说,论坛脚本过于臃肿且资源密集) 我唯一失去的是向所有成员发送大量电子邮件的能力 所以我希望能想出一个脚本自己来做。环顾四周(包括这里的问题)后,我决定使用Swift Mailer将是一个好主意 然而,我已经阅读了所有的文档,不知道如何发送,比如说“一次发送100个”,我也不知道该怎么做 简单地说。我有一个管理面板和一个表单,其中有两个输入“主题”和“消息”。当我点击提交时

我的网站上有80000名用户,最近我放弃了我一直使用的论坛脚本,自己构建了一个非常简单的东西,效果也很好(对于我的简单网站来说,论坛脚本过于臃肿且资源密集)

我唯一失去的是向所有成员发送大量电子邮件的能力

所以我希望能想出一个脚本自己来做。环顾四周(包括这里的问题)后,我决定使用Swift Mailer将是一个好主意

然而,我已经阅读了所有的文档,不知道如何发送,比如说“一次发送100个”,我也不知道该怎么做

简单地说。我有一个管理面板和一个表单,其中有两个输入“主题”和“消息”。当我点击提交时,对我来说发送80000封电子邮件最安全的方式是什么,而不会使我的服务器崩溃或被标记为垃圾邮件

我在一个相当强大的专用服务器上,所以没有与共享服务器相关的问题


提前感谢您的建议

安全的选择是一个接一个地发送电子邮件。我通常每10分钟发送不超过10封电子邮件。您只需要cron启动的简单脚本


一次发送多封电子邮件是一回事,但让所有邮件都通过服务器过滤是另一回事…

像这样的一个班级可以选择发送大量电子邮件。

以下是我的想法。。。假设您托管在linux类型的机器上。当然,在不知道代码的情况下,这是最低限度的。 在服务器上创建一个名为sendmails.php的文件

<? 
loop through email addresses however you do it
{
 usleep(250000); // sleep for quarter of a second 
 mail('user@example.com', 'My Subject', 'message');
}
?>

保存它,然后在另一个文件startemails.php中,您可以在浏览器中打开它

<?
system("&php sendmails.php");
?>

即使服务器超时,系统调用仍应完成其工作。使用此方法,80000封电子邮件应在6小时内发送。
更改usleep中的时间,使其占用更多或更少的时间。

您需要一个守护进程来完成此操作,而Swiftmailer无法轻松完成此操作。 问题是:你可以有一个Cronjob触发器Swiftmailer,比如说每5分钟一次,但是如果它还没有发送完10000封邮件,会发生什么呢?它可能会启动另一个进程,因此您可能会遇到许多进程试图在队列中发送相同的文件

我使用了一个变通方法,创建了一个简单的PHP守护进程(一个bash脚本也可以很好地工作),它可以连续检查队列中是否有电子邮件;如果是这样,它会启动Swiftmailer并发送1封电子邮件。(将swiftmailer限制设置为1)。然后,守护程序脚本等待0.5秒,然后再次检查

如果需要,Swiftmailer可以处理多个队列(您需要为每个队列启动第二个deamon进程)


不幸的是,Swiftmailer没有“send/”文件夹,所以一旦它们被发送,它们就消失了。因此,如果出现错误,您不能简单地将文件从“send/”移回队列以重新发送

我意识到cron工作是一个很好的方法。但我不想每天下午三点就这么做。我希望能够进入后端,写电子邮件,然后单击发送。有没有办法在php中创建一次性cron作业?(尽管我认为这不符合“cron作业”这个术语)cron可以在很多方面使用。例如,您可能有一个简单的模型(数据库中的一个表):emailsToSend(一种简单的缓冲区)。模型数据库中的字段,如:id、email\u id、created\u at、sent。emailsToSend中的每一条记录都是一个事件:“发送电子邮件”。您将cron设置为每5分钟启动一次脚本。脚本:1.检查是否有任何记录(要发送的电子邮件)。2.获取最后10条记录(按创建日期),3.发送并将tham标记为send(此项的简单布尔标志)4.结束。脚本是由cron启动的,所以您不必从browswer执行此操作…就像我说的,我已经在使用Swift Mailer。但是,从我所能看出的情况来看,如果我通过bcc添加80000人,它只会在80000人之间循环。我真的不想让浏览器在这样做时保持打开状态。这也可能会导致服务器超时。因此,我需要另一种方法。如果Swift Mailer能够做到这一点,我无法在文档中找到它。在正常情况下,您在服务器上使用cron作业启动脚本。您还可以修改它以发送X数量的电子邮件,然后在执行下一批之前等待X时间。