Вот ситуация: у меня есть сервер Redhat Linux с PHP 5.2 и стандартным sendmail, который мы используем для отправки электронной почты на список из 10 000 адресов электронной почты. У нас есть довольно простой скрипт, который использует PHPMailer и подключается через SMTP к слушающему демону sendmail.
Всякий раз, когда этот скрипт запускается, он в конечном итоге доходит до того, что он просто начинает медленно работать с грязью - он запускается быстро, но затем замедляется до отправки только одного электронного письма каждые несколько минут. Когда я перезапускаю скрипт, он снова немного работает быстро.
На сервере 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 (или, лучше, postfix). Sendmail должен позаботиться о доставке сообщений. Если вам нужно убедиться, что все сообщения проходят через определенный шлюз, настройте sendmail с правильным smarthost.
Причина, по которой вы хотите это сделать, заключается в том, что отправка почты намного сложнее, чем вы могли изначально подумать, и sendmail (или лучше, postfix) построен для обработки всех кровавых деталей, таких как управление очередью.
Что касается того, что происходит на самом почтовом сервере, проверяли ли вы нагрузку и другие факторы на этом сервере? Он может быть перегружен после того, как вы отправили ему так много сообщений, и из-за этого работает медленно. Проверьте такие вещи, как 'top', 'netstat -n' и т. Д.
Вы можете попробовать увеличить детализацию логов в sendmail. Это может дать вам еще несколько подсказок.
Возможно, вам придется попытаться определить, исходит ли задержка со стороны PHP или со стороны sendmail.
Когда он станет медленным, запустите netstat и посмотрите, какие порты открыты.
Дважды проверьте DNS. Убедитесь, что ваш сервер может быстро разрешать доменные имена. Часто я запускаю кеширующий DNS-сервер локально при отправке больших объемов электронной почты.
Я не использовал PHPMailer таким образом, но мне удалось просто вызвать / usr / sbin / sendmail через php-скрипт, чтобы увидеть 600+ сообщений в минуту на скромном оборудовании.