Как я могу получить сообщение об ошибке для функции mail()?
Я использую функцию PHP mail()
.
Если почта по какой-либо причине не отправляется, я хотел бы повторить сообщение об ошибке. Как мне это сделать?
Что-то вроде
$this_mail = mail('[email protected]', 'My Subject', $message);
if($this_mail) echo 'sent!';
else echo error_message;
Спасибо!
Ответы
Ответ 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.