Кто-нибудь знает, как я могу поймать почтовую ошибку (ошибка отображается при отправке электронной почты, а ошибка вызвана почтовым сервером) в php?
Ошибка, которая была вызвана сервером электронной почты ниже:
<! – 2010-02-24T14: 26: 43 + 11: 00 УВЕДОМЛЕНИЕ (5): Неожиданная ошибка: mail () [<a href = 'function.mail'> function.mail </a>]: не удалось подключитесь к почтовому серверу в порте портов «ip», проверьте настройки «SMTP» и «smtp_port» в php.ini или используйте ini_set () (# 2).
2010-02-24 14:26:43
Имя пользователя: admin
Ошибка в строке 439 файла D: \ test.php
Сценарий: /customer.php
[Глобальный обработчик ошибок]
->
Это самое лучшее, что вы можете сделать:
if (!mail(...)) { // Reschedule for later try or panic appropriately! }
http://php.net/manual/en/function.mail.php
mail()
возвращаетTRUE
если почта была успешно принята к доставке, в противном случаеFALSE
.Важно отметить, что только потому, что почта была принята для доставки, это НЕ означает, что почта действительно достигнет предполагаемого адресата.
Если вам нужно подавить предупреждения, вы можете использовать:
if (!@mail(...))
Будьте осторожны, хотя об использовании оператора @
без соответствующих проверок относительно того, что-то преуспеет или нет.
Если ошибки mail()
не являются подавляемыми (странно, но не могут проверить их прямо сейчас), вы можете:
a) временно отключить ошибки:
$errLevel = error_reporting(E_ALL ^ E_NOTICE); // suppress NOTICEs mail(...); error_reporting($errLevel); // restore old error levels
б) использовать другую почтовую программу, как это было предложено пожаром и Майком .
Если mail()
оказывается слишком шелушащимся и негибким, я бы заглянул в b). Отключение ошибок делает отладку более сложной и, как правило, некачественной.
PHPMailer отлично справляется с ошибками, а также хороший скрипт для отправки почты через SMTP …
if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message sent!"; }
также использование http://php.net/error_get_last не поможет, потому что mail () не передает свои ошибки в эту функцию.
Кажется, что только способ использует правильную почтовую программу, как уже было сказано выше.
Согласно http://php.net/manual/en/function.error-get-last.php , используйте:
print_r(error_get_last());
Который вернет массив последней возникшей ошибки. Вы можете получить доступ к элементу [message]
для отображения ошибки.
Вы можете использовать классы и методы PEAR Mail , которые позволяют проверять наличие ошибок через:
if (PEAR::isError($mail)) { echo("<p>" . $mail->getMessage() . "</p>"); } else { echo("<p>Message successfully sent!</p>"); }
Здесь вы можете найти пример.