web-dev-qa-db-fra.com

Traitement des erreurs avec PHPMailer

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.

43
Stomped

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!
}
98
Phil Rykoff

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 .

20
PhoneixS

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.

16
PhilMDev

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.

16
Simon Roberts

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);
    }
}
4
Charlie Shehadi

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;
3
Fred

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 
}
2
Patdundee

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.

1
Haris ur Rehman
$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 ...

0
Prince-W