使用PHPMailer处理错误

时间:2010-03-05 12:11:57

标签: php 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;没有被软件回应。

9 个答案:

答案 0 :(得分:94)

PHPMAiler使用例外。尝试采用以下code

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!
}

答案 1 :(得分:17)

您可以使用方法$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答案。

这来自github https://github.com/PHPMailer/PHPMailer上的PHPMailer主页。

答案 2 :(得分:16)

我必须自己解决这个问题。以上答案似乎没有考虑到 $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”部分,如上所述。

答案 3 :(得分:16)

请注意!!!在实例化PHPMailer时必须使用以下格式!

$mail = new PHPMailer(true);

如果你没有忽略异常,你唯一得到的就是日常的回声!我知道这是在创建之后很好,但希望它会帮助某人。

答案 4 :(得分:4)

我们编写了一个包装类,它捕获缓冲区并将打印输出转换为异常。这让我们升级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);
    }
}

答案 5 :(得分:3)

即使您使用例外,它仍会输出错误。
您必须将$ MailerDebug设置为False,它应该如下所示

$mail = new PHPMailer();
$mail->MailerDebug = false;

答案 6 :(得分:2)

这个工作正常

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 
}

答案 7 :(得分:1)

在PHPMailer.php中,有如下行:

echo $e->getMessage()

只需对这些行进行评论,您就可以了。

答案 8 :(得分:0)

$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!';
}

处理电子邮件发送成功或失败的最简单方法......