情况如下:我有一台装有 PHP 5.2 和标准 sendmail 的 Redhat Linux 服务器,我们用它来向 10,000 个电子邮件地址列表发送电子邮件。我们有一个相当简单的脚本,它使用 PHPMailer 并通过 SMTP 连接到监听 sendmail 守护程序。
每当运行此脚本时,它最终都会达到开始运行非常慢的程度 - 它会开始很快,但随后速度会减慢到每隔几分钟仅发送 1 封电子邮件。当我重新启动脚本时,它会再次运行得很快。
在 sendmail 服务器上,我在脚本中添加了一些设置来尝试修复限制问题:
define(`confMAX_QUEUE_RUN_SIZE',`0')dnl
define(`confBAD_RCPT_THROTTLE', `0')dnl
define(`confCONNECTION_RATE_THROTTLE', `0')dnl
到目前为止,我还不确定解决问题的最佳方法 - 甚至不知道如何排除故障。 /var/log/maillog 文件中实际上没有任何有用的信息。
我们已经在防火墙后面有了此 sendmail 实例,因此我们不必担心安全性...只需打开它并让邮件流通即可!
答案1
您不应该通过脚本连接到远程 SMTP,而应该使用 sendmail(或更好的是 postfix)传递到本地主机。Sendmail 应该负责传递消息。如果您需要确保所有消息都通过特定的网关机器发出,请使用正确的智能主机配置 sendmail。
您想要这样做的原因是发送邮件比您最初想象的要复杂得多,并且 sendmail(或者更好的是 postfix)被构建来处理所有复杂的细节,例如队列管理。
至于邮件服务器本身发生了什么,您是否检查过该服务器的负载和其他因素?在您向其发送了如此多的邮件后,它可能会超载,并且因此而变得缓慢。检查诸如“top”、“netstat -n”等内容...
答案2
您可能想尝试增加 sendmail 上的日志详细程度。这可能会给您提供更多线索。
您可能需要尝试确定延迟是来自 PHP 端还是来自 sendmail 端。
当它变慢时,运行 netstat 并查看哪些端口是打开的。
仔细检查 DNS。确保您的服务器可以快速解析域名。发送大量电子邮件时,我通常会在本地运行缓存 DNS 服务器。
我没有以这种方式使用过 PHPMailer,但我能够通过 php 脚本调用 /usr/sbin/sendmail,在普通硬件上每分钟查看 600 多条消息。