Есть проект, который связан с коммерческой рассылкой. То есть люди платят, за то, чтобы получать эту рассылку.Рассылка генерируется php и с помощью библиотеки phpmailer через smtp подлючение передается posftix, который должен ее отправлять. Далее снова генерирует рассылку и снова в постфикс и так далее.
Все работало хорошо, но с недавнего времени пхп скрипт стал возращать SMTP -> ERROR: MAIL not accepted from server: 421 4.4.2 XXX.XXX Error: timeout exceeded.
ОШИБКА ВЫДАЕТСЯ НЕ СРАЗУ, А КОГДА НЕСКОЛЬКО ТЫСЯЧ ПИСЕМ БЛАГОПОЛУЧНО ОТРАВЛЕНО. Рассылка стартует в 00 часов. А ошибка появляется примерно через 2 с половиной минуты.
Полез в логи постфикса.
.........
Отправка последнего благополучного собщения
........
Jul 23 00:02:33 XXX postfix/smtpd[9915]: watchdog_pat: 0x7f317859e960
Jul 23 00:02:33 XXX postfix/smtpd[9915]: < localhost[127.0.0.1]: DATA
Jul 23 00:02:33 XXX postfix/smtpd[9915]: > localhost[127.0.0.1]: 354 End data with <CR><LF>.<CR><LF>Потом идут другие процессы… НЕ 9915
Jul 23 00:02:34 XXX postfix/smtpd[9915]: public/cleanup socket: wanted attribute: status
Jul 23 00:02:34 XXX postfix/smtpd[9915]: input attribute name: status
Jul 23 00:02:34 XXX postfix/smtpd[9915]: input attribute value: 0
Jul 23 00:02:34 XXX postfix/smtpd[9915]: public/cleanup socket: wanted attribute: reason
Jul 23 00:02:34 XXX postfix/smtpd[9915]: input attribute name: reason
Jul 23 00:02:34 XXX postfix/smtpd[9915]: input attribute value: (end)
Jul 23 00:02:34 XXX postfix/smtpd[9915]: public/cleanup socket: wanted attribute: (list terminator)
Jul 23 00:02:34 XXX postfix/qmgr[7777]: EAEEBA028C: from=<system@XXX.XXX>, size=9759, nrcpt=1 (queue active)
Jul 23 00:02:34 XXX postfix/smtpd[9915]: input attribute name: (end)
Jul 23 00:02:34 XXX postfix/smtpd[9915]: > localhost[127.0.0.1]: 250 2.0.0 Ok: queued as EAEEBA028C
Jul 23 00:02:34 XXX postfix/smtpd[9915]: watchdog_pat: 0x7f317859e960Потом идут другие процессы… НЕ 9915
Jul 23 00:07:34 XXX postfix/smtpd[9915]: > localhost[127.0.0.1]: 421 4.4.2 XXX.XXX Error: timeout exceeded
Jul 23 00:07:34 XXX postfix/smtpd[9915]: match_hostname: localhost ~? 127.0.0.0/8
Jul 23 00:07:34 XXX postfix/smtpd[9915]: match_hostaddr: 127.0.0.1 ~? 127.0.0.0/8
Jul 23 00:07:34 XXX postfix/smtpd[9915]: timeout after END-OF-MESSAGE from localhost[127.0.0.1]
Jul 23 00:07:34 XXX postfix/smtpd[9915]: disconnect from localhost[127.0.0.1]Таким образом, мы видим, что разница ровно 5 минут (300 сек)
$postconf | grep -i timeout
connection_cache_protocol_timeout = 5s
daemon_timeout = 18000s
ipc_timeout = 3600s
lmtp_connect_timeout = 0s
lmtp_data_done_timeout = 600s
lmtp_data_init_timeout = 120s
lmtp_data_xfer_timeout = 180s
lmtp_lhlo_timeout = 300s
lmtp_mail_timeout = 300s
lmtp_quit_timeout = 300s
lmtp_rcpt_timeout = 300s
lmtp_rset_timeout = 20s
lmtp_starttls_timeout = 300s
lmtp_tls_session_cache_timeout = 3600s
lmtp_xforward_timeout = 300s
milter_command_timeout = 30s
milter_connect_timeout = 30s
milter_content_timeout = 300s
qmqpd_timeout = 300s
smtp_connect_timeout = 30s
smtp_data_done_timeout = 600s
smtp_data_init_timeout = 120s
smtp_data_xfer_timeout = 180s
smtp_helo_timeout = 300s
smtp_mail_timeout = 300s
smtp_quit_timeout = 300s
smtp_rcpt_timeout = 300s
smtp_rset_timeout = 20s
smtp_starttls_timeout = 300s
smtp_tls_session_cache_timeout = 3600s
smtp_xforward_timeout = 300s
smtpd_policy_service_timeout = 100s
smtpd_proxy_timeout = 100s
smtpd_starttls_timeout = 300s
smtpd_timeout = ${stress?10}${stress:300}s
smtpd_tls_session_cache_timeout = 3600s
trigger_timeout = 10sКак я понимаю, после комманды Jul 23 00:02:34 XXX postfix/smtpd[9915]: > localhost[127.0.0.1]: 250 2.0.0 Ok: queued as EAEEBA028C когда письмо было добавлено очередь от клиента должна поступить команда MAIL FROM , однако все застревает после Jul 23 00:02:34 XXX postfix/smtpd[9915]: watchdog_pat: 0x7f317859e960.
Может быть увеличить smtp_mail_timeout ? Не уверен, что это реальная причина. Подскажите пожалуйста кто знает.
По моему у вас сработал smtpd_timeout, а сама проблема в php-скрипте, т.к. от него не поступало никаких данных в течение 300 сек.
> По моему у вас сработал smtpd_timeout, а сама проблема в php-скрипте, т.к.
> от него не поступало никаких данных в течение 300 сек.+
>> По моему у вас сработал smtpd_timeout, а сама проблема в php-скрипте, т.к.
>> от него не поступало никаких данных в течение 300 сек.Ну я тоже об этом думал. Меня смущает следующие обстоятельства: 1)phpmailer одна из самых известных библиотек 2) все запрограммировано и код не меняется 3)обычно рассылка уходит без всяких проблем 4)та рассылка, которая не ушла ночью из-за ошибки полностью повторяется утром и все ок. Если бы ошибка была в коде, то такого бы не было?
Всё это означает лишь то, что ошибка проявляется при достаточно редком стечении обстоятельств. Измените значение smtpd_timeout чтобы убедиться, что срабатывает именно он. Затем смотрите сниффером что происходит во время ошибки: если MAIL передаётся правильно, а постфикс его просто игнорирует, то проблема в почтовике. Иначе - проблема в скрипте (не обязательно именно в библиотеке).Если скрипт умеет вести логи, то надо их включить. Если не умеет - реализовать такую фичу и включить.
> Есть проект, который связан с коммерческой рассылкой. То есть люди платят, за
> то, чтобы получать эту рассылку.Где проект живет? на чьем сервере? на вашем или у какого-то хостера? Какая-то панель управления рулит сервером?
> Рассылка генерируется php и с помощью библиотеки phpmailer через smtp подлючение передается
> posftix, который должен ее отправлять. Далее снова генерирует рассылку и снова
> в постфикс и так далее.....
> ОШИБКА ВЫДАЕТСЯ НЕ СРАЗУ, А КОГДА НЕСКОЛЬКО ТЫСЯЧ ПИСЕМ БЛАГОПОЛУЧНО ОТРАВЛЕНО. Рассылка
> стартует в 00 часов. А ошибка появляется примерно через 2 с
> половиной минуты.Скрипт выплевывает все письма за один раз?
> Полез в логи постфикса.
Вы эти логи всегда такими держите, или специально включили для дебага _этой_ проблемы?
> Как я понимаю, после комманды Jul 23 00:02:34 XXX postfix/smtpd[9915]: > localhost[127.0.0.1]:
> 250 2.0.0 Ok: queued as EAEEBA028C когда письмо было добавлено очередь
> от клиента должна поступить команда MAIL FROMВозможно, что и так. Письмо в соединении принято, дальше всё зависит от реализации вашего скрипта.
>> Есть проект, который связан с коммерческой рассылкой. То есть люди платят, за
>> то, чтобы получать эту рассылку.
> Где проект живет? на чьем сервере? на вашем или у какого-то хостера?
> Какая-то панель управления рулит сервером?Проект живет на нашем сервере. Какой-то панели управления не существует , все напрямую.
>> Рассылка генерируется php и с помощью библиотеки phpmailer через smtp подлючение передается
>> posftix, который должен ее отправлять. Далее снова генерирует рассылку и снова
>> в постфикс и так далее.
> ....
>> ОШИБКА ВЫДАЕТСЯ НЕ СРАЗУ, А КОГДА НЕСКОЛЬКО ТЫСЯЧ ПИСЕМ БЛАГОПОЛУЧНО ОТРАВЛЕНО. Рассылка
>> стартует в 00 часов. А ошибка появляется примерно через 2 с
>> половиной минуты.
> Скрипт выплевывает все письма за один раз?Нет, пхп генерирует одно письмо а потом передает постфиксу с указанием ящиков (от 1 до 5 максимум) и так в цикле.
>> Полез в логи постфикса.
> Вы эти логи всегда такими держите, или специально включили для дебага _этой_
> проблемы?Специально включил, так как проблема уже не первый день. А что?
>> Как я понимаю, после комманды Jul 23 00:02:34 XXX postfix/smtpd[9915]: > localhost[127.0.0.1]:
>> 250 2.0.0 Ok: queued as EAEEBA028C когда письмо было добавлено очередь
>> от клиента должна поступить команда MAIL FROM
> Возможно, что и так. Письмо в соединении принято, дальше всё зависит от
> реализации вашего скрипта.Самое интересное, что MAIL FROM у нас всегда один и тот же. Все идет с одного ящика и от компании.
>> Скрипт выплевывает все письма за один раз?
> Нет, пхп генерирует одно письмо а потом передает постфиксу с указанием ящиков
> (от 1 до 5 максимум) и так в цикле.%№@#! скрипт отправляет все письма за один запуск?
>>> Скрипт выплевывает все письма за один раз?
>> Нет, пхп генерирует одно письмо а потом передает постфиксу с указанием ящиков
>> (от 1 до 5 максимум) и так в цикле.
> %№@#! скрипт отправляет все письма за один запуск?Чтобы не было двоякости в понимании рассказываю так. Есть script.php , в 00 часов крон запускает его (в одном экземпляре). Этот скрипт (для упрощения) имеет две функции. Сгенерировать письмо - первая. Отправить письмо на ящики пользователя (до 5 штук) - вторая. Данные две функции крутятся в цикле. Вторая функция берез экземляр пхпмейлера (один на протяжении всей работы script.php) передает ему новый входные данные и вперед.
>>>> Скрипт выплевывает все письма за один раз?
>>> Нет, пхп генерирует одно письмо а потом передает постфиксу с указанием ящиков
>>> (от 1 до 5 максимум) и так в цикле.
>> %№@#! скрипт отправляет все письма за один запуск?
> Чтобы не было двоякости в понимании рассказываю так.Извините, вы не умеет объяснять.
> Есть script.php , в 00 часов крон запускает его (в одном экземпляре). Этот скрипт (для
> упрощения) имеет две функции. Сгенерировать письмо - первая. Отправить письмо на
> ящики пользователя (до 5 штук) - вторая. Данные две функции крутятся
> в цикле. Вторая функция берез экземляр пхпмейлера (один на протяжении всей
> работы script.php) передает ему новый входные данные и вперед.Сколько писем в итоге отправляется, я так и не понял.
---------------
Короче:
1. Запусков должно быть много.
2. За один запуск должна отправляться малая часть писем, до нескольких десятков или до определения факта сбоя.
3. можете послушаться, применить, можете дальше развлекаться с пхп и пхпмейлером.
>[оверквотинг удален]
>>>> (от 1 до 5 максимум) и так в цикле.
>>> %№@#! скрипт отправляет все письма за один запуск?
>> Чтобы не было двоякости в понимании рассказываю так.
> Извините, вы не умеет объяснять.
>> Есть script.php , в 00 часов крон запускает его (в одном экземпляре). Этот скрипт (для
>> упрощения) имеет две функции. Сгенерировать письмо - первая. Отправить письмо на
>> ящики пользователя (до 5 штук) - вторая. Данные две функции крутятся
>> в цикле. Вторая функция берез экземляр пхпмейлера (один на протяжении всей
>> работы script.php) передает ему новый входные данные и вперед.
> Сколько писем в итоге отправляется, я так и не понял.Около 6 тыс.
> ---------------
> Короче:
> 1. Запусков должно быть много.
> 2. За один запуск должна отправляться малая часть писем, до нескольких десятков
> или до определения факта сбоя.
> 3. можете послушаться, применить, можете дальше развлекаться с пхп и пхпмейлером.Откуда такая информация? Большие сомнения. А завтра мне нужно будет разослать 80 тыс, это я буду сутками ее рассылать.
>[оверквотинг удален]
>> Сколько писем в итоге отправляется, я так и не понял.
> Около 6 тыс.
>> ---------------
>> Короче:
>> 1. Запусков должно быть много.
>> 2. За один запуск должна отправляться малая часть писем, до нескольких десятков
>> или до определения факта сбоя.
>> 3. можете послушаться, применить, можете дальше развлекаться с пхп и пхпмейлером.
> Откуда такая информация? Большие сомнения. А завтра мне нужно будет разослать 80
> тыс, это я буду сутками ее рассылать.- рассылать надо в несколько потоков скрипта
- в скрипте рассылальщика периодически надо закрывать тсп-соединение.
- рассылать надо за несколько запусков, с маркировкой отправки письма адресату, чтобы рассылка могла быть приостановлена-восстановлена, чтобы глючащие скрипты могли быть перезапущены.см. п.3.
>[оверквотинг удален]
>> Около 6 тыс.
>>> ---------------
>>> Короче:
>>> 1. Запусков должно быть много.
>>> 2. За один запуск должна отправляться малая часть писем, до нескольких десятков
>>> или до определения факта сбоя.
>>> 3. можете послушаться, применить, можете дальше развлекаться с пхп и пхпмейлером.
>> Откуда такая информация? Большие сомнения. А завтра мне нужно будет разослать 80
>> тыс, это я буду сутками ее рассылать.
> - рассылать надо в несколько потоков скриптаПоясните пожалуйста здесь - не совсем понимаю.
> - в скрипте рассылальщика периодически надо закрывать тсп-соединение.Почему? Я не спорю, но мне очень хочется понимать причину.
> - рассылать надо за несколько запусков, с маркировкой отправки письма адресату, чтобы
> рассылка могла быть приостановлена-восстановлена, чтобы глючащие скрипты могли быть перезапущены.
> см. п.3.Появилась такая идея. Скрипт script.php в конструкторе создает экземлпяр phpmailer и им пользуется все время. Соответсвенно экземпляр phpmailer соединяется с postfix и мы пользуемся этим соединением. А что если мы через каждые 1000 писем например будем создавать новый экземпляр phpmailer он же соответственно и будет создавать новое подключение к постфиксу. Что скажете?
>[оверквотинг удален]
>> - в скрипте рассылальщика периодически надо закрывать тсп-соединение.
> Почему? Я не спорю, но мне очень хочется понимать причину.
>> - рассылать надо за несколько запусков, с маркировкой отправки письма адресату, чтобы
>> рассылка могла быть приостановлена-восстановлена, чтобы глючащие скрипты могли быть перезапущены.
>> см. п.3.
> Появилась такая идея. Скрипт script.php в конструкторе создает экземлпяр phpmailer и им
> пользуется все время. Соответсвенно экземпляр phpmailer соединяется с postfix и мы
> пользуемся этим соединением. А что если мы через каждые 1000 писем
> например будем создавать новый экземпляр phpmailer он же соответственно и будет
> создавать новое подключение к постфиксу. Что скажете?Я не писал наших скриптов и всех деталей не знаю, но у нас оно "сделано как-то так" и работает без особого тюнинга постфикса.
Попробуйте.При работе скрипта контролируйте его размеры и т п.