我知道对于大量的电子邮件,建议使用Pear,但我想知道在我的情况下是否值得深入研究(我安装了它,但我有很多来自Pear的错误)
我需要向我的订阅者(大约2万)发送电子邮件,但我的主机每小时只允许200封电子邮件。这没关系,因为我不需要每个人都同时收到电子邮件,我可以在一个月内发送所有这些邮件,我不着急。
在这种情况下,可以有一个非常简单的循环,用mail()发送电子邮件,然后睡眠18秒(低于200封电子邮件/小时)。基本上,我想的只是做一些类似的事情
for($i=0;$i<=count($recipient);$i++)
{
mail($recipient[$i].....);
sleep(18);
}
与使用PEAR(需要更多的时间)相比,这可以吗?
您看过使用PEAR的Mail_Queue包吗?http://pear.php.net/package/Mail_Queue?您可以将其设置为在一个过程中发送X多封电子邮件,然后重新运行相同的脚本来发送下一个X多封。
除了简洁的电子邮件,我当然不会使用本地邮件功能来发送任何东西,也许是为了通知你应用程序中的特殊情况。
如果你的服务器是基于linux的,你可能会逃脱惩罚(见这个问题)。
虽然这听起来并不是一个很好的解决方案,但也要考虑到你似乎在对所有收件人(20k)使用for循环。
如果你不想使用PEAR,你可能想尝试每小时设置一个cron作业,以某种方式(使用文本文件或数据库)记住它发送电子邮件的最后一个用户,并发送下一批200个。
在这种情况下,您可能希望每125分钟设置一次cronjon,以确保不会达到限制。此外,在每个mail()
之后使用sleep(1);
将腾出CPU。
查看此问题以了解性能方面的注意事项。
首先,我不会说好的旧mail()
的局限性。。。
- 几乎所有内容的手动编码
- 错误处理不力
- 无身份验证(尽管对您来说不是问题)
与音量有关。
其次,我从未使用过PEARMail,所以我不能谈论它的性能或开销,但您的用例正是来自低容量的电子邮件服务器。你不需要高性能就可以慢慢地做事,是吗?
所以我敢说你使用了错误的标准来评估工具。
我的建议是,将mail()
留给极其简单和不重要的任务(订户通信不符合条件),并使用适当的第三方邮件库,而不一定是PEAR。
特别是,Swift Mailer提供了Throttler插件,该插件专为满足您的要求而设计:
如果您的SMTP服务器有限制以限制速率如果你发送了哪些电子邮件,那么你的代码需要注意这一点速率限制。Throttler插件使Swift Mailer在速率受限的速度。
许多共享主机并没有将其SMTP服务器作为免费服务器打开。通常他们都有相应的政策(可能是为了阻止垃圾邮件发送者)这只允许你每小时/天发送固定数量的电子邮件。
Throttler插件支持两种模式的速率限制和每一个,你都需要计算出你想要的值。插件可以根据每分钟的电子邮件数量进行限制,或者每分钟传输的字节数。