Обработка ошибок с помощью PHPMailer

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

$result = $mail->Send();

if(!$result) {
    // There was an error
    // Do some error handling things here
} else {
    echo "Email successful";
}

Что работает нормально, более или менее. Проблема в том, что когда возникает ошибка, PHPMailer, похоже, также выводит ошибку, поэтому, если есть проблема, он просто отправляет эту информацию прямо в браузер, по существу нарушая любую обработку ошибок, которую я пытаюсь сделать.

Есть ли способ отключить эти сообщения? Он не генерирует исключение, он просто распечатывает ошибку, которая в моем тестовом примере:

invalid address: @invalid@email You must provide at least one recipient email address.

Предполагается, что это ошибка, но она должна находиться в $ mail-> ErrorInfo; не выводятся программным эхом.


person Stomped    schedule 05.03.2010    source источник


Ответы (9)


PHPMailer использует исключения. Попробуйте использовать следующий код:

require_once '../class.phpmailer.php';

$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch

try {
  $mail->AddReplyTo('[email protected]', 'First Last');
  $mail->AddAddress('[email protected]', 'John Doe');
  $mail->SetFrom('[email protected]', 'First Last');
  $mail->AddReplyTo('[email protected]', 'First Last');
  $mail->Subject = 'PHPMailer Test Subject via mail(), advanced';
  $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  $mail->MsgHTML(file_get_contents('contents.html'));
  $mail->AddAttachment('images/phpmailer.gif');      // attachment
  $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
  $mail->Send();
  echo "Message Sent OK\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}
person Phil Rykoff    schedule 05.03.2010
comment
Я уже пробовал ловить это с помощью исключений, часть, которую я пропустил, была new PHPMailer(true), которая фактически разрешает исключения. Спасибо за помощь. - person Stomped; 05.03.2010
comment
для меня .. в этих строках есть ошибки .. $ mail- ›MsgHTML (file_get_contents ('contents.html')); $ mail- ›AddAttachment ('images / phpmailer.gif'); // вложение $ mail- ›AddAttachment ('images / phpmailer_mini.gif'); // вложение как это исправить .. спасибо .. - person pcs; 28.05.2015
comment
Это не хорошо. Даже при обработке исключений вы все равно должны помещать "Message Sent OK\n"confirmation внутри условного выражения, иначе это приведет к вводящим в заблуждение подтверждениям о том, что все в порядке, когда на самом деле что-то пошло не так. Так что используйте, например: if ( $mail->Send() ) {echo "E-mail sent OK<br>"; } - person Fabien Snauwaert; 19.08.2017
comment
Используя этот код, при успешной отправке почты они вернут 'Resource id # 7' с нашим сообщением об успешном завершении. любое решение? - person Mitul Koradiya; 11.06.2019
comment
@Fabien Фактически, выдача ошибки означает, что строка Message Sent OK не будет достигнута - person Geoff Kendall; 16.06.2019
comment
@GeoffKendall Если Send() завершается неудачно, не вызывая исключения ошибки, что может, тогда будет показано сообщение «ОК \ n отправлено», что вводит в заблуждение. Отсюда мой комментарий. - person Fabien Snauwaert; 16.06.2019
comment
В конструкторе мы предоставили параметр true, который заставляет PHPMailer генерировать исключения в случае ошибок. Только если он будет установлен в false (по умолчанию), send может вернуть false без выброса Exception. Если вы мне не доверяете, также посмотрите код :-) Извините, на ответ ушло 2 года ... - person Phil Rykoff; 21.06.2019
comment
Согласно официальным примерам мы должны использовать Exception $e и \Exception $e. Первый - от PHPMailer, а второй - глобальный. github.com/PHPMailer/PHPMailer/blob/master/examples/ - person Jette; 15.04.2021

Дополнительную информацию об ошибке можно получить с помощью метода $mail->ErrorInfo. Например:

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

Это альтернатива модели исключений, которую необходимо активировать с new PHPMailer(true). Но если вы можете использовать модель исключения, используйте ее как ответ @Phil Rykoff.

Это происходит с главной страницы PHPMailer на github https://github.com/PHPMailer/PHPMailer.

person PhoneixS    schedule 07.07.2015
comment
Мне это нравится, потому что вам не нужно передавать аргументы конструктора или перехватывать исключения. - person Konrad Gałęzowski; 19.06.2017

Пожалуйста, обрати внимание!!! При создании экземпляра PHPMailer необходимо использовать следующий формат!

$mail = new PHPMailer(true);

Если вы этого не сделаете, исключения будут проигнорированы, и единственное, что вы получите, - это эхо от рутины! Я знаю, что это хорошо после того, как это было создано, но, надеюсь, это кому-то поможет.

person PhilMDev    schedule 21.11.2013
comment
@WOUNDEDStevenJones Я боролся с принятым ответом. Возможно, я недостаточно внимательно читаю, но в любом случае этот ответ мне помог. - person Goose; 28.06.2016

Просто пришлось исправить это самому. Приведенные выше ответы, похоже, не учитывают параметр $mail->SMTPDebug = 0;. Возможно, он не был доступен, когда вопрос был задан впервые.

Если вы получили свой код с сайта PHPMail, по умолчанию будет $mail->SMTPDebug = 2; // enables SMTP debug information (for testing)

https://github.com/Synchro/PHPMailer/blob/master/examples/test_smtpanced_google / а>

Установите значение 0, чтобы подавить ошибки и отредактировать «перехватывающую» часть вашего кода, как описано выше.

person Simon Roberts    schedule 29.03.2013
comment
Если это по-прежнему не работает, выберите $mail->SMTPDebug = 4; - это покажет каждый шаг, выполняемый PHPMailer. - person Mave; 02.02.2015

Мы написали класс-оболочку, которая захватывает буфер и преобразует вывод на печать в исключение. это позволяет нам обновлять файл phpmailer без необходимости не забывать комментировать операторы эха при каждом обновлении.

Класс-оболочка имеет методы примерно следующего вида:

public function AddAddress($email, $name = null) {
    ob_start();
    parent::AddAddress($email, $name);
    $error = ob_get_contents();
    ob_end_clean();
    if( !empty($error) ) {
        throw new Exception($error);
    }
}
person Charlie Shehadi    schedule 25.01.2011

Даже если вы используете исключения, он все равно выводит ошибки.
Вы должны установить для $ MailerDebug значение False, что должно выглядеть следующим образом

$mail = new PHPMailer();
$mail->MailerDebug = false;
person Fred    schedule 14.04.2011
comment
Замечу, что это было удалено: Версия 1.25 (понедельник, 2 июля 2001 г.) * Добавлена ​​улучшенная обработка ошибок путем добавления переменной $ ErrorInfo * Удалена переменная MailerDebug (устарела с новым обработчиком ошибок) - person John Magnolia; 09.10.2012

Этот отлично работает

use try { as above

use Catch as above but comment out the echo lines
} catch (phpmailerException $e) { 
//echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {   
//echo $e->getMessage(); //Boring error messages from anything else!
}

Затем добавьте это

if ($e) {
//enter yor error message or redirect the user
} else {
//do something else 
}
person Patdundee    schedule 30.05.2011

В PHPMailer.php есть строки, как показано ниже:

echo $e->getMessage()

Просто прокомментируйте эти строки, и все будет хорошо.

person Haris ur Rehman    schedule 27.04.2012

$mail = new PHPMailer();

$mail->AddAddress($email); 
$mail->From     = $from;
$mail->Subject  = $subject; 
$mail->Body     = $body;

if($mail->Send()){
    echo 'Email Successfully Sent!';
}else{
    echo 'Email Sending Failed!';
}

самый простой способ обработать успешную или неудачную отправку электронной почты ...

person Prince-W    schedule 30.10.2012
comment
Вы должны добавить $ mail- ›ErrorInfo в else case, чтобы отображать ошибки. - person Westy92; 12.06.2013
comment
Это отправная точка исходного вопроса - вопрос задается только потому, что этого недостаточно. - person pgr; 04.09.2017