web-dev-qa-db-fra.com

Comment puis-je détecter une erreur causée par mail ()?

Est-ce que quelqu'un sait comment puis-je détecter une erreur de messagerie (une erreur s'affiche lors de l'envoi d'un e-mail et l'erreur est causée par le serveur de messagerie en panne) dans php?

L'erreur qui a été causée par le serveur de messagerie vers le bas est ci-dessous:

<! - 2010-02-24T14: 26: 43 + 11: 00 AVIS (5): Erreur inattendue: mail () [<a href = 'function.mail'> function.mail </a>]: Échec de connectez-vous au serveur de messagerie sur le port "ip" portip, vérifiez vos paramètres "SMTP" et "smtp_port" dans php.ini ou utilisez ini_set () (# 2).
2010-02-24 14:26:43
Nom d'utilisateur: admin
Erreur dans la ligne 439 du fichier D:\test.php
Script: /customer.php
[Gestionnaire d'erreurs global]
->

28
Jin Yong

Voici ce que vous pouvez faire de mieux:

if (!mail(...)) {
   // Reschedule for later try or panic appropriately!
}

http://php.net/manual/en/function.mail.php

mail() renvoie TRUE si le courrier a été accepté avec succès, FALSE sinon.

Il est important de noter que le simple fait que le courrier ait été accepté pour la livraison ne signifie PAS que le courrier atteindra réellement la destination prévue.

Si vous devez supprimer les avertissements, vous pouvez utiliser:

if (!@mail(...))

Soyez toutefois prudent lorsque vous utilisez l'opérateur @ sans vérifier correctement si quelque chose réussit ou non.


Si les erreurs mail() ne sont pas supprimables (bizarre, mais ne peuvent pas le tester pour le moment), vous pourriez:

a) désactiver temporairement les erreurs:

$errLevel = error_reporting(E_ALL ^ E_NOTICE);  // suppress NOTICEs
mail(...);
error_reporting($errLevel);  // restore old error levels

b) utilisez un autre mailer, comme suggéré par fire et Mike .

Si mail() se révèle trop floconneux et rigide, je me pencherais sur b). Désactiver les erreurs rend le débogage plus difficile et généralement mauvais.

46
deceze

PHPMailer gère bien les erreurs, aussi un bon script à utiliser pour envoyer du courrier via SMTP ...

if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
} else {
  echo "Message sent!";
}
6
fire

également utiliser http://php.net/error_get_last ne vous aidera pas, car mail () n'émet pas ses erreurs dans cette fonction.

La seule façon semble être d'utiliser un bon mailer, comme déjà suggéré ci-dessus.

5
staabm

Selon http://php.net/manual/en/function.error-get-last.php , utilisez:

print_r(error_get_last());

Qui renverra un tableau de la dernière erreur générée. Vous pouvez accéder au [message] élément pour afficher l'erreur.

2
Dairy Window

Vous pouvez utiliser les classes et méthodes PEAR Mail , qui vous permettent de vérifier les erreurs via:

if (PEAR::isError($mail)) {
    echo("<p>" . $mail->getMessage() . "</p>");
} else {
    echo("<p>Message successfully sent!</p>");
}

Vous pouvez trouver un exemple ici .

1
Mike Trpcic