在循环中使用 php mail() 函数发送 +-200 封电子邮件

Posted

技术标签:

【中文标题】在循环中使用 php mail() 函数发送 +-200 封电子邮件【英文标题】:Sending +-200 emails using php mail() function in a loop 【发布时间】:2011-02-08 00:42:05 【问题描述】:

注意:值得注意的是 mail() 函数不适合 循环中的大量电子邮件。 这个函数打开和关闭一个 SMTP 每封电子邮件的套接字,这不是 非常有效。 来源:PHP 手册

什么是更大的体积? 100还是1000?? 我可以安全地让它循环 200 次而没有太多问题吗? (我无法安装pear)

【问题讨论】:

哇,5 个答案,其中 4 个非常好(第 5 个也很有用,只是有争议),没有投票? (除了我给的那个)。哎哟。我会去传播一些爱.. 【参考方案1】:

你可以循环它 200 次,几乎没有我想像的问题,尽管它比自定义邮件程序或正确设置的包来处理它要慢得多。

最终结果取决于许多因素。您要确保的主要事情是您使用set_time_limit() 给脚本足够的时间来完成工作。将工作卸载到由 cron 脚本提供服务的某种队列中也可以让您的生活更轻松,因为长时间运行 php 脚本会带来其他资源问题。

过去,我曾经使用 PHP 的邮件功能和安装了 Exim 的 RedHat 服务器向订阅者时事通讯发送大约 50,000 封电子邮件。我运行的自定义脚本需要 4-6 个小时。它没有任何效率,但它完成了工作。

【讨论】:

【参考方案2】:

大约 5 到 6 年前(我最后一次研究这类事情),我看到 PHP 中的邮件列表软件使用 mail() 函数,每次“发送到邮件列表”功能都会发送数百条消息被调用。随着客户添加越来越多的名称(我最后检查了数千个),系统变得相当缓慢。最后,他们购买了一些第三方软件来处理大量邮件,并将其托管在与 Web 服务器分开的服务器上,以避免降低网站速度。

正如其他人指出的那样,您应该在开始一次发送超过几十个批次之前与您的托管服务提供商明确这一点 - 每个托管公司都有自己的政策,如果这违反了 TOS,他们可以断开您/切断您的托管。理想情况下,大容量的邮件传输应该从服务器完成。这样,如果它挂起或冻结,您就不必担心影响其他应用程序。

如果您确实要发送非常大量的邮件,那么有一些商业软件包也可以管理邮件列表,他们将管理选择退出和选择加入、电子邮件版本,他们将处理文本与文本。 html 邮件等...如果您是认真的,请研究其中的一些。

我知道这不能回答“mail() 函数的替代方案?”的主要问题。但这是我能做的最好的了——我还没见过!我唯一能想到的就是在 PHP 中手动管理 SMTP 连接(不确定这是否可行)或使用一些外部库来完成。

【讨论】:

【参考方案3】:

批次越小越好,但这取决于您的设置(服务器速度、网络等)。我可能会使用 cron 作业并做小批量。您需要假设 mail() 可能会挂起并停止处理,因此将列表中的每一行标记为已发送电子邮件非常重要。

例如,如果您可以每秒发送 1 封电子邮件或稍快一些,那么我会在每分钟运行的 cron 作业中处理 50 封电子邮件。使用您的 SQL 查询来获取尚未发送的 TOP 50 结果,因为您无法确定从哪里开始。

【讨论】:

+1 用于 SQL 查询,以避免每分钟一遍又一遍地重新处理相同的 50!【参考方案4】:

您需要先查看您的托管服务提供商或上游提供商的服务条款 (TOS)。如果你给他们制造麻烦,并且你违反了 TOS,他们会像热汤匙一样丢下你。

接下来,您只需每 10 条左右的消息添加一个 sleep() 调用,就可以避免邮件系统不堪重负,并保持在任何“收割者机器人”的雷达之下。使其可调整,以便您可以限制迭代次数和睡眠延迟。 Eitehr 作为参数,或通过配置文件(后者可以在循环顶部轮询,以进行即时调整。

【讨论】:

【参考方案5】:

如果您想向多达 1000 个用户发送邮件,那么只需将它们传递到一个数组中,然后将 mail() 放入一个循环中。

唯一要记住的就是把set_time_limit(0)放在第一行,把flush()放在最后一行,你可以发送任意数量的邮件。

【讨论】:

以上是关于在循环中使用 php mail() 函数发送 +-200 封电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

我的邮件没有被php函数mail()发送[重复]

PHP 中使用 mail() 函数发送邮件

如何使用php的mail函数

未在php中接收mail()函数发送的邮件[重复]

使用 php mail() 函数发送链接

如何在php用mail发送邮件