用PHP发送大量电子邮件

5
我网站上有80,000个用户,最近我放弃了之前使用的论坛脚本,并自己构建了一个非常简单但同样有效的解决方案(论坛脚本对于我的简单网站来说太过臃肿且资源密集)。唯一失去的功能是群发邮件给所有会员。
所以我正在寻找一种自己编写的脚本来实现这个功能。在搜索了一圈后(包括在这里提问),我决定使用Swift Mailer是个好主意。
然而,我已经阅读了所有文档,但看不到如何批量发送邮件并且不确定该如何操作。
简单地说,我有一个管理员面板,其中有两个输入表单:“主题”和“消息”。当我点击提交时,最安全的方式是什么可以让我发送80,000封电子邮件而不会使服务器崩溃或被标记为垃圾邮件?
我使用的是相当强大的专用服务器,因此不会遇到共享服务器所面临的问题。
感谢您提供的任何建议!
4个回答

1

安全选项是一个接一个地发送电子邮件。我通常每10分钟发送不超过10封电子邮件。由cron触发的简单脚本就可以满足你的需求。

一次发送很多电子邮件是一回事,但让它们都被送达并通过服务器过滤器是另一回事...


我意识到使用cron job是一个不错的方法。但我不想每天都在下午3点执行它。我希望能够进入后台,编写电子邮件并单击发送。有没有办法在php中创建一次性的cron job?(尽管我认为这不符合“cron job”这个术语的定义) - Rob
1
Cron可以有很多用途。例如,您可能有一个简单的模型(数据库中的一个表)称为:emailsToSend(一种简单的缓冲区)。像id、email_id、created_at和sent这样的模型的数据库字段。emailsToSend中的每个记录都是一个事件:“发送电子邮件”。您设置cron每5分钟触发一次脚本。脚本:
  1. 检查是否有任何记录(要发送的电子邮件)。
  2. 取最后10个(按创建日期),
  3. 发送它们并将其标记为已发送(用于此的简单布尔标志)
  4. 结束。
脚本由cron触发,因此您无需从浏览器中执行它...
- smentek

0
一个像Swiftmailer这样的类具有进行群发电子邮件的选项。

就像我说的,我已经在使用Swift Mailer。然而,据我所知,如果我通过bcc添加80,000个人,它只会循环遍历这80,000个人。我不想在它执行此操作时让浏览器保持打开状态。这也可能导致服务器超时。因此,我需要另一种方法来实现这一点。如果Swift Mailer能够做到这一点,我还没有在文档中找到它。 - Rob
在正常情况下,您可以在服务器上使用cron作业来启动您的脚本。 - Klaaz

0

这是我的想法...假设你的网站托管在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");
?>

即使服务器超时,系统调用仍应完成其工作。使用此方法发送80,000封电子邮件应该需要约6小时的时间。 更改usleep中的时间以增加或减少时间。

你也可以修改它,发送X封电子邮件,然后等待X时间再执行下一批。 - SethCoder

0

针对这个问题,你需要一个守护进程而不是 Cron,但 Swiftmailer 目前无法轻松实现。问题在于:你可以让 Cronjob 每 5 分钟触发 Swiftmailer,但如果它还没有完成发送 10000 封邮件呢?它可能会启动另一个进程,因此你可能会得到许多尝试发送队列中相同文件的进程。

我使用了一个解决方法,并创建了一个简单的 PHP 守护进程(bash 脚本也可以),它不断检查队列中是否有电子邮件;如果有,则启动 Swiftmailer 并发送 1 封电子邮件(将 swiftmailer 限制设置为 1)。然后守护进程脚本等待 0.5 秒,并再次检查。

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

不幸的是,Swiftmailer 没有“send/”文件夹,一旦发送就无法找回。因此,如果出现错误,你不能简单地将文件从“send/”移回队列以重新发送。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接