web-dev-qa-db-fra.com

Comment puis-je obtenir le message d'erreur pour la fonction mail ()?

J'utilise la fonction PHP mail().

Si le courrier n'envoie pas pour une raison quelconque, j'aimerais faire écho au message d'erreur. Comment je ferais ça?

Quelque chose comme 

$this_mail = mail('[email protected]', 'My Subject', $message);

if($this_mail) echo 'sent!';
else echo error_message;

Merci!

60
Rohan

Vous pouvez utiliser error_get_last() when mail() renvoie false.

$success = mail('[email protected]', 'My Subject', $message);
if (!$success) {
    $errorMessage = error_get_last()['message'];
}

Avec print_r(error_get_last()), vous obtenez quelque chose comme ceci:

[type] => 2
[message] => mail (): Echec de la connexion au serveur de courrier électronique sur le port 25 "x.x.x.x", vérifiez les paramètres "SMTP" et "smtp_port" dans php.ini ou utilisez ini_set ()
[fichier] => C:\www\X\X.php
[ligne] => 2 

98
user2317245

l'envoi de courrier en php n'est pas un processus en une étape. mail () renvoie true/false, mais même s'il renvoie true, cela ne signifie pas que le message va être envoyé. tout mail () ajoute le message à la file (en utilisant sendmail ou tout ce que vous définissez dans php.ini)

il n'y a aucun moyen fiable de vérifier si le message a été envoyé en php. vous devrez parcourir les journaux du serveur de messagerie.

12
Sergey Eremin

Vous pouvez utiliser le mail/ PEAR , qui a la même interface, mais retourne une PEAR_Error en cas de problème.

3
amccausl

Dans mon cas, je ne pouvais pas obtenir le message d'erreur dans mon script PHP, quoi que je fasse (error_get_last() ou ini_set('display_errors',1);) ne pas afficher le message d'erreur

selon ce post

La valeur de retour de $ mail indique uniquement si votre Le système de messagerie du serveur a accepté le message pour la livraison et le fait. pas et ne peut en aucune manière savoir si vous fournissez ou non une valeur valide arguments. Par exemple, la valeur de retour serait false si sendmail n’a pas pu être chargé (s’il n’avait pas été installé correctement, par exemple) Renvoie true si sendmail est chargé correctement, mais que l'adresse du destinataire est n'existe pas.

Je le confirme car après quelques tentatives infructueuses d'utilisation de mail() dans mes scripts PHP, il s'avère que sendmail n'a pas été installé sur ma machine. Cependant, la variable php.ini sendmail_path était /usr/sbin/sendmail -t -i 

1- J'ai installé sendmail à partir de mon gestionnaire de paquets Shell> dnf install sendmail

2- Je l'ai commencé Shell> service sendmail start

3- Maintenant si une fonction PHP mail() échoue, je trouve les erreurs du programme sendmail consignées dans le répertoire /var/mail/. 1 fichier par utilisateur

Par exemple, cet extrait provient de mon fichier /var/mail/root

The original message was received at Sun, 29 Jul 2018 22:37:51 +0200
from localhost [127.0.0.1]
   ----- The following addresses had permanent fatal errors -----
<[email protected]>
    (reason: 550 Host unknown)

Mon système est Linux Fedora 28 avec Apache2.4 et PHP 7.2.

0
Accountant م
$e=error_get_last();
if($e['message']!==''){
    // An error function
}

error_get_last (); - renvoie la dernière erreur survenue

0
user5044606

Il n'y a pas de message d'erreur associé à la fonction mail(). Il y a seulement une true ou false renvoyée si le courrier électronique a été accepté pour la livraison. Non pas si elle est finalement livrée, mais essentiellement si le domaine existe et si l'adresse est une adresse électronique correctement formatée.

0
Joseph

Essaye ça. Si je reçois une erreur sur un fichier, je reçois un message d'erreur sur mon identifiant. Créez deux fichiers index.php et checkErrorEmail.php et les avez téléchargés sur votre serveur. Puis chargez index.php avec votre navigateur.

Index.php

<?php
    include('checkErrorEmail.php');
    include('dereporting.php');
    $temp;
    echo 'hi '.$temp;
?>

checkErrorEmail.php

<?php
  // Destinations
  define("ADMIN_EMAIL", "[email protected]");
  //define("LOG_FILE", "/my/home/errors.log");

  // Destination types
  define("DEST_EMAIL", "1");
  //define("DEST_LOGFILE", "3");

  /* Examples */

  // Send an e-mail to the administrator
  //error_log("Fix me!", DEST_EMAIL, ADMIN_EMAIL);

  // Write the error to our log file
  //error_log("Error", DEST_LOGFILE, LOG_FILE);

  /**
    * my_error_handler($errno, $errstr, $errfile, $errline)
    *
    * Author(s): thanosb, ddonahue
    * Date: May 11, 2008
    * 
    * custom error handler
    *
    * Parameters:
    *  $errno:   Error level
    *  $errstr:  Error message
    *  $errfile: File in which the error was raised
    *  $errline: Line at which the error occurred
    */

  function my_error_handler($errno, $errstr, $errfile, $errline)
  {  
  echo "<br><br><br><br>errno ".$errno.",<br>errstr ".$errstr.",<br>errfile ".$errfile.",<br>errline ".$errline;
      if($errno)
      {
              error_log("Error: $errstr \n error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL);
      }
    /*switch ($errno) {
      case E_USER_ERROR:
        // Send an e-mail to the administrator
        error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL);

        // Write the error to our log file
        //error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_LOGFILE, LOG_FILE);
        break;

      case E_USER_WARNING:
        // Write the error to our log file
        //error_log("Warning: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
        break;

      case E_USER_NOTICE:
        // Write the error to our log file
       // error_log("Notice: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
        break;

      default:
        // Write the error to our log file
        //error_log("Unknown error [#$errno]: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE);
        break;
    }*/

    // Don't execute PHP's internal error handler
    return TRUE;
  }


  // Use set_error_handler() to tell PHP to use our method
  $old_error_handler = set_error_handler("my_error_handler");


?>
0
Pradeep