URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 93588
[ Назад ]

Исходное сообщение
"Проблема с Postfix. Очень нужна помощь!"

Отправлено PashaTurok , 23-Июл-12 21:40 
Есть проект, который связан с коммерческой рассылкой. То есть люди платят, за то, чтобы получать эту рассылку.

Рассылка генерируется 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 ? Не уверен, что это реальная причина. Подскажите пожалуйста кто знает.


Содержание

Сообщения в этом обсуждении
"Проблема с Postfix. Очень нужна помощь!"
Отправлено Etch , 24-Июл-12 05:55 
По моему у вас сработал smtpd_timeout, а сама проблема в php-скрипте, т.к. от него не поступало никаких данных в течение 300 сек.

"Проблема с Postfix. Очень нужна помощь!"
Отправлено PavelR , 24-Июл-12 06:20 
> По моему у вас сработал smtpd_timeout, а сама проблема в php-скрипте, т.к.
> от него не поступало никаких данных в течение 300 сек.

+


"Проблема с Postfix. Очень нужна помощь!"
Отправлено PashaTurok , 24-Июл-12 10:29 
>> По моему у вас сработал smtpd_timeout, а сама проблема в php-скрипте, т.к.
>> от него не поступало никаких данных в течение 300 сек.

Ну я тоже об этом думал. Меня смущает следующие обстоятельства: 1)phpmailer одна из самых известных библиотек 2) все запрограммировано и код не меняется 3)обычно рассылка уходит без всяких проблем 4)та рассылка, которая не ушла ночью из-за ошибки полностью повторяется утром и все ок. Если бы ошибка была в коде, то такого бы не было?


"Проблема с Postfix. Очень нужна помощь!"
Отправлено Etch , 24-Июл-12 12:02 
Всё это означает лишь то, что ошибка проявляется при достаточно редком стечении обстоятельств. Измените значение smtpd_timeout чтобы убедиться, что срабатывает именно он. Затем смотрите сниффером что происходит во время ошибки: если MAIL передаётся правильно, а постфикс его просто игнорирует, то проблема в почтовике. Иначе - проблема в скрипте (не обязательно именно в библиотеке).

Если скрипт умеет вести логи, то надо их включить. Если не умеет - реализовать такую фичу и включить.


"Проблема с Postfix. Очень нужна помощь!"
Отправлено PavelR , 24-Июл-12 06:24 
> Есть проект, который связан с коммерческой рассылкой. То есть люди платят, за
> то, чтобы получать эту рассылку.

Где проект живет? на чьем сервере? на вашем или у какого-то хостера? Какая-то панель управления рулит сервером?

> Рассылка генерируется 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

Возможно, что и так. Письмо в соединении принято, дальше всё зависит от реализации вашего скрипта.


"Проблема с Postfix. Очень нужна помощь!"
Отправлено PashaTurok , 24-Июл-12 10:34 
>> Есть проект, который связан с коммерческой рассылкой. То есть люди платят, за
>> то, чтобы получать эту рассылку.
> Где проект живет? на чьем сервере? на вашем или у какого-то хостера?
> Какая-то панель управления рулит сервером?

Проект живет на нашем сервере. Какой-то панели управления не существует , все напрямую.

>> Рассылка генерируется 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 у нас всегда один и тот же. Все идет с одного ящика и от компании.



"Проблема с Postfix. Очень нужна помощь!"
Отправлено PavelR , 24-Июл-12 12:04 
>> Скрипт выплевывает все письма за один раз?
> Нет, пхп генерирует одно письмо а потом передает постфиксу с указанием ящиков
> (от 1 до 5 максимум) и так в цикле.

%№@#! скрипт отправляет все письма за один запуск?


"Проблема с Postfix. Очень нужна помощь!"
Отправлено PashaTurok , 24-Июл-12 12:19 
>>> Скрипт выплевывает все письма за один раз?
>> Нет, пхп генерирует одно письмо а потом передает постфиксу с указанием ящиков
>> (от 1 до 5 максимум) и так в цикле.
> %№@#! скрипт отправляет все письма за один запуск?

Чтобы не было двоякости в понимании рассказываю так. Есть script.php , в 00 часов крон запускает его (в одном экземпляре). Этот скрипт (для упрощения) имеет две функции. Сгенерировать письмо - первая. Отправить письмо на ящики пользователя (до 5 штук) - вторая. Данные две функции крутятся в цикле. Вторая функция берез экземляр пхпмейлера (один на протяжении всей работы script.php) передает ему новый входные данные и вперед.


"Проблема с Postfix. Очень нужна помощь!"
Отправлено PavelR , 24-Июл-12 12:37 
>>>> Скрипт выплевывает все письма за один раз?
>>> Нет, пхп генерирует одно письмо а потом передает постфиксу с указанием ящиков
>>> (от 1 до 5 максимум) и так в цикле.
>> %№@#! скрипт отправляет все письма за один запуск?
> Чтобы не было двоякости в понимании рассказываю так.

Извините, вы не умеет объяснять.

> Есть script.php , в 00 часов крон запускает его (в одном экземпляре). Этот скрипт (для
> упрощения) имеет две функции. Сгенерировать письмо - первая. Отправить письмо на
> ящики пользователя (до 5 штук) - вторая. Данные две функции крутятся
> в цикле. Вторая функция берез экземляр пхпмейлера (один на протяжении всей
> работы script.php) передает ему новый входные данные и вперед.

Сколько писем в итоге отправляется, я так и не понял.

---------------

Короче:

1. Запусков должно быть много.
2. За один запуск должна отправляться малая часть писем, до нескольких десятков или до определения факта сбоя.
3. можете послушаться, применить, можете дальше развлекаться с пхп и пхпмейлером.


"Проблема с Postfix. Очень нужна помощь!"
Отправлено PashaTurok , 24-Июл-12 12:45 
>[оверквотинг удален]
>>>> (от 1 до 5 максимум) и так в цикле.
>>> %№@#! скрипт отправляет все письма за один запуск?
>> Чтобы не было двоякости в понимании рассказываю так.
> Извините, вы не умеет объяснять.
>> Есть script.php , в 00 часов крон запускает его (в одном экземпляре). Этот скрипт (для
>> упрощения) имеет две функции. Сгенерировать письмо - первая. Отправить письмо на
>> ящики пользователя (до 5 штук) - вторая. Данные две функции крутятся
>> в цикле. Вторая функция берез экземляр пхпмейлера (один на протяжении всей
>> работы script.php) передает ему новый входные данные и вперед.
> Сколько писем в итоге отправляется, я так и не понял.

Около 6 тыс.
> ---------------
> Короче:
> 1. Запусков должно быть много.
> 2. За один запуск должна отправляться малая часть писем, до нескольких десятков
> или до определения факта сбоя.
> 3. можете послушаться, применить, можете дальше развлекаться с пхп и пхпмейлером.

Откуда такая информация? Большие сомнения. А завтра мне нужно будет разослать 80 тыс, это я буду сутками ее рассылать.


"Проблема с Postfix. Очень нужна помощь!"
Отправлено PavelR , 24-Июл-12 12:51 
>[оверквотинг удален]
>> Сколько писем в итоге отправляется, я так и не понял.
> Около 6 тыс.
>> ---------------
>> Короче:
>> 1. Запусков должно быть много.
>> 2. За один запуск должна отправляться малая часть писем, до нескольких десятков
>> или до определения факта сбоя.
>> 3. можете послушаться, применить, можете дальше развлекаться с пхп и пхпмейлером.
> Откуда такая информация? Большие сомнения. А завтра мне нужно будет разослать 80
> тыс, это я буду сутками ее рассылать.

- рассылать надо в несколько потоков скрипта
- в скрипте рассылальщика периодически надо закрывать тсп-соединение.
- рассылать надо за несколько запусков, с маркировкой отправки письма адресату, чтобы рассылка могла быть приостановлена-восстановлена, чтобы глючащие скрипты могли быть перезапущены.

см. п.3.


"Проблема с Postfix. Очень нужна помощь!"
Отправлено PashaTurok , 24-Июл-12 13:02 
>[оверквотинг удален]
>> Около 6 тыс.
>>> ---------------
>>> Короче:
>>> 1. Запусков должно быть много.
>>> 2. За один запуск должна отправляться малая часть писем, до нескольких десятков
>>> или до определения факта сбоя.
>>> 3. можете послушаться, применить, можете дальше развлекаться с пхп и пхпмейлером.
>> Откуда такая информация? Большие сомнения. А завтра мне нужно будет разослать 80
>> тыс, это я буду сутками ее рассылать.
> - рассылать надо в несколько потоков скрипта

Поясните пожалуйста здесь - не совсем понимаю.
> - в скрипте рассылальщика периодически надо закрывать тсп-соединение.

Почему? Я не спорю, но мне очень хочется понимать причину.
> - рассылать надо за несколько запусков, с маркировкой отправки письма адресату, чтобы
> рассылка могла быть приостановлена-восстановлена, чтобы глючащие скрипты могли быть перезапущены.
> см. п.3.

Появилась такая идея. Скрипт script.php в конструкторе создает экземлпяр phpmailer и им пользуется все время. Соответсвенно экземпляр phpmailer соединяется с postfix и мы пользуемся этим соединением. А что если мы через каждые 1000 писем например будем создавать новый экземпляр phpmailer он же соответственно и будет создавать новое подключение к постфиксу. Что скажете?



"Проблема с Postfix. Очень нужна помощь!"
Отправлено PavelR , 24-Июл-12 13:08 
>[оверквотинг удален]
>> - в скрипте рассылальщика периодически надо закрывать тсп-соединение.
> Почему? Я не спорю, но мне очень хочется понимать причину.
>> - рассылать надо за несколько запусков, с маркировкой отправки письма адресату, чтобы
>> рассылка могла быть приостановлена-восстановлена, чтобы глючащие скрипты могли быть перезапущены.
>> см. п.3.
> Появилась такая идея. Скрипт script.php в конструкторе создает экземлпяр phpmailer и им
> пользуется все время. Соответсвенно экземпляр phpmailer соединяется с postfix и мы
> пользуемся этим соединением. А что если мы через каждые 1000 писем
> например будем создавать новый экземпляр phpmailer он же соответственно и будет
> создавать новое подключение к постфиксу. Что скажете?

Я не писал наших скриптов и всех деталей не знаю, но у нас оно "сделано как-то так" и работает без особого тюнинга постфикса.


Попробуйте.

При работе скрипта контролируйте его размеры и т п.