J'essaie d'utiliser PHPMailer pour un petit projet, mais je suis un peu confus quant à la gestion des erreurs avec ce logiciel. En espérant que quelqu'un en a fait l'expérience. Quand j'ai configuré un email et que j'utilise:
$result = $mail->Send();
if(!$result) {
// There was an error
// Do some error handling things here
} else {
echo "Email successful";
}
Ce qui fonctionne bien, plus ou moins. Le problème, c’est qu’en cas d’erreur, PHPMailer semble également faire écho à cette erreur. Par conséquent, s’il ya un problème, il envoie ces informations directement au navigateur, interrompant ainsi essentiellement le traitement des erreurs que je tente de faire.
Existe-t-il un moyen de faire taire ces messages? Il ne s'agit pas d'une exception, mais d'une erreur, qui dans mon cas de test est:
invalid address: @invalid@email You must provide at least one recipient email address.
C'est censé être une erreur, mais il devrait résider dans $ mail-> ErrorInfo; ne pas être répercuté par le logiciel.
PHPMAiler utilise des exceptions. Essayez d’adopter ce qui suit 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('[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!
}
Vous pouvez obtenir plus d'informations sur l'erreur avec la méthode $mail->ErrorInfo
. Par exemple:
if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent';
}
C'est une alternative au modèle d'exception que vous devez activer avec new PHPMailer(true)
. Mais si peut utiliser un modèle d'exception, utilisez-le comme réponse @Phil Rykoff.
Cela provient de la page principale de PHPMailer sur github https://github.com/PHPMailer/PHPMailer .
Notez s'il vous plaît!!! Vous devez utiliser le format suivant pour instancier PHPMailer!
$mail = new PHPMailer(true);
Si vous ne le faites pas, les exceptions sont ignorées et la seule chose que vous obtiendrez est un écho de la routine! Je sais que c'est bien après sa création, mais j'espère que cela aidera quelqu'un.
Juste avoir à résoudre ce problème moi-même. Les réponses ci-dessus ne semblent pas prendre en compte l'option $mail->SMTPDebug = 0;
. Il n'était peut-être pas disponible lorsque la question a été posée pour la première fois.
Si vous avez obtenu votre code sur le site PHPMail, la valeur par défaut sera $mail->SMTPDebug = 2; // enables SMTP debug information (for testing)
https://github.com/Synchro/PHPMailer/blob/master/examples/test_smtp_gmail_advanced.php
Définissez la valeur sur 0 pour supprimer les erreurs et modifiez la partie "interceptée" de votre code comme expliqué ci-dessus.
Nous avons écrit une classe wrapper qui capture le tampon et convertit la sortie imprimée en une exception. Cela nous permet de mettre à jour le fichier phpmailer sans avoir à nous rappeler de commenter les instructions echo à chaque mise à jour.
La classe wrapper a pour méthodes quelque chose comme:
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);
}
}
Même si vous utilisez des exceptions, des erreurs sont toujours générées.
Vous devez définir $ MailerDebug sur False qui devrait ressembler à ceci
$mail = new PHPMailer();
$mail->MailerDebug = false;
Celui-ci fonctionne bien
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!
}
Puis ajoutez ceci
if ($e) {
//enter yor error message or redirect the user
} else {
//do something else
}
Dans PHPMailer.php, il y a des lignes comme ci-dessous:
echo $e->getMessage()
Il suffit de commenter ces lignes et vous serez prêt à partir.
$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!';
}
le moyen le plus simple de gérer les envois de mails réussis ou échoués ...