Обработка ошибок с помощью PHPMailer
Я пытаюсь использовать PHPMailer для небольшого проекта, но я немного запутался в обработке ошибок с помощью этого программного обеспечения. Надеюсь, что у кого-то есть опыт. Когда я настроил электронную почту, и я использую:
$result = $mail->Send();
if(!$result) {
// There was an error
// Do some error handling things here
} else {
echo "Email successful";
}
Что работает отлично, более или менее. Проблема в том, что когда есть ошибка, PHPMailer также, похоже, повторяет ошибку, поэтому, если есть проблема, она просто отправляет эту информацию непосредственно в браузер, существенно нарушая любую обработку ошибок, которую я пытаюсь сделать.
Есть ли способ отключить эти сообщения? Он не бросает исключение, просто распечатывает ошибку, которая в моем тестовом случае:
invalid address: @[email protected] You must provide at least one recipient email address.
Он должен быть ошибкой, но он должен находиться в $mail- > ErrorInfo; не будучи эхом от программного обеспечения.
Ответы
Ответ 1
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!
}
Ответ 2
Просто нужно было это исправить. Вышеприведенные ответы, похоже, не учитывают
$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
Обратите внимание! Вы должны использовать следующий формат при создании PHPMailer!
$mail = new PHPMailer(true);
Если вы не делаете исключений, игнорируются, и единственное, что вы получите, - это эхо от рутины! Я знаю, что это хорошо после того, как это было создано, но, надеюсь, это поможет кому-то.
Ответ 4
Вы можете получить дополнительную информацию об ошибке с помощью метода $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.
Ответ 5
Мы написали класс-оболочку, который захватывает буфер и преобразует печатный результат в исключение. это позволяет нам обновлять файл 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);
}
}
Ответ 6
Даже если вы используете исключения, он все равно выводит ошибки.
Вы должны установить $MailerDebug в False, который должен выглядеть так:
$mail = new PHPMailer();
$mail->MailerDebug = false;
Ответ 7
Это хорошо работает
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
}
Ответ 8
В PHPMailer.php есть строки, как показано ниже:
echo $e->getMessage()
Просто прокомментируйте эти строки, и вам будет хорошо идти.
Ответ 9
$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!';
}
Самый простой способ обработки электронной почты успешно или неудачно...