Как я могу поймать ошибку, вызванную 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
Script:/customer.php
[Глобальный обработчик ошибок]
- >
Ответы
Ответ 1
Это самое лучшее, что вы можете сделать:
if (!mail(...)) {
// Reschedule for later try or panic appropriately!
}
http://php.net/manual/en/function.mail.php
mail()
возвращает TRUE
, если почта была успешно принята к доставке, FALSE
в противном случае.
Важно отметить, что только потому, что почта была принята для доставки, это НЕ означает, что почта действительно достигнет назначенного адресата.
Если вам нужно подавить предупреждения, вы можете использовать:
if ([email protected](...))
Будьте осторожны, хотя об использовании оператора @
без соответствующих проверок относительно того, что-то получится или нет.
Если ошибки mail()
не подавляются (странно, но не могут проверить его прямо сейчас), вы можете:
a) временно отключите ошибки:
$errLevel = error_reporting(E_ALL ^ E_NOTICE); // suppress NOTICEs
mail(...);
error_reporting($errLevel); // restore old error levels
b) используйте другую почтовую программу, как предложено fire и Майк.
Если mail()
оказывается слишком шелушащимся и негибким, я бы заглянул в b). Отключение ошибок делает отладку более сложной и обычно непродуктивна.
Ответ 2
PHPMailer отлично справляется с ошибками, а также хороший script для отправки почты через SMTP...
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
Ответ 3
также используя http://php.net/error_get_last не поможет вам, потому что mail() не передает свои ошибки в эту функцию.
Единственный способ, похоже, использовать правильную почтовую программу, как уже было сказано выше.
Ответ 4
В соответствии с http://php.net/manual/en/function.error-get-last.php используйте:
print_r(error_get_last());
Который вернет массив последней сгенерированной ошибки. Вы можете получить доступ к элементу [message]
для отображения ошибки.
Ответ 5
Вы можете использовать классы и методы PEAR Mail, который позволяет вам проверять наличие ошибок через:
if (PEAR::isError($mail)) {
echo("<p>" . $mail->getMessage() . "</p>");
} else {
echo("<p>Message successfully sent!</p>");
}
Вы можете найти пример здесь.