Bien que certaines parties de cette réponse s'appliquent uniquement à l'utilisation de la mail()
fonction elle-même, bon nombre de ces étapes de dépannage peuvent être appliquées à n'importe quel système de messagerie PHP.
Il existe diverses raisons pour lesquelles votre script ne semble pas envoyer d’e-mails. Il est difficile de diagnostiquer ces choses sauf en cas d'erreur de syntaxe évidente. Sans celui-ci, vous devez parcourir la liste de contrôle ci-dessous pour trouver les pièges potentiels que vous pourriez rencontrer.
Assurez-vous que le rapport d'erreurs est activé et configuré pour signaler toutes les erreurs
Le rapport d'erreurs est essentiel pour éliminer les bogues dans votre code et les erreurs générales rencontrées par PHP. Le rapport d'erreurs doit être activé pour recevoir ces erreurs. Le fait de placer le code suivant en haut de vos fichiers PHP (ou dans un fichier de configuration principal) activera le rapport d'erreurs.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
Voir Comment puis-je obtenir des messages d'erreur utiles en PHP? - cette réponse pour plus de détails à ce sujet.
Assurez-vous que la mail()
fonction est appelée
Cela peut sembler idiot, mais une erreur courante consiste à oublier de placer réellement la mail()
fonction dans votre code. Assurez-vous qu'il est là et non commenté.
Assurez-vous que la mail()
fonction est appelée correctement
bool mail (string $ to, string $ subject, string $ message [, string $ additional_headers [, string $ additional_parameters]])
La fonction de messagerie prend trois paramètres obligatoires et éventuellement un quatrième et un cinquième. Si votre appel à mail()
n'a pas au moins trois paramètres, il échouera.
Si votre appel à mail()
n'a pas les bons paramètres dans le bon ordre, il échouera également.
Vérifiez les journaux de messagerie du serveur
Votre serveur Web doit consigner toutes les tentatives d'envoi d'e-mails via celui-ci. L'emplacement de ces journaux variera (vous devrez peut-être demander à votre administrateur de serveur où ils se trouvent), mais ils peuvent généralement être trouvés dans le répertoire racine d'un utilisateur sous logs
. À l'intérieur, des messages d'erreur signalés par le serveur, le cas échéant, liés à vos tentatives d'envoi d'e-mails.
Vérifier l'échec de la connexion au port
Le bloc de ports est un problème très courant auquel la plupart des développeurs sont confrontés lors de l'intégration de leur code pour envoyer des e-mails à l'aide de SMTP. Et cela peut être facilement retracé au niveau des serveurs maillogs (l'emplacement du serveur du journal de messagerie peut varier d'un serveur à l'autre, comme expliqué ci-dessus). Si vous êtes sur un serveur d'hébergement partagé, les ports 25 et 587 restent bloqués par défaut. Ce blocage a été fait exprès par votre hébergeur. Cela est vrai même pour certains des serveurs dédiés. Lorsque ces ports sont bloqués, essayez de vous connecter en utilisant le port 2525. Si vous trouvez que ce port est également bloqué, alors la seule solution est de contacter votre hébergeur pour débloquer ces ports.
La plupart des hébergeurs bloquent ces ports de messagerie pour protéger leur réseau contre l'envoi de spam.
Utilisez les ports 25 ou 587 pour les connexions standard / TLS et le port 465 pour les connexions SSL. Pour la plupart des utilisateurs, il est suggéré d'utiliser le port 587 pour éviter les limites de débit fixées par certains hébergeurs.
N'utilisez pas l'opérateur de suppression d'erreur
Lorsque l' opérateur de suppression d'erreur @
est ajouté à une expression en PHP, tous les messages d'erreur qui pourraient être générés par cette expression seront ignorés. Il y a des circonstances où l'utilisation de cet opérateur est nécessaire mais l'envoi de courrier n'en fait pas partie.
Si votre code contient, @mail(...)
vous pouvez masquer des messages d'erreur importants qui vous aideront à déboguer cela. Retirez le @
et voyez si des erreurs sont signalées.
Il n'est conseillé que lorsque vous vérifiezerror_get_last()
immédiatement après pour les défaillances concrètes.
Vérifiez la mail()
valeur de retour
La mail()
fonction:
Retourne TRUE
si le courrier a été accepté avec succès pour la livraison, 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.
Ceci est important à noter car:
- Si vous recevez une
FALSE
valeur de retour, vous savez que l'erreur réside dans le fait que votre serveur accepte votre courrier. Ce n'est probablement pas un problème de codage mais un problème de configuration du serveur. Vous devez parler à votre administrateur système pour savoir pourquoi cela se produit.
- Si vous recevez une
TRUE
valeur de retour, cela ne signifie pas que votre e-mail sera définitivement envoyé. Cela signifie simplement que l'e-mail a été envoyé avec succès à son gestionnaire respectif sur le serveur par PHP. Il y a encore plus de points de défaillance hors du contrôle de PHP qui peuvent empêcher l'envoi de l'e-mail.
Cela FALSE
vous aidera donc à vous orienter dans la bonne direction, ce TRUE
qui ne signifie pas nécessairement que votre e-mail a bien été envoyé. Ceci est important à noter!
Assurez-vous que votre hébergeur vous autorise à envoyer des e-mails et ne limite pas l'envoi de courrier
De nombreux hébergeurs partagés, en particulier les hébergeurs gratuits, n'autorisent pas l'envoi d'e-mails depuis leurs serveurs ou limitent le montant pouvant être envoyé au cours d'une période donnée. Cela est dû à leurs efforts pour empêcher les spammeurs de profiter de leurs services moins chers.
Si vous pensez que votre hôte a des limites d'e-mailing ou bloque l'envoi d'e-mails, consultez leur FAQ pour voir s'il répertorie ces limitations. Sinon, vous devrez peut-être contacter leur support pour vérifier s'il existe des restrictions concernant l'envoi d'e-mails.
Vérifiez les dossiers de spam; empêcher les e-mails d'être marqués comme spam
Souvent, pour diverses raisons, les e-mails envoyés via PHP (et d'autres langages de programmation côté serveur) se retrouvent dans le dossier spam d'un destinataire. Vérifiez toujours là avant de dépanner votre code.
Pour éviter que le courrier envoyé via PHP ne soit envoyé dans le dossier de spam d'un destinataire, vous pouvez effectuer différentes actions, à la fois dans votre code PHP et autrement, pour minimiser les chances que vos e-mails soient marqués comme spam. Les bons conseils de Michiel de Mare incluent:
- Utilisez des méthodes d'authentification des e-mails, telles que SPF et DKIM pour prouver que vos e-mails et votre nom de domaine vont de pair et pour empêcher l'usurpation de votre nom de domaine. Le site Web SPF comprend un assistant pour générer les informations DNS pour votre site.
- Vérifiez votre DNS inversé pour vous assurer que l'adresse IP de votre serveur de messagerie pointe vers le nom de domaine que vous utilisez pour envoyer du courrier.
- Assurez-vous que l'adresse IP que vous utilisez n'est pas sur une liste noire
- Assurez-vous que l'adresse de réponse est une adresse existante valide.
- Utilisez le nom complet et réel du destinataire dans le champ À, pas seulement l'adresse e-mail (par exemple
"John Smith" <john@blacksmiths-international.com>
).
- Surveillez vos comptes d'abus, tels que abuse@votredomaine.com et postmaster@votredomaine.com. Cela signifie - assurez-vous que ces comptes existent, lisez ce qui leur est envoyé et donnez suite aux plaintes.
- Enfin, le rendre vraiment facile de se désabonner. Sinon, vos utilisateurs se désinscrireont en appuyant sur le bouton spam , ce qui affectera votre réputation.
Voir Comment vous assurer que les e-mails que vous envoyez par programmation ne sont pas automatiquement marqués comme spam? pour en savoir plus sur ce sujet.
Assurez-vous que tous les en-têtes de courrier sont fournis
Certains logiciels de spam rejetteront le courrier s'il manque des en-têtes courants tels que "De" et "Répondre à":
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
Assurez-vous que les en-têtes de courrier ne contiennent aucune erreur de syntaxe
Les en-têtes non valides sont tout aussi mauvais que l'absence d'en-têtes. Un caractère incorrect pourrait suffire à faire dérailler votre e-mail. Revérifiez pour vous assurer que votre syntaxe est correcte car PHP ne détectera pas ces erreurs pour vous.
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
N'utilisez pas de faux From:
expéditeur
Bien que l'e-mail doive avoir un expéditeur From:, vous ne pouvez pas utiliser n'importe quelle valeur. En particulier, les adresses d'expéditeur envoyées par l'utilisateur sont un moyen infaillible de bloquer les e-mails:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
Raison: votre serveur Web ou d'envoi de messagerie n'est pas inscrit sur la liste blanche SPF / DKIM pour prétendre être responsable des adresses @hotmail ou @gmail. Il peut même supprimer silencieusement des messages avec des From:
domaines d'expéditeur pour lesquels il n'est pas configuré.
Assurez-vous que la valeur du destinataire est correcte
Parfois, le problème est aussi simple que d'avoir une valeur incorrecte pour le destinataire de l'e-mail. Cela peut être dû à l'utilisation d'une variable incorrecte.
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
Une autre façon de tester cela consiste à coder en dur la valeur du destinataire dans l' mail()
appel de fonction:
mail('user@example.com', $subject, $message, $headers);
Cela peut s'appliquer à tous les mail()
paramètres.
Envoyer vers plusieurs comptes
Pour éliminer les problèmes de compte de messagerie, envoyez votre e-mail à plusieurs comptes de messagerie chez différents fournisseurs de messagerie . Si vos e-mails ne parviennent pas au compte Gmail d'un utilisateur, envoyez les mêmes e-mails à un compte Yahoo, un compte Hotmail et un compte POP3 normal (comme votre compte de messagerie fourni par le FAI).
Si les e-mails arrivent à tout ou partie des autres comptes de messagerie, vous savez que votre code envoie des e-mails, mais il est probable que le fournisseur de compte de messagerie les bloque pour une raison quelconque. Si l'e-mail n'arrive sur aucun compte de messagerie, le problème est probablement lié à votre code.
Assurez-vous que le code correspond à la méthode du formulaire
Si vous avez défini votre méthode de formulaire sur POST
, assurez-vous que vous utilisez $_POST
pour rechercher vos valeurs de formulaire. Si vous l'avez défini GET
ou ne l' avez pas défini du tout, assurez-vous que vous utilisez $_GET
pour rechercher les valeurs de votre formulaire.
Assurez-vous que la action
valeur de votre formulaire pointe vers l'emplacement correct
Assurez-vous que votre action
attribut de formulaire contient une valeur qui pointe vers votre code de diffusion PHP.
<form action="send_email.php" method="POST">
Assurez-vous que l'hôte Web prend en charge l'envoi d'e-mails
Certains fournisseurs d'hébergement Web n'autorisent pas ou n'autorisent pas l'envoi d'e-mails via leurs serveurs. Les raisons peuvent varier, mais si elles ont désactivé l'envoi de courrier, vous devrez utiliser une méthode alternative qui utilise un tiers pour envoyer ces e-mails pour vous.
Un e-mail à leur support technique (après un voyage vers leur support en ligne ou FAQ) devrait clarifier si les capacités de messagerie sont disponibles sur votre serveur.
Assurez-vous que le localhost
serveur de messagerie est configuré
Si vous développez sur votre poste de travail local à l'aide de WAMP, MAMP ou XAMPP, un serveur de messagerie n'est probablement pas installé sur votre poste de travail. Sans celui-ci, PHP ne peut pas envoyer de courrier par défaut.
Vous pouvez surmonter cela en installant un serveur de messagerie de base. Pour Windows, vous pouvez utiliser le Mercury Mail gratuit .
Vous pouvez également utiliser SMTP pour envoyer vos e-mails. Voir cette excellente réponse de Vikas Dwivedi pour apprendre comment faire cela.
Activer la personnalisation de PHP mail.log
En plus du fichier journal de votre MTA et PHP, vous pouvez activer la journalisation pour la mail()
fonction en particulier. Il n'enregistre pas l'interaction SMTP complète, mais au moins les paramètres d'appel de fonction et le script d'appel.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
Voir http://php.net/manual/en/mail.configuration.php pour plus de détails. (Il est préférable d'activer ces options dans le php.ini
ou .user.ini
ou .htaccess
peut - être.)
Vérifiez auprès d'un service de test de courrier
Il existe différents services de livraison et de vérification du spam que vous pouvez utiliser pour tester la configuration de votre MTA / serveur Web. En règle générale, vous envoyez une sonde de messagerie à: leur adresse, puis obtenez un rapport de livraison et des échecs ou analyses plus concrets plus tard:
Utilisez un autre expéditeur
La mail()
fonction intégrée de PHP est pratique et fait souvent le travail, mais elle a ses défauts . Heureusement, il existe des alternatives qui offrent plus de puissance et de flexibilité, notamment la gestion de la plupart des problèmes décrits ci-dessus:
Le tout pouvant être combiné avec un serveur / fournisseur de services SMTP professionnel. (Parce que les plans d'hébergement Web partagés typiques 08/15 sont aléatoires en ce qui concerne la configuration / configurabilité des e-mails.)