Php mail get error

Управление выводом ошибок 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)); >>

Стоит учесть что оператор управления ошибками (знак @) работать в данном случаи не будет и письмо будет отправляться при каждой ошибке.

Читайте также:  Jupiter notebook python запустить

Второй метод использует «пользовательский обработчик ошибок», поэтому в браузер ошибки выводится не будут.

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

Источник

Читайте также:  Html код поисковых форм

Получить полное сообщение об ошибке из 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).

Читайте также:  Дата начала текущего месяца php

Источник

Оцените статью