- Управление выводом ошибок PHP
- Вывод ошибок в браузере
- В htaccess
- Запись ошибок в лог файл
- Отправка ошибок на e-mail
- Пользовательские ошибки
- Результат:
- How to get error info on sending email with PHPMailer in PHP
- How to get error info on sending email with PHPMailer in PHP
- Получить полное сообщение об ошибке из PHPMailer Exception
- Решение
- Другие решения
Управление выводом ошибок PHP
PHP предлагает гибкие настройки вывода ошибок, среди которых функия error_reporting($level) – задает, какие ошибки PHP попадут в отчет, могут быть значения:
- E_ALL – все ошибки,
- E_ERROR – критические ошибки,
- E_WARNING – предупреждения,
- E_PARSE – ошибки синтаксиса,
- E_NOTICE – замечания,
- E_CORE_ERROR – ошибки обработчика,
- E_CORE_WARNING – предупреждения обработчика,
- E_COMPILE_ERROR – ошибки компилятора,
- E_COMPILE_WARNING – предупреждения компилятора,
- E_USER_ERROR – ошибки пользователей,
- E_USER_WARNING – предупреждения пользователей,
- E_USER_NOTICE – уведомления пользователей.
Вывод ошибок в браузере
error_reporting(E_ALL); ini_set('display_errors', 'On');
В htaccess
php_value error_reporting "E_ALL" php_flag display_errors On
На рабочем проекте вывод ошибок лучше сделать только у авторизированного пользователя или в крайнем случаи по IP.
Запись ошибок в лог файл
error_reporting(E_ALL); ini_set('display_errors', 'Off'); ini_set('log_errors', 'On'); ini_set('error_log', $_SERVER['DOCUMENT_ROOT'] . '/logs/php-errors.log');
Файлы логов также не должны быть доступны из браузера, храните их в закрытой директории с файлом .htaccess:
Order Allow,Deny Deny from all
Или запретить доступ к файлам по расширению .log (заодно и другие системные файлы и исходники):
Order Allow,Deny Deny from all
Отправка ошибок на e-mail
Ошибки можно отправлять на е-mail разработчика, но приведенные методы не работает при критических ошибках.
Первый – register_shutdown_function() регистрирует функцию, которая выполнится при завершении работы скрипта, error_get_last() получает последнюю ошибку.
register_shutdown_function('error_alert'); function error_alert() < $error = error_get_last(); if (!empty($error)) < mail('mail@example.com', 'Ошибка на сайте example.com', print_r($error, true)); >>
Стоит учесть что оператор управления ошибками (знак @) работать в данном случаи не будет и письмо будет отправляться при каждой ошибке.
Второй метод использует «пользовательский обработчик ошибок», поэтому в браузер ошибки выводится не будут.
function error_alert($type, $message, $file, $line, $vars) < $error = array( 'type' =>$type, 'message' => $message, 'file' => $file, 'line' => $line ); error_log(print_r($error, true), 1, 'mail@example.com', 'From: mail@example.com'); > set_error_handler('error_alert');
Пользовательские ошибки
PHP позволяет разработчику самому объявлять ошибки, которые выведутся в браузере или в логе. Для создания ошибки используется функция trigger_error() :
trigger_error('Пользовательская ошибка', E_USER_ERROR);
Результат:
Fatal error: Пользовательская ошибка in /public_html/script.php on line 2
- E_USER_ERROR – критическая ошибка,
- E_USER_WARNING – не критическая,
- E_USER_NOTICE – сообщения которые не являются ошибками,
- E_USER_DEPRECATED – сообщения о устаревшем коде.
How to get error info on sending email with PHPMailer in PHP
How to get error info on sending email with PHPMailer in PHP
I am using PHPMailer to send emails with the SMTP server in PHP. But, the emails are not sending and the error message is not showing. I want to get the error info from PHPMailer to know about the issue with sending emails.
Suggest the best method for error handling with PHPMailer.
Asked: Jan 22,2022 In: PHP
Use try & catch block to handle errors with PHPMailer in PHP.
use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; $mail = new PHPMailer(true); try < //Server settings $mail->SMTPDebug = SMTP::DEBUG_SERVER; $mail->isSMTP(); $mail->Host = 'smtp.example.com'; $mail->SMTPAuth = true; $mail->Username = 'user@example.com'; $mail->Password = 'secret'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; //Recipients $mail->setFrom('from@example.com', 'Mailer'); $mail->addAddress('joe@example.net', 'Joe User'); //Content $mail->isHTML(true); $mail->Subject = 'Email subject'; $mail->Body = 'Your email message'; $mail->send(); echo 'Message has been sent'; > catch (Exception $e) < echo "Message could not be sent. Mailer Error: ErrorInfo>"; >
You can also use the $mail->ErrorInfo method to display error info from the PHPMailer library.
if(!$mail->send()) < echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; > else
Получить полное сообщение об ошибке из PHPMailer Exception
SMTP -> ОТ СЕРВЕРА: 250-smtp.gmail.com к вашим услугам, [122.164.189.101] 250-РАЗМЕР 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
SMTP -> ОШИБКА: пароль не принят с сервера: 535-5.7.8 Имя пользователя и пароль не приняты. Узнайте больше на
535 5,7,8 https://support.google.com/mail/?p=BadCredentials n3sm27565307paf.13 — gsmtp
SMTP -> ОТ СЕРВЕРА: 250 2.1.5 Flushed n3sm27565307paf.13 — gsmtp
Как я могу сохранить вышеупомянутое сообщение в переменной? Пожалуйста, кто-нибудь может помочь мне получить это полное сообщение
Решение
После настройки $mail->SMTPDebug = 2; необходимо создать функцию обратного вызова и назначить ее $mail->Debugoutput , В этой функции вы можете назначить выходные данные отладки переменной. Вот документация на эту тему: http://phpmailer.github.io/PHPMailer/classes/PHPMailer.PHPMailer.PHPMailer.html#property_Debugoutput
Пожалуйста, обратите внимание: Ваша функция обратного вызова будет вызываться один раз на строку вывода отладки (в отличие от однократного для всех выводов отладки в строке ошибки), поэтому вам придется добавлять каждую строку в вашу переменную. Если вы просто назначите его, вы получите только последнюю строку вывода отладки, которая часто является той же самой информацией, которая находится в $ mail-> ErrorInfo или исключении.
Я предпочитаю делать что-то вроде этого:
$GLOBALS['debugOutput'] = []; $mail->Debugoutput = function($debugOutputLine, $level) < $GLOBALS['debugOutput'][] = $debugOutputLine; >; //. Put your mail code here that could cause an error $debug_output = implode("\n", $GLOBALS['debugOutput']); echo $debugOutput;
Это должно распечатать ту же информацию, что и в вашем примере.
Другие решения
Кроме того, вы можете получить больше информации об ошибке с помощью метода
if(!$mail->send()) < echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; > else
Это альтернатива модели исключений, которую вам нужно активировать с новым PHPMailer (true).