Подтвердить что ты не робот

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

4b9b3361

Ответ 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>");
}

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