用PHPMailer处理错误

我正在尝试将PHPMailer用于一个小型项目,但是我对使用这个软件的error handling有点困惑。 希望有人有经验。 当我设置了一封电子邮件,我使用:

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

哪个工作正常,或多或less。 问题是,当出现错误时,PHPMailer似乎也会将错误回显出来,所以如果出现问题,它只是直接将该信息发送到浏览器,从而打破了我正在尝试执行的任何error handling。

有没有办法让这些消息沉默? 它没有抛出exception,它只是打印出错误,在我的testing案例是:

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

它的意思是一个错误,但它应该驻留在$ mail-> ErrorInfo; 没有被软件回显。

PHPMAiler使用exception。 尝试采用以下代码 :

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

只需要自己解决这个问题。 上面的答案似乎没有考虑到$mail->SMTPDebug = 0; 选项。 问题首次被问到时可能不可用。

如果你从PHPMail站点获得你的代码,默认将是$mail->SMTPDebug = 2; // enables SMTP debug information (for testing) $mail->SMTPDebug = 2; // enables SMTP debug information (for testing)

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

将该值设置为0以抑制错误,并按上面所述编辑代码的“catch”部分。

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

 $mail = new PHPMailer(true); 

如果你没有例外被忽略,你将得到的唯一的东西是来自例程的回声! 我知道这是创build后,但希望它会帮助某人。

您可以使用$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)激活的exception模型的替代方法。 但是如果可以使用exception模型,可以用@Phil Rykoff来回答。

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

我们编写了一个包装类来捕获缓冲区并将打印输出转换为exception。 这使我们可以升级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); } } 

即使你使用exception,它仍然会输出错误。
你必须将$ MailerDebug设置为False,这应该是这样的

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

这个工作正常

 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 } 

在PHPMailer.php中,有如下几行:

 echo $e->getMessage() 

只是评论这些线,你会很好去。

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

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