【发布时间】:2011-07-11 17:33:30
【问题描述】:
我知道如何使用 PHPmail 发送电子邮件。但是如果我需要发送大量电子邮件怎么办?
这可能是在发布新消息时向网站订阅者发出的“通知”。直接在页面处理程序中执行此操作会严重影响性能并使浏览器加载速度过慢。所以我需要在“后台”完成这项工作。
在我的情况下,我如何在 PHP 中“安排”一些事情 - 发送电子邮件?例如,在 C++ 中,我会创建一个单独的线程,但 AFAIK 在 PHP 中没有多线程之类的东西。
【问题讨论】:
我知道如何使用 PHPmail 发送电子邮件。但是如果我需要发送大量电子邮件怎么办?
这可能是在发布新消息时向网站订阅者发出的“通知”。直接在页面处理程序中执行此操作会严重影响性能并使浏览器加载速度过慢。所以我需要在“后台”完成这项工作。
在我的情况下,我如何在 PHP 中“安排”一些事情 - 发送电子邮件?例如,在 C++ 中,我会创建一个单独的线程,但 AFAIK 在 PHP 中没有多线程之类的东西。
【问题讨论】:
创建发送您保存在数据库中的电子邮件队列的 CRON 作业:
将包含所有信息的电子邮件保存到数据库中。
使用 CRON 作业定期(例如每半小时左右 - 取决于您的托管服务提供商和您发送的电子邮件数量)从队列中抓取电子邮件并将其发送出去。然后在数据库中的电子邮件上设置sent 标志,添加您想要的发送信息(例如时间、错误、标题...)。
确保将电子邮件分成多个块并暂停发送,以避免某些电子邮件服务器的反垃圾邮件和防洪泛保护出现问题。一些邮件程序库为此提供了插件(例如 SwiftMailer)。
【讨论】:
要安排此类事情,最好使用 cronjobs,这是在服务器本身而不是 PHP 中定义的。但是,cronjob 可以调用要执行的 PHP 脚本。
使用 cronjob 执行此操作有一些优势,因为它不会(直接)影响最终用户的性能,而且您可以让它在特定时间运行。
【讨论】:
将所有电子邮件数据存储在 Mysql 数据库中。 表结构可能是这样的。
TO_EMAIL_ID | EMAIL_TYPE |电子邮件主题 | EMAIL_CONTENT |加工 | INSERT_TIME 。
将您的所有电子邮件内容插入此表。 并有一个 php 脚本从该表中获取数据并批量发送电子邮件, 并删除/标记为已处理发送的电子邮件。 假设该文件是 sendMailers.php 然后您可以设置一个 cron 作业以每 5 分钟运行一次此文件。 见http://www.foogazi.com/2006/12/07/understand-cron-jobs-in-5-minutes/
*/5 * * * * PATH_TO_PHP sendMailers.php
【讨论】:
您可以使用 cron 作业定期运行脚本并发送任何未完成的通知。
另一种方法是在后台启动另一个进程,使用类似:exec('php send_notifications.php 1>/dev/null 2>1 &');(注意最后的内容)。
【讨论】:
您可以为此使用Create Cron Jobs,并查看以下Discussion
【讨论】:
我使用后台进程(如果您可以通过 CLI [命令行界面] 访问服务器,则可以从命令行运行 PHP 程序)。该过程会检查 MySql 表中是否有排队等待发送的电子邮件。
在我的方法中,浏览器不用于发送电子邮件,而只是将其写入 MySql 表。
【讨论】:
您需要在 windows 中使用 schedule tasks,或者在类 unix 操作系统(即:linux)中使用 cron 作业。
【讨论】: