Обработка ошибок с PHPMailer - PullRequest
42 голосов
/ 05 марта 2010

Я пытаюсь использовать 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, не поддерживается программным обеспечением.

Ответы [ 9 ]

95 голосов
/ 05 марта 2010

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('name@yourdomain.com', 'First Last');
  $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
  $mail->SetFrom('name@yourdomain.com', 'First Last');
  $mail->AddReplyTo('name@yourdomain.com', '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!
}
19 голосов
/ 07 июля 2015

Более подробную информацию об ошибке можно получить с помощью метода $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.

16 голосов
/ 21 ноября 2013

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

$mail = new PHPMailer(true);

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

16 голосов
/ 29 марта 2013

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

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

https://github.com/Synchro/PHPMailer/blob/master/examples/test_smtp_gmail_advanced.php

Установите значение 0, чтобы подавить ошибки и отредактируйте часть кода catch, как описано выше.

4 голосов
/ 25 января 2011

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

Класс-обертка имеет методы, которые выглядят примерно так:

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);
    }
}
3 голосов
/ 14 апреля 2011

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

$mail = new PHPMailer();
$mail->MailerDebug = false;
2 голосов
/ 30 мая 2011

Этот работает нормально

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 
}
1 голос
/ 27 апреля 2012

В PHPMailer.php есть следующие строки:

echo $e->getMessage()

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

0 голосов
/ 30 октября 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!';
}

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

...