情况如下:我有一个带有 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 实例,所以我们不需要担心安全性……只需打开它,让邮件流动!
您不应该通过脚本连接到远程 SMTP,而是使用 sendmail(或更好的后缀)传送到本地主机。Sendmail 应该负责传递消息。如果您需要确保所有消息都通过特定的网关机器发出,请使用正确的智能主机配置 sendmail。
您想要这样做的原因是发送邮件比您最初想象的要复杂得多,并且 sendmail(或更好的后缀)旨在处理所有血腥细节,如队列管理。
至于邮件服务器本身发生了什么,您是否检查过该服务器上的负载和其他因素?在您向它发送了这么多消息之后,它可能会超载,并且因此而缓慢。检查诸如“top”、“netstat -n”等内容...
您可能想尝试增加 sendmail 上的日志详细程度。这可能会给你更多的线索。
您可能需要尝试确定延迟是来自 PHP 端还是来自 sendmail 端。
当它变慢时,运行 netstat 并查看哪些端口是打开的。
仔细检查 DNS。确保您的服务器可以快速解析域名。发送大量电子邮件时,我经常在本地运行缓存 DNS 服务器。
我没有以这种方式使用 PHPMailer,但我已经能够通过 php 脚本调用 /usr/sbin/sendmail,如在普通硬件上看到 600 多条消息/分钟。