<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = '[email protected]';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";
if ($_POST['submit']) {
if (mail ($to, $subject, $body, $from)) {
echo '<p>Your message has been sent!</p>';
} else {
echo '<p>Something went wrong, go back and try again!</p>';
}
}
?>
J'ai essayé de créer un simple formulaire de messagerie. Le formulaire lui-même est sur ma index.html
page, mais il se soumet à une page séparée "merci pour votre soumission" thankyou.php
, où le code PHP ci-dessus est intégré. Le code se soumet parfaitement, mais n'envoie jamais d'email. Comment puis-je réparer cela?
$from
Réponses:
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.
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éeCela 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 correctementLa 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érifiez
error_get_last()
immédiatement après pour les défaillances concrètes.Vérifiez la
mail()
valeur de retourLa
mail()
fonction:Ceci est important à noter car:
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.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, ceTRUE
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:
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 à":
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.
N'utilisez pas de faux
From:
expéditeurBien 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:
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.
Une autre façon de tester cela consiste à coder en dur la valeur du destinataire dans l'
mail()
appel de fonction: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éfiniGET
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 correctAssurez-vous que votre
action
attribut de formulaire contient une valeur qui pointe vers votre code de diffusion PHP.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.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.)
la source
mail()
, il fait un si mauvais travail et est plus difficile à déboguer que toute autre bibliothèque de messagerieAjoutez un en-tête de mail dans la fonction mail:
la source
la source
Si vous utilisez une configuration SMTP pour envoyer votre courrier électronique, essayez plutôt d' utiliser PHPMailer . Vous pouvez télécharger la bibliothèque à partir de https://github.com/PHPMailer/PHPMailer .
J'ai créé mon email en envoyant de cette façon:
la source
Ajoutez simplement des en-têtes avant d'envoyer du courrier:
Et encore une chose. La
mail()
fonction ne fonctionne pas dans localhost. Téléchargez votre code sur un serveur et essayez.la source
$from = 'From: yoursite.com';
qui ne ressemble pas à une adresse e-mail valide complète, il n'y a pas de partie locale. Vous avez remplacé l'en-tête De et en avez ajouté d'autres. Ou plutôt ce qui$from
précède est redondant dans votre exemple. Et être mal formé était probablement le problème d'origine des PO.Cela a fonctionné pour moi sur 000webhost en procédant comme suit:
Saisissez directement l'adresse e-mail lors de l'envoi de l'e-mail:
Utilisez
''
et non""
.Ce code fonctionne, mais l'e-mail a été reçu avec une demi-heure de retard.
la source
Généralement, la
mail()
fonction est désactivée dans l'hébergement partagé. Une meilleure option consiste à utiliser SMTP. La meilleure option serait Gmail ou SendGrid.SMTPconfig.php
SMTPmail.php
contact_email.php
la source
Si vous utilisez uniquement la
mail()
fonction, vous devez compléter le fichier de configuration.Vous devez ouvrir l'extension de messagerie et définir le
SMTP smtp_port
et ainsi de suite, et le plus important, votre nom d'utilisateur et votre mot de passe. Sans cela, le courrier ne peut pas être envoyé. Vous pouvez également utiliser laPHPMail
classe pour envoyer.la source
Essayez ces deux choses séparément et ensemble:
if($_POST['submit']){}
$from
(juste mon instinct)la source
Je pense que cela devrait faire l'affaire. Je viens d'ajouter une
if(isset
et une concaténation aux variables dans le corps pour séparer PHP du HTML.la source
Pour tous ceux qui trouvent cela à l'avenir, je ne recommanderais pas d'utiliser
mail
. Il y a quelques réponses qui touchent à cela, mais pas le pourquoi .La
mail
fonction de PHP n'est pas seulement opaque, elle dépend entièrement du MTA que vous utilisez (ie Sendmail ) pour faire le travail.mail
sera seulement vous dire si le MTA n'a pas réussi à l' accepter (c. -à- Sendmail est en baisse lorsque vous avez essayé d'envoyer). Il ne peut pas vous dire si le courrier a réussi, car il l'a remis. En tant que tel (comme la réponse de John Conde détails de la ), vous pouvez désormais jouer avec les journaux du MTA et espérer qu'il vous en dira assez sur l'échec de la correction. Si vous êtes sur un hôte partagé ou n'avez pas accès aux journaux MTA, vous n'avez pas de chance. Malheureusement, la valeur par défaut pour la plupart des installations vanilla pour Linux le gère de cette façon.Une bibliothèque de messagerie ( PHPMailer , Zend Framework 2+, etc.) fait quelque chose de très différent de
mail
. Ils ouvrent un socket directement sur le serveur de messagerie destinataire, puis envoient les commandes de messagerie SMTP directement sur ce socket. En d'autres termes, la classe agit comme son propre MTA (notez que vous pouvez dire aux bibliothèques à utilisermail
pour envoyer le courrier, mais je vous recommande fortement de ne pas le faire).Cela signifie que vous pouvez alors voir directement les réponses du serveur de réception (dans PHPMailer, par exemple, vous pouvez activer la sortie de débogage ). Plus besoin de deviner si un mail n'a pas pu être envoyé ou pourquoi.
Vous bénéficiez également d'une meilleure interface. Avec
mail
vous devez configurer tous vos en-têtes, pièces jointes, etc. Avec une bibliothèque, vous avez une fonction dédiée pour le faire. Cela signifie également que la fonction effectue toutes les parties délicates (comme les en-têtes).la source
la source
Vous pouvez utiliser l'e-mail de configuration par CodeIgniter . Par exemple, en utilisant SMTP (manière simple):
Ça marche pour moi!
la source
Essaye ça
la source
Le problème vient peut-être de la configuration du serveur de messagerie. Pour éviter ce type de problèmes ou vous n'avez pas à vous soucier du problème du serveur de messagerie, je vous recommande d'utiliser PHPMailer .
C'est un plugin qui a tout le nécessaire pour envoyer du courrier, et la seule chose que vous devez prendre en compte est d'activer le port SMTP (Port: 25 et 465).
la source
Assurez-vous que Sendmail est installé sur votre serveur.
Si vous avez vérifié votre code et vérifié qu'il n'y a rien de mal à cela, allez dans / var / mail et vérifiez si ce dossier est vide.
S'il est vide, vous devrez faire:
si vous êtes sur un serveur Ubuntu.
la source
Tout d'abord, vous pourriez avoir trop de paramètres pour la fonction mail () ... Vous pouvez en avoir au maximum cinq,
mail(to, subject, message, headers, parameters);
En ce qui concerne la
$from
variable, cela devrait provenir automatiquement de votre hébergeur si vous utilisez le Linux cPanel . Il provient automatiquement de votre nom d'utilisateur et de votre adresse IP cPanel.Assurez-vous également que vous disposez de l'ordre correct des variables dans votre fonction mail ().
Dans
mail($to, $subject, $message, etc.)
cet ordre, sinon il y a une chance que cela ne fonctionne pas.la source
Si vous rencontrez des problèmes pour envoyer des e-mails avec PHP, envisagez une alternative comme PHPMailer ou SwiftMailer .
J'utilise généralement SwiftMailer chaque fois que j'ai besoin d'envoyer des mails avec PHP.
Utilisation de base:
Consultez la documentation officielle pour plus d'informations sur l'utilisation de SwiftMailer.
la source
Pour ceux qui ne veulent pas utiliser de mailers externes et qui veulent mail () sur un serveur Linux dédié.
La façon dont les mails PHP sont décrits
php.ini
dans la section[mail function]
.Le paramètre
sendmail-path
décrit la façon dont sendmail est appelé. La valeur par défaut estsendmail -t -i
, donc si vous obtenez un travailsendmail -t -i < message.txt
dans la console Linux - vous aurez terminé. Vous pouvez également ajoutermail.log
au débogage et être sûr que mail () est vraiment appelé.Différents MTA peuvent être mis en œuvre
sendmail
. Ils font juste un lien symbolique vers leurs binaires sur ce nom. Par exemple, dans Debian, la valeur par défaut est Postfix . Configurez votre MTA pour envoyer du courrier et testez-le à partir de la console avecsendmail -v -t -i < message.txt
. Le fichiermessage.txt
doit contenir tous les en-têtes d'un message et un corps, l'adresse de destination de l'enveloppe sera prise dans l'en-To:
tête. Exemple:Je préfère utiliser ssmtp comme MTA car il est simple et ne nécessite pas d'exécuter un démon avec des ports ouverts. ssmtp convient uniquement pour l'envoi de courrier depuis localhost . Il peut également envoyer des e-mails authentifiés via votre compte sur un service de messagerie public. Installez ssmtp et modifiez le fichier de configuration
/etc/ssmtp/ssmtp.conf
. Pour pouvoir également recevoir du courrier du système local vers des comptes Unix (alertes à la racine des tâches cron, par exemple), configurez le/etc/ssmtp/revaliases
fichier.Voici ma configuration pour mon compte sur mail Yandex:
la source
Cela n'affectera qu'une petite poignée d'utilisateurs, mais j'aimerais que cela soit documenté pour cette petite poignée. Ce membre de cette petite poignée a passé 6 heures à dépanner un script de messagerie PHP fonctionnel à cause de ce problème.
Si vous allez dans une université qui exécute XAMPP depuis www.AceITLab.com, vous devez savoir ce que notre professeur ne nous a pas dit: le pare-feu AceITLab (et non le pare-feu Windows) bloque MercuryMail dans XAMPP. Vous devrez utiliser un autre client de messagerie, pear travaille pour nous. Vous devrez envoyer à un compte Gmail avec des paramètres de sécurité faibles.
Oui, je sais, cela est totalement inutile pour le courrier électronique du monde réel. Cependant, d'après ce que j'ai vu, les milieux universitaires et le monde réel ont souvent peu de choses en commun.
la source
Si vous exécutez ce code sur un serveur local (c'est-à-dire votre ordinateur à des fins de développement), il n'enverra pas l'e-mail au destinataire. Il va créer un
.txt
fichier dans un dossier nommémailoutput
.Dans le cas où vous utilisez un service de tuyau gratuit, comme
000webhost
ouhostinger
, ces fournisseurs de services désactivent lemail()
fonction pour empêcher les utilisations involontaires d'usurpation d'e-mails, de spam, etc. Je préfère que vous les contactiez pour voir s'ils prennent en charge cette fonctionnalité.Si vous êtes sûr que le fournisseur de services prend en charge la fonction mail (), vous pouvez consulter ce manuel PHP pour plus de référence,
Courrier PHP ()
Pour vérifier la météo, votre service d'hébergement prend en charge la fonction mail (), essayez d'exécuter ce code (n'oubliez pas de changer l'adresse e-mail du destinataire) :
la source
L' installation de Sendmail pour Debian 10.0.0 ('Buster') était en fait banale!
php.ini
Installation standard du paquet sendmail (autorisant «envoyer»):
Diverses commandes utiles:
Vérification (de la capacité d'envoyer)
Ce qui précède a pris environ 5 minutes. Ensuite j'ai perdu 5 heures ... N'oubliez pas de vérifier votre dossier spam !
la source
Il existe plusieurs possibilités:
Vous êtes confronté à un problème de serveur. Le serveur n'a pas de serveur de messagerie. Votre courrier ne fonctionne donc pas, car votre code est correct et le courrier fonctionne avec le type.
Vous n'obtenez pas la valeur publiée. Essayez votre code avec une valeur statique.
Utiliser les e-mails SMTP pour envoyer des e-mails ...
la source
Vous pouvez utiliser libmail: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en
la source
mail()
wrapper de fonction. Ajoute seulement la construction du message et quelques gadgets.Vous pouvez voir vos erreurs en:
Et mon exemple de code est:
la source
SMTPDebug = 0
n'est pas utile. Un simple "mot de passe" ne fonctionnerait pas non plus avec GMail. Cette réponse ne contribue pas beaucoup ici.Si votre système sendmail fonctionne, votre code doit être modifié comme suit:
Cela vous permet d'envoyer des e-mails HTML.
D'un intérêt notable:
Remarque: la
<<<EOB
syntaxe requiert que le dernier marqueur EOB commence comme le début de la ligne et n'a ni espace ni caractère après le point-virgule.la source