注意:值得注意的是 mail()函数不适合 循环中的大量电子邮件。 此功能可打开和关闭SMTP 每个电子邮件的套接字,不是 效率很高。 来源:PHP手册
什么是更大的卷?一个100或1000? 我可以安全地循环200次没有太多问题吗? (我不能安装梨)
答案 0 :(得分:6)
你可以将它循环200次,我想象的问题很少,虽然它会比自定义邮件程序或正确设置的程序包慢得多。
最终结果取决于许多因素。您需要确保的主要事情是使用set_time_limit()为脚本提供足够的时间来完成工作。将工作卸载到由cron脚本提供服务的某种队列中也可以使您的生活更轻松,因为保持PHP脚本长时间运行会带来其他资源问题。
在当天,我曾经使用PHP的邮件功能和安装了Exim的RedHat服务器向订阅者简报发送大约50,000封电子邮件。使用我运行的自定义脚本需要4-6个小时。没有什么有效的,但它完成了这项工作。
答案 1 :(得分:3)
大约5 - 6年前(我最后一次看到这种事情),我使用mail()
函数在PHP中看到了邮件列表软件,每次发送到邮件列表时都会发送数百封邮件“功能已被调用。随着客户端添加越来越多的名称(成千上万,最后我检查过),系统变得越来越慢。最后,他们购买了一些第三方软件来处理大量邮件,并托管在与其Web服务器分开的服务器上,以避免放慢他们的网站速度。
正如其他人所指出的那样,在你开始一次发送几十个批次之前,你应该先与你的托管服务提供商明确这一点 - 每个托管公司都有自己的政策,如果这违反了服务条款,他们可以断开你/切断你的主机。理想情况下,应该仅为此目的从服务器进行大容量邮件传输。这样,如果它挂起或冻结,您将不必担心影响其他应用程序。
如果你真的要发送非常大量的邮件,那里有商业软件包,它们也将管理邮件列表,他们将管理选择退出和选择加入,电子邮件的版本,他们将做文本与HTML邮件等......如果你是认真的话,可以研究一些。
我知道这不能回答“mail()
功能的替代方案”这一主要问题。但这是我能做的最好的 - 我还没见过!我唯一能想到的是手动管理PHP中的SMTP连接(不确定它是多么可能)或者使用一些外部库来实现它。
答案 2 :(得分:2)
批次越小越好,但这取决于您的设置(服务器速度,网络等)。我可能会使用cron工作并进行小批量生产。您需要假设mail()可能会挂起并停止处理,这使得将列表中的每一行标记为电子邮件发送非常重要。
例如,如果你可以每秒发送一封电子邮件或稍微快一点,那么我会在每分钟运行一次的cron作业中进行一批50次。使用您的SQL查询来获取尚未发送的TOP 50结果,因为您无法确定在哪里开始。
答案 3 :(得分:1)
如果您想发送最多1000个用户的邮件,那么只需将它们传入一个数组,然后将mail()
放入循环中。
唯一要记住的是将set_time_limit(0)
放在第一行并将flush()
放在最后一行,然后您可以发送任意数量的邮件。
答案 4 :(得分:0)
您需要先与您的托管服务商或上游提供商一起查看您的服务条款(TOS)。如果你为他们造成麻烦,并且你违反了服务条款,他们会像热勺一样把你丢弃。
接下来,您可以通过简单地每10条消息添加一次sleep()调用来避免压倒邮件系统并保持在任何“收割机机器人”的雷达之下。使其可调,以便您可以限制迭代次数和睡眠延迟。 Eitehr作为参数,或通过配置文件(后者可以在循环的顶部轮询,以便即时进行调整。