php as CGI + mail + "550: No such user" = "malformed header from script..."

vedy

Новичок
php as CGI + mail + "550: No such user" = "malformed header from script..."

Впервые столкнулась с такой проблемой.
PHP установлен как CGI ( phpinfo )
На сайте стоит phpbb со встроенным майлером, который банально использует php-функцию mail, для отправки писем.
PHP:
$result = @mail($to, $this->subject, preg_replace("#(?<!\r)\n#s", "\n", $this->msg), $this->extra_headers);
При попытке отправить письмо, если адрес не существует, мыльный сервер шлёт отлуп (550 или какой другой, в зависимости от причины невозможности доставки письма).
И sendmail или CGI-обработчик выдаёт отлуп прямо в поток вывода скрипта.
В результате чего, отлуп летит клиенту ДО отправки заголовков.
Ессно, сервер не может этого допустить и получаем "500 Internal Server Error", а в error-логе сервера: "malformed header from script. Bad [email protected]... No such user he: /home/ubiz.ru/php-bin/php".

Пример 1, работающий за счёт того, что до вызова функции mail, идёт вывод html-кода, значит, заголовки уже отправлены:
_______________________________________________________________________________
PHP:
<form method=post><input name="addr" /></form>
<?php
if(isset($_POST['addr']) && !empty($_POST['addr'])) {
    $result = @mail(urldecode($_POST['addr']), "mail test email", "mail test email");

    if (!$result)
		{
			die(__LINE__.':'.__FILE__.' :: Failed sending email :: ');
		}

}

?>
_______________________________________________________________________________




Результат работы примера 1 - попытка отправить письмо на несуществующий "[email protected]":
_______________________________________________________________________________
PHP:
 (_________ input поле)
[email][email protected][/email]... No such user here 8:/home/ubiz.ru/htdocs/z.php :: Failed sending email ::
_______________________________________________________________________________

Здесь "[email protected]... No such user here" - отлуп mail-сервера, который каким-то образом попадает прямо в вывод скрипта.




Пример 2, с результатом "500 Internal Server Error", как в PHPBB:
_______________________________________________________________________________
PHP:
<?php
if(isset($_POST['addr']) && !empty($_POST['addr'])) {
    $result = @mail(urldecode($_POST['addr']), "mail test email", "mail test email");

    if (!$result)
		{
			die(__LINE__.':'.__FILE__.' :: Failed sending email :: ');
		}

}

?>
<form method=post><input name="addr" /></form>
_______________________________________________________________________________


Попытка вставить ob_start() до вызова ф-ции mail ничего не дала.

Вопрос: как перехватить ошибку (отлуп майл-сервера) в данном случае и не допустить её выброс до отправки заголовков скрипта?

-~{}~ 13.12.07 08:26:

ээх, трудный оказался вопрос для здешней коммьюнити :-\
неужели нито не сталкивался?
 

AmdY

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

vedy

Новичок
_______________________________________________________________
PHP:
<?php
ini_set('error_reporting', E_ALL);
if(isset($_POST['addr']) && !empty($_POST['addr'])) {
    $result = mail(urldecode($_POST['addr']), "mail test email", "mail test email");

    if (!$result)
		{
			die(__LINE__.':'.__FILE__.' :: Failed sending email :: ');
		}

}
?>
<form method=post><input name="addr" /></form>
_______________________________________________________________

Пост: $_POST["addr"] = "[email protected]";
В браузере: "500 Internal Server Error"
В error-логе: "[Thu Dec 13 03:01:33 2007] [error] [client 90.188.253.12] malformed header from script. Bad [email protected]... No such user he: /home/ubiz.ru/php-bin/php"

-~{}~ 13.12.07 10:03:

Абсолютно то же самое при:

PHP:
<?php
if(isset($_POST['addr']) && !empty($_POST['addr'])) {
    ob_start();
    $result = @mail(urldecode($_POST['addr']), "mail test email", "mail test email");

    if (!$result)
		{
			die(__LINE__.':'.__FILE__.' :: Failed sending email :: ');
		}
    ob_end_clean();

}
?>
<form method=post><input name="addr" /></form>
и при:


PHP:
<?php
function  ob_handler($str) {
    return;
}
if(isset($_POST['addr']) && !empty($_POST['addr'])) {
    ob_start('ob_handler');
    $result = @mail(urldecode($_POST['addr']), "mail test email", "mail test email");

    if (!$result)
		{
			die(__LINE__.':'.__FILE__.' :: Failed sending email :: ');
		}
    ob_end_clean();

}
?>
<form method=post><input name="addr" /></form>
-~{}~ 13.12.07 10:06:

___________________________________
да, и.... если адрес правильный и существует на емайл-сервере, то есть, если sendmail не получает отлупа, всё работает на 100%.
 

phpdev2007

Новичок
vedy
по убирай бездумные ob_
ini_set('error_reporting', E_ALL);
ок уровень выставил молоток
в какой лог пишешь ошибки? - укажи его через ini_set()
и потом привиди полную ошибку с лога
 

vedy

Новичок
Автор оригинала: phpdev2007
ini_set('error_reporting', E_ALL);
ок уровень выставил молоток
ага, спасибо

PHP:
<?php
ini_set('error_reporting', E_ALL);
ini_set('error_log', dirname(__FILE__).'/logs/error.log');

if(isset($_POST['addr']) && !empty($_POST['addr'])) {
    $result = mail(urldecode($_POST['addr']), "mail test email", "mail test email");

    if (!$result)
    {
        die(__LINE__.':'.__FILE__.' :: Failed sending email :: ');
    }

}
echo ini_get('error_log');
?>
<form method=post><input name="addr" /></form>
никаких видимых результатов (права на "logs/" и "logs/error.log", ессно, 777)

хотя по запросу
PHP:
echo ini_get('error_log');
конечно выдаётся то, что задано в скрипте (правильный путь от корня диска), но ошибки всё равно пишутся в сервереый error_log, а в указанном файле пусто.


и всё как было.

-~{}~ 13.12.07 12:55:

что ещё было сделано:
1. попытка исправить путь к sendmail в php.ini, добавив в конец параметров вызова " >/dev/null 2>&1", как результат - sendmail вообще не найден
2. то же самое - добавить ">/dev/null 2>&1" четвёртым параметром вызова mail в PHP-скрипте (никакой реакции)
3. попытка найти в параметрах командной строки sendmail-а параметр, отвечающий за вывод и отключение вывода сообщений от майл-сервера (безуспешно)
 
Сверху