【问题标题】:Send mass emails from PHP从 PHP 发送大量电子邮件
【发布时间】:2011-02-04 09:57:17
【问题描述】:

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

我唯一失去的就是能够向我的所有成员群发电子邮件。

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

但是我浏览了所有文档,看不到如何发送“一次 100 个”,我不知道该怎么做。

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

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

提前感谢您的任何建议!

【问题讨论】:

    标签: php email massmail


    【解决方案1】:

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

    一次发送多封电子邮件是一回事,但让它们全部通过服务器过滤器传递和传递是另一回事...

    【讨论】:

    • 我意识到 cron 工作是一个很好的方法。但我不想每天下午 3 点做。我希望能够进入后端,编写电子邮件并单击发送。有没有办法在 php 中创建一次性 cron 作业? (虽然我认为这不适合“cron 工作”这个词)
    • Cron 可以以多种方式使用。例如,您可能有一个简单的模型(数据库中的一个表),称为:emailsToSend(一种简单的缓冲区)。模型数据库中的字段,例如:id、email_id、created_at、send。 emailsToSend 中的每条记录都是一个事件:“发送电子邮件”。您将 cron 设置为每 5 分钟触发一次脚本。脚本:1. 检查是否有任何记录(要发送的电子邮件)。2.最后 10 次或它们(按创建日期),3. 发送它们并将 tham 标记为发送(为此的简单布尔标志) 4. 结束。脚本由 cron 触发,因此您不必从浏览器中执行此操作...跨度>
    【解决方案2】:

    Swiftmailer 这样的类可以选择发送群发电子邮件。

    【讨论】:

    • 就像我说的,我已经在使用 Swift Mailer。但是,据我所知,如果我通过密件抄送添加 80,000 人,它只会遍历这 80,000 人。我真的不想让我的浏览器在它这样做时保持打开状态。它也可能导致服务器超时。所以我需要另一种方法。如果 Swift Mailer 能够做到这一点,我无法在文档中找到它。
    • 在正常情况下,您在服务器上使用 cron 作业来启动您的脚本。
    【解决方案3】:

    这是我的想法...假设您托管在 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 小时内发送。 更改睡眠时间以增加或减少时间。

    【讨论】:

    • 您也可以将其修改为发送 X 封电子邮件,然后等待 X 时间再进行下一批。
    【解决方案4】:

    您需要一个守护进程来代替 Cron,而 Swiftmailer 不能轻易做到这一点。 问题是这样的:你可以让一个 Cronjob 触发器 Swiftmailer 每 5 分钟说一次,但是如果它还没有完成发送 10000 封邮件会发生什么?它可能会启动另一个进程,因此您最终可能会遇到许多进程试图在队列中发送相同的文件。

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

    Swiftmailer 可以根据需要处理多个队列(您需要为每个队列启动第二个守护进程)。

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

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 2012-06-23
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2011-08-19
      • 2011-03-04
      • 1970-01-01
      相关资源
      最近更新 更多