Отловить в PHP ошибку при отправлении почты(mail)

Chese

Guest
Отловить в PHP ошибку при отправлении почты(mail)

Функция mail возврашает TRUE или FALSE, а можно ли при FALSE отловить, почему именно не ушло письмо т.е. код ошибки.
 

tony2001

TeaM PHPClub
используй [m]imap_mail[/m]
тексты ошибок - через [m]imap_errors[/m], [m]imap_last_error[/m]
 

tony2001

TeaM PHPClub
тогда все пропало.
в исходниках нет возврата ошибок - есть либо TRUE, либо FALSE
Код:
        if (php_mail(to, subject, message, headers, extra_cmd TSRMLS_CC)) {
                RETVAL_TRUE;
        } else {
                RETVAL_FALSE;
        }
 

Chese

Guest
Понято, значит будем просто ругаться без объяснения причин.
 

Barlone

Guest
Re: Отловить в PHP ошибку при отправлении почты(mail)

Автор оригинала: Chese
Функция mail возврашает TRUE или FALSE, а можно ли при FALSE отловить, почему именно не ушло письмо т.е. код ошибки.
Не уйти оно может только по одной причине - в php.ini путь к sendmail указан неправильно.
 

Chese

Guest
Не уйти оно может только по одной причине - в php.ini путь к sendmail указан неправильно
Ну по чему? ;) Если емайл верный, а записи в DNS про домен нет, или у Sendmail переполнена очередь и он не возьмет в отправку....
 

Barlone

Guest
Если емайл верный, а записи в DNS про домен нет
... то письмо успешно передастся sendmail'у, а вот он уже не сможет его доставить. Очередь переполнена? Ну не знаю, тестировать не возьмусь :)
 

trolik

Guest
зачем юзать функцию mail?
передавай парметры sendmail и пиши тело письма с заголовками ему же... а потом анализируй код возврата
 

-ViT-

Guest
А вот что сегодня выдал броузер....

Автор оригинала: tony2001
тогда все пропало.
в исходниках нет возврата ошибок - есть либо TRUE, либо FALSE
Я как раз сегодня добрался до функции mail. Иногда пропадает переменная сессии и в качестве e-mail передается пустое поле - и тогда броузер пишет (цитирую):

Warning: Bad Message destination in F:\WEBProjects\inetpub\wwwroot\PHPDeveloping\Regform2.phtml on line 73

То есть какая-то же диагностика есть?? :confused:
 

Barlone

Guest
Под виндой mail работает совсем не так, как под unix.
 

tony2001

TeaM PHPClub
ViT:
какая диагностика ?
неправильный аргумент приходит - вот и ошибка.
проверяй ДО и все будет ок.
исходники посмотри - там все достаточно ясно.
 

-ViT-

Guest
2 tony2001: - это я знаю, и в данном случае потерянный аргумент - это нормально, это стадия отладки у меня шла... Я просто хочу спросить (абсолютно ПО теме топика) - что раз пришло такое сообщение, значит все же что-то как-то диагносцируется? В исходниках (приведенных тобой) - все совершенно ясно, простейшая конструкция.. Но кто тогда вернул мне этот мессадж? :)

2 Barlone: ты прав, это PHP у меня крутится под IIS, и клиент, с которого снято сообщение - WinXP/Opera. Но ведь ядро PHP (сорцы) - одинаково или тоже нет?
 

tony2001

TeaM PHPClub
речь шла о том "как определить почему не доставляется письмо".
так ?
логично предположить, что элементарная проверка на "а что нам передали как е-мэйл?" там присутствует.
так ?
вот ты видишь ее результат.
более подробно - смотри исходники.

честно говоря, немного не понимаю понятия "диагностика".
если проверка аргумента - это диагностика, то да, диагностика есть.
 

Barlone

Guest
Специально посмотрел в исходники РНР :)
Для Win (#ifdef PHP_WIN32) там идет отправка по smtp, и какие-то ошибки в smtp-сессии видимо отлавливаются.
Для не-win никаких проверок не делается, popen'ом открывается sendmail, ему пихаются "To:", "Subject:", остальные заголовки (как есть) и тело письма. Ошибка может быть только одна: "Could not execute mail delivery program" если popen не сработал.
 

-ViT-

Guest
2 Barlone:
Вот спасибо, а то я никак до исходников не доберусь! :(
Лично мне так механизм стал намного понятнее!
Следовательно, если переносить хост на Unix-сервера, то надо вновь очень тщательно тестить/вычищать/модернизировать все скрипты.... мда, жаль :(
 

tony2001

TeaM PHPClub
http://cvs.php.net/co.php/php4/ext/standard/mail.c?login=2&r=1.66.2.1
смотреть
php_mail() & PHP_FUNCTION(mail)
 

Barlone

Guest
Ну тестить-то надо в любом случае. :) Модернизировать ? Зачем ? Если письмо формируется правильно, без разницы, как оно отправляется.
Кстати, если указать sendmail_path под виндой, то он будет использоваться, и отправляться как на unix. Остается только найти sendmail под винду. :)
 

Chese

Guest
Автор оригинала: trolik
зачем юзать функцию mail?
передавай парметры sendmail и пиши тело письма с заголовками ему же... а потом анализируй код возврата
Молчит как партизан sendmail
PHP:
error_reporting(E_ALL);
$mailer = popen ("/usr/sbin/sendmail -t -i","w");
fwrite ($mailer,"Subject: Test
From: [email][email protected][/email]
To: aaa@[email protected]

Test!!!
");
$read = fread($mailer, 2096);
echo $read;
pclose ($mailer);
 
Сверху