5

我正在创建一个系统,将定期发送数千封电子邮件的列表,我知道mail()PHP 中的函数非常繁重,特别是如果同时调用太多次。

我的系统的大致工作方式是,我在 MySQL 中创建电子邮件队列并使用 25 个批次发送它们mail(),从表中删除发送的前 25 个。我在每组 25 个之间等待 2 秒。

这对服务器来说是不是太费力了,还是我可以把它推得更远一点?让我们说每秒50?或者有一种更好的方法可以在不牺牲服务器性能的情况下在更短的时间内发送大量电子邮件。

我有一个没有任何mail()通话限制的专用服务器。

4

3 回答 3

5

除了性能之外,还有其他因素需要考虑,但简短的回答是:有更好的选择。Amazon SES 和 MailChimp 是我所知道的两个收到了积极反馈的公司。

查看 j08691 关于性能的答案,但mail()用于此目的的其他问题包括:

  1. 可扩展性(你会遇到任何 SMTP 服务器最终都无法处理的问题,而且你已经在考虑它了)

  2. 完整性 - 在滚动您自己的群发邮件时,您更有可能被标记为垃圾邮件,尤其是mail在使用本地 sendmail 时。

  3. 成本/收益和投资回报率 - 可靠的群发邮件以具有竞争力的价格正确处理。在某些时候,当您的邮件服务器崩溃、退出黑名单、手动编写电子邮件布局、一般维护等等时,您每小时支付的费用比您为群发邮件服务支付的费用要少。

总体而言,最大的问题是您必须自己完成所有工作,并且您可能会被标记为垃圾邮件,因为您无需支付每秒能够发送数百封电子邮件而不是一分钟发送一百封电子邮件的服务。当 PHP 不忙于为您的 Web 应用程序处理其他所有事情时。

个人轶事(不是对 SES 的认可,只是群发邮件):我们有一个客户,每个活动发送 10 万多封电子邮件,每天最少 1-3 个活动。他们开始抱怨客户迟到了 2 天才收到有关“每日交易”的电子邮件。这不是因为 Mailer 库很慢(甚至这个应用程序也避免使用 plain mail),而是因为它无法确保在电子邮件无关紧要之前发送每个活动的所有电子邮件。我们将他们切换到 SES(我们最终进行了一些优化,但不多),他们可以在一小时内清除一个广告系列。

于 2012-03-07T02:58:18.887 回答
4

PHP 手册

笔记:

值得注意的是,mail() 函数不适合循环处理大量电子邮件。此函数为每封电子邮件打开和关闭一个 SMTP 套接字,效率不高。

对于发送大量电子邮件,请参阅 » PEAR::Mail和 » PEAR::Mail_Queue包。

于 2012-03-07T02:58:10.220 回答
4

尝试使用 PHPMailer。我用它每天发送大约 100 封邮件没有任何问题

于 2012-03-07T03:03:19.263 回答