Проблема с отправкой письма из php скрипта через exim (unexpected disconnection while reading SMTP command)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

NeverM
Сообщения: 248
ОС: gentoo

Проблема с отправкой письма из php скрипта через exim

Сообщение NeverM »

Здравствуйте, есть php скрипт:

Код: Выделить всё

<?
$message="q";
$mailer="PHP";
$connect = fsockopen (localhost, 25);
fputs($connect, "HELO localhost\r\n");
fputs($connect, "MAIL FROM: test@test.ru\n");
fputs($connect, "RCPT TO: test@test.ru\n");
fputs($connect, "DATA\r\n");
fputs($connect, "To: test@test.ru\n");
fputs($connect, "MIME-Version: 1.0\n");
fputs($connect, "Content-Type: text/plain; charset=utf-8\n");
fputs($connect, "Content-transfer-encoding: 8bit\n");
fputs($connect, "X-Priority: 3\n");
fputs($connect, "X-MSMail-Priority: Normal\n");
fputs($connect, "From: test@test.ru\n");
fputs($connect, "X-Mailer: $mailer\n");
fputs($connect, "\n\n");
fputs($connect, stripslashes($message)." \r\n");
fputs($connect, ".\r\n");
fputs($connect, "RSET\r\n");
?>


если попробовать его запустить командой

Код: Выделить всё

/usr/bin/php /root/mail.php

то письмо уходит нормально, но если попробовать добавить это задание (/usr/bin/php /root/mail.php) в crontab то письмо почемуто не уходит и в логах появляется:

Код: Выделить всё

unexpected disconnection while reading SMTP command from localhost [127.0.0.1]


php скрипт самописный, в качестве smtp сервера выступает exim, в конфиге присутствует:

Код: Выделить всё

smtp_enforce_sync = false


Помогите решить проблему
Спасибо сказали:
alfss
Сообщения: 262

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение alfss »

а в логах exim что?
Спасибо сказали:
NeverM
Сообщения: 248
ОС: gentoo

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение NeverM »

alfss писал(а):
26.06.2009 02:15
а в логах exim что?

в логах exim'а при отправке через crontab

unexpected disconnection while reading SMTP command from localhost [127.0.0.1]
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение IMB »

Чуть отвлеченный вопрос - почему при наличии настроенного MTA не используете встроенные функции для работы с почтой?
Спасибо сказали:
Аватара пользователя
vr13
Сообщения: 887
ОС: gentoo

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение vr13 »

попробуйте заменить RSET на QUIT
Спасибо сказали:
NeverM
Сообщения: 248
ОС: gentoo

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение NeverM »

IMB писал(а):
26.06.2009 09:59
Чуть отвлеченный вопрос - почему при наличии настроенного MTA не используете встроенные функции для работы с почтой?

просто спортивный интерес почему не получается так

vr13 писал(а):
26.06.2009 10:16
попробуйте заменить RSET на QUIT

попробовал, не помогает, кстати заметил ещё одну интересную вещь, из 10 отправленных писем через crontab одно всё же отправляется
Спасибо сказали:
Аватара пользователя
vr13
Сообщения: 887
ОС: gentoo

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение vr13 »

NeverM писал(а):
26.06.2009 10:30
IMB писал(а):
26.06.2009 09:59
Чуть отвлеченный вопрос - почему при наличии настроенного MTA не используете встроенные функции для работы с почтой?

просто спортивный интерес почему не получается так

мне думается, что дело в разрыве соединения: в вашем коде нет явного закрытия tcp соединения - fclose(), поэтому exim получает connection reset до того как полученное сообщение закончит ставится в очередь на доставку. иногда - успевает, поэтому письмо проходит, но чаще - нет. quit, кстати, предлагался из соображений, что exim будет сам инициировать разрыв tcp-сессии, вероятно и это делается асинхронно
Спасибо сказали:
NeverM
Сообщения: 248
ОС: gentoo

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение NeverM »

vr13 писал(а):
26.06.2009 10:43
NeverM писал(а):
26.06.2009 10:30
IMB писал(а):
26.06.2009 09:59
Чуть отвлеченный вопрос - почему при наличии настроенного MTA не используете встроенные функции для работы с почтой?

просто спортивный интерес почему не получается так

мне думается, что дело в разрыве соединения: в вашем коде нет явного закрытия tcp соединения - fclose(), поэтому exim получает connection reset до того как полученное сообщение закончит ставится в очередь на доставку. иногда - успевает, поэтому письмо проходит, но чаще - нет. quit, кстати, предлагался из соображений, что exim будет сам инициировать разрыв tcp-сессии, вероятно и это делается асинхронно

добавил в конец:
fclose ($connect);

не помогает
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение IMB »

Если для Вас отправка через Exim именно таким методом не критична, то я использую такую констркцию:

Код: Выделить всё

$command = "/usr/bin/sendEmail -f \"office.company.ru <office@company.ru>\" ".
    "-t \"$user <$mail>\" -u \"С Днем Рождения!\" -s smtp.company.ru " .
    "-m \"$text\" -o message-charset=utf-8 -q";
system($command, $err);
Спасибо сказали:
Аватара пользователя
vr13
Сообщения: 887
ОС: gentoo

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение vr13 »

NeverM писал(а):
26.06.2009 11:02
добавил в конец:
fclose ($connect);

не помогает

я попытался помучать exim с вашей конфигурацией вашим скриптом - unexpected disconnect'ов не увидел ни разу, хотя минут за 15 кроном напихал ~300 сообщений. может быть дело в том, что сервер у меня быстрее и менее загруженный. можно попытаться перед fclose() поставить sleep() на секундочку, вдруг поможет?

понятно, что ваш скрипт некорректно работает с протоколом: smtp - это диалог все-таки, и ему следует хотя бы формально читать то, что приходит от сервера. поэтому лучше воспользоваться подсказкой IMB, как отправлять почту. еще замечание по поводу smtp_enforce_sync = false: на мой взгляд, если не стоит true (у меня в рабочей конфигурации стоит) - то существенно упрощается жизнь спамерам, которые шлют как и чем попало. что лучше - позволять exim'у чаще форкаться или больше нагружать антиспамные/антивирусные фильтры - вам решать
Спасибо сказали:
NeverM
Сообщения: 248
ОС: gentoo

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение NeverM »

vr13 писал(а):
26.06.2009 13:51
NeverM писал(а):
26.06.2009 11:02
добавил в конец:
fclose ($connect);

не помогает

я попытался помучать exim с вашей конфигурацией вашим скриптом - unexpected disconnect'ов не увидел ни разу, хотя минут за 15 кроном напихал ~300 сообщений. может быть дело в том, что сервер у меня быстрее и менее загруженный. можно попытаться перед fclose() поставить sleep() на секундочку, вдруг поможет?

понятно, что ваш скрипт некорректно работает с протоколом: smtp - это диалог все-таки, и ему следует хотя бы формально читать то, что приходит от сервера. поэтому лучше воспользоваться подсказкой IMB, как отправлять почту. еще замечание по поводу smtp_enforce_sync = false: на мой взгляд, если не стоит true (у меня в рабочей конфигурации стоит) - то существенно упрощается жизнь спамерам, которые шлют как и чем попало. что лучше - позволять exim'у чаще форкаться или больше нагружать антиспамные/антивирусные фильтры - вам решать

ок, попробую запустить свой скрипт на другом более мощном сервере с такойже конфигурацией, о результате отпишусь завтра ближе к вечеру. И всё же не понятно почему при ручном запуске скрипта всё проходит нормально а при запуске из крона нет, запуск то идёт от одного и тогоже юзера(root'а) и одной и тойже командой.
Спасибо сказали:
Аватара пользователя
McLeod095
Сообщения: 477
ОС: Люблю слаку

Re: Проблема с отправкой письма из php скрипта через exim

Сообщение McLeod095 »

Стоит обратить внимание на опцию smtp_enforce_sync в конфиге exim
данная опция отвечает за синхронизацию smtp сессии
Ваш скрипт как раз и является тем случаем когда Вы не дожидаетесь ответа от сервера о получении им от Вас команды.
Т.к. данная опция включена почти везде и у меня тоже то были проблемы у меня с одним сервером который при получении им письма с моего сервера ломился обратно ко мне и проверял существование отправителя, и данная проверка по всей видимости осуществлялась таким же скриптом, в итоге exim посылал его куда по дальше и закрывал сессию, и почта от меня на данный сервер не уходила. К сожалению зависели больше мы от данной компании а не они от нас, поэтому пришлось прописать что -то вроде
accept Message = dolbanaya company
hosts = 123.123.123.123
control = no_enforce_sync

первым правилом в acl_check_smtp:
В итоге все сразу заработало.

Может Вам тоже стоит покопаться в этом направлении
"Work PC" E6750/2GB/Asus P5B Deluxe/2x250GB/6600GT 128/Slackware Current (Win 2003 in VmWare)
New Work: E6400/3GB/Arch
Home Book: Asus W6k00A/Arch, Asus 701/Arch
Спасибо сказали: