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

Как я могу получить сообщение об ошибке для функции mail()?

Я использую функцию PHP mail().

Если почта по какой-либо причине не отправляется, я хотел бы повторить сообщение об ошибке. Как мне это сделать?

Что-то вроде

$this_mail = mail('[email protected]', 'My Subject', $message);

if($this_mail) echo 'sent!';
else echo error_message;

Спасибо!

4b9b3361

Ответ 1

Вы можете использовать error_get_last(), когда mail() возвращает false.

$success = mail('[email protected]', 'My Subject', $message);
if (!$success) {
    $errorMessage = error_get_last()['message'];
}

С print_r(error_get_last()) вы получите что-то вроде этого:

[type] = > 2
[message] = > mail(): Не удалось подключиться к почтовому серверу через порт "x.x.x.x" 25, проверьте настройки "SMTP" и "smtp_port" в php.ini или используйте ini_set()
[файл] = > C:\www\X\X.php
[line] = > 2

Ответ 2

отправка почты в php не является одношаговым процессом. mail() возвращает true/false, но даже если он возвращает true, это не означает, что сообщение будет отправлено. все mail() это добавляет сообщение в очередь (используя sendmail или что-то, что вы установили в php.ini)

нет надежного способа проверить, было ли отправлено сообщение в php. вам придется просматривать журналы почтового сервера.

Ответ 3

Вы можете использовать почтовый ящик PEAR, который имеет тот же интерфейс, но возвращает PEAR_Error, когда есть проблемы.

Ответ 4

Нет сообщения об ошибке, связанного с функцией mail(). Остается только true или false, если письмо было принято для доставки. Не будет ли он в конечном итоге доставлен, но в основном, существует ли домен и адрес является правильно отформатированным адресом электронной почты.

Ответ 5

$e=error_get_last();
if($e['message']!==''){
    // An error function
}

error_get_last(); - возвращает последнюю произошедшую ошибку

Ответ 6

Попробуйте это. Если у меня возникла какая-либо ошибка в любом файле, я получил сообщение об ошибке на моем идентификаторе электронной почты. Создайте два файла index.php и checkErrorEmail.php и загрузите их на свой сервер. Затем загрузите index.php в свой браузер.

Index.php

<?php
    include('checkErrorEmail.php');
    include('dereporting.php');
    $temp;
    echo 'hi '.$temp;
?>

checkErrorEmail.php

<?php
  // Destinations
  define("ADMIN_EMAIL", "[email protected]");
  //define("LOG_FILE", "/my/home/errors.log");

  // Destination types
  define("DEST_EMAIL", "1");
  //define("DEST_LOGFILE", "3");

  /* Examples */

  // Send an e-mail to the administrator
  //error_log("Fix me!", DEST_EMAIL, ADMIN_EMAIL);

  // Write the error to our log file
  //error_log("Error", DEST_LOGFILE, LOG_FILE);

  /**
    * my_error_handler($errno, $errstr, $errfile, $errline)
    *
    * Author(s): thanosb, ddonahue
    * Date: May 11, 2008
    * 
    * custom error handler
    *
    * Parameters:
    *  $errno:   Error level
    *  $errstr:  Error message
    *  $errfile: File in which the error was raised
    *  $errline: Line at which the error occurred
    */

  function my_error_handler($errno, $errstr, $errfile, $errline)
  {  
  echo "<br><br><br><br>errno ".$errno.",<br>errstr ".$errstr.",<br>errfile ".$errfile.",<br>errline ".$errline;
      if($errno)
      {
              error_log("Error: $errstr \n error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL);
      }
    /*switch ($errno) {
      case E_USER_ERROR:
        // Send an e-mail to the administrator
        error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL);

        // Write the error to our log file
        //error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_LOGFILE, LOG_FILE);
        break;

      case E_USER_WARNING:
        // Write the error to our log file
        //error_log("Warning: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
        break;

      case E_USER_NOTICE:
        // Write the error to our log file
       // error_log("Notice: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
        break;

      default:
        // Write the error to our log file
        //error_log("Unknown error [#$errno]: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
        break;
    }*/

    // Don't execute PHP internal error handler
    return TRUE;
  }


  // Use set_error_handler() to tell PHP to use our method
  $old_error_handler = set_error_handler("my_error_handler");


?>

Ответ 7

Как говорили другие, отслеживание ошибок для отправки почты не возвращает логический результат добавления почты в исходящую очередь. Если вы хотите отслеживать неудачу успешного успеха, попробуйте использовать SMTP с почтовой библиотекой, такой как Swift Mailer, Zend_Mail или phpmailer.