Я использую класс PHPMailer для отправки почты smtp, но мне нужно отследить журнал из PHPmailerException в таблице MySQL,
Код:
$mail = new PHPMailer(true);
try {
$mail->Host =$dmmodel->host;
$mail->Username= $dmmodel->username;
$mail->Password= $dmmodel->password;
$mail->Mailer='smtp';
$mail->Port=$dmmodel->port;
$mail->SMTPAuth = true;
$mail->SMTPSecure = ($dmmodel->smtp_enableSSL==1?'ssl':($dmmodel->smtp_enableSSL==2 ? 'tls':''));
$mail->SMTPDebug = 2;
$mail->From = $dmmodel->email_from;
$mail->FromName = $dmmodel->name_from;
$mail->Subject = $this->getContentBody($docmodel->content_subject,$docmodel->crm_base_contact_id,$_POST["taskid"],$postcode,$recall_by,$recall_dt,true);
$mail->AddAddress($email[$i]);
$mail->IsHTML(true);
}
catch (phpmailerException $e)
{
$msg = "Email Delivery failed -" . $e->errorMessage();
echo "Email not sent";
}
Где переменная $ msg содержит только сообщение «Ошибка SMTP: не удалось аутентифицироваться»
но когда я ставлю оповещение, я получаю полное сообщение (как показано ниже) причину этой проблемы,
SMTP -> ОТ СЕРВЕРА: 220 smtp.gmail.com ESMTP n3sm27565307paf.13 — gsmtp
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;
Это должно распечатать ту же информацию, что и в вашем примере.
Ты можешь попробовать:
этот:
$mail->SMTPDEbug = 4;
вместо
$mail->SMTPDebug = 2;
Кроме того, вы можете получить больше информации об ошибке с помощью метода
$mail->ErrorInfo
,
Например:
if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent';
}
Это альтернатива модели исключений, которую вам нужно активировать с новым PHPMailer (true).