用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!'; }
处理电子邮件发送成功或失败的最简单的方法…