2016-10-21 4 views
1

Я создал простую таблицу log, где я вставляю записи, если письма не были отправлены.Не удалось получить полный журнал ошибок SMTP PHP mailer

mysql> describe log; 
+--------+-----------+------+-----+---------------------+-----------------------------+ 
| Field | Type  | Null | Key | Default    | Extra      | 
+--------+-----------+------+-----+---------------------+-----------------------------+ 
| id_log | int(11) | NO | PRI | NULL    | auto_increment    | 
| error | text  | YES |  | NULL    |        | 
| time | timestamp | NO |  | 0000-00-00 00:00:00 | on update CURRENT_TIMESTAMP | 
+--------+-----------+------+-----+---------------------+-----------------------------+ 

И на моей стороне PHP, протоколирование ошибок, как это:

foreach ($arrayWithMails as $key => $value) { 
     $mail->addAddress($value); 
     if (!$mail->send()) 
     { 
      put('message', $mail->ErrorInfo); //store in session 
//   echo $mail->ErrorInfo; 

     } 
     else { 
      /* Add email from array in session to be displayed at main page */ 
      put('emailAddresses', $arrayWithMails); //Store in session 

     } 
     $mail->ClearAllRecipients(); 
    } 
$log->logError($_SESSION['message']); 

Он вызывает метод в моем классе, который проходит строку в качестве параметра, и вставляет в БД.

Однако все мои журналы ищут так:

mysql> select * from log; 
+--------+------------------------------------------------------------------------------------+---------------------+ 
| id_log | error                    | time    | 
+--------+------------------------------------------------------------------------------------+---------------------+ 
|  1 | SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting | 2016-10-21 15:08:30 | 
|  2 | 1                     | 2016-10-21 15:12:04 | 
|  3 | 1                     | 2016-10-21 15:13:42 | 
|  4 | SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting | 2016-10-21 15:14:14 | 
|  5 | SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting | 2016-10-21 15:17:02 | 
|  6 | SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting | 2016-10-21 15:18:22 | 
|  7 | SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting | 2016-10-21 15:28:02 | 
|  8 | SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting | 2016-10-21 15:28:53 | 
+--------+------------------------------------------------------------------------------------+---------------------+ 

И мой SMTP отладки установлен в 4. Пробовал с 2, а также - те же результаты.

Если f.e. Я делаю базовое эхо $mail->ErrorInfo. Я получаю полный журнал с ошибками, но когда я хочу сохранить эту полную информацию о журнале в БД, я получаю только: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting То же самое происходит, если я попытаюсь сохранить эту ошибку в $ _SESSION var.

Любая идея, как хранить полный журнал? Спасибо!

ответ

1

ErrorInfo содержит только сообщение об ошибке, а не полный журнал отладки. Отладочный вывод - это то, что по умолчанию он сбрасывается на stdout, а не сохраняется.

Чтобы захватить его, вам необходимо посмотреть свойство Debugoutput - в последних версиях PHPMailer вы можете установить это на вызываемый, который вы можете использовать для сбора отладочного вывода и вставки его в свою БД.

Например:

//Before sending 
$debuglog = ''; 
$mail->Debugoutput = function($str, $level) use ($debuglog) { 
    $debuglog .= $str; 
}; 

//... after calling send() 
$log->logError($mail->Errorinfo . ' ' . $debuglog); 
+0

привет и спасибо за помощь. Я не уверен, как реализовать свое решение в моем коде. Я отредактировал свой вопрос. – fugitive

0

Это покрывает мой ответ. Я расширяю PHPMailer, и я включил, что он будет генерировать исключения, поэтому таким образом я получаю сообщение об исключении должным образом.

foreach ($array as $key => $value) { 
    $mail->addAddress($value); 
    try 
    { 
     if (!$mail->send()) { 
      put('message', $mail->ErrorInfo); // Storing for frontend, that error exist, for detailed info - log is in DB 

     } 
     else { 
      /* Add email from array in session to be displayed at main page */ 
      put('emailAddresses', $array); 
     } 
    } catch (phpmailerException $exc) 
    { 
     $debugError = $exc->errorMessage(); 
    } 

    $mail->ClearAllRecipients(); 
} 
$log->logError($debugError); 
+0

Этот подход не поможет вам, потому что сообщение в исключении будет таким же, как в ErrorInfo. – Synchro

+0

@Synchro nop mate, я получаю этот вывод, например: 'select * from log; + -------- + ------------------------------------- + - -------------------- + | id_log | ошибка | время | + -------- + ------------------------------------- + - -------------------- + | 77 | Ошибка SMTP: не удалось выполнить проверку подлинности. | 2016-10-21 18:51:42 | + -------- + ------------------------------------- + - -------------------- + ' – fugitive

+0

Но это не транскрипт, о котором вы просили? – Synchro

Смежные вопросы