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!
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
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.
Vous pouvez utiliser le mail/ PEAR , qui a la même interface, mais retourne une PEAR_Error en cas de problème.
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.
$e=error_get_last();
if($e['message']!==''){
// An error function
}
error_get_last (); - renvoie la dernière erreur survenue
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.
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");
?>