Как я могу поймать ошибку, вызванную mail ()?

Кто-нибудь знает, как я могу поймать почтовую ошибку (ошибка отображается при отправке электронной почты, а ошибка вызвана почтовым сервером) в 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
[Глобальный обработчик ошибок]
->

Solutions Collecting From Web of "Как я могу поймать ошибку, вызванную mail ()?"

Это самое лучшее, что вы можете сделать:

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>"); } 

Здесь вы можете найти пример.