Maison > Questions et réponses > le corps du texte
<?php $name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message']; $from = 'From: yoursite.com'; $to = 'contact@yoursite.com'; $subject = 'Customer Inquiry'; $body = "From: $namen E-Mail: $emailn 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'essaie de créer un formulaire de courrier simple. Le formulaire lui-même se trouve dans mon index.html
页面上,但它提交到一个单独的“感谢您的提交”页面 thankyou.php
qui contient le code PHP ci-dessus intégré.
Le code est parfaitement soumis, mais l'e-mail n'est jamais envoyé. Comment puis-je résoudre ce problème?
P粉0716024062023-10-12 20:27:44
Bien que certaines parties de cette réponse ne s'appliquent qu'à l'utilisation de la fonction mail()
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 plusieurs raisons pour lesquelles votre script n'envoie pas l'e-mail. À moins d’une erreur de syntaxe évidente, il est difficile de diagnostiquer ces problèmes. Sinon, vous devrez parcourir la liste de contrôle ci-dessous pour rechercher les pièges potentiels que vous pourriez rencontrer.
Le rapport d'erreurs est crucial pour éliminer les bogues dans votre code et les erreurs générales rencontrées avec PHP. Le rapport d'erreurs doit être activé pour recevoir ces erreurs. Placer le code suivant en haut de votre fichier PHP (ou dans le fichier de configuration principal) permettra le rapport d'erreurs.
error_reporting(-1); ini_set('display_errors', 'On'); set_error_handler("var_dump");
Voir Comment obtenir des messages d'erreur utiles en PHP ? — Cette réponse pour plus de détails.
mail()
Cela peut sembler idiot, mais une erreur courante consiste à oublier de placer la fonction mail()
dans votre code. Assurez-vous qu'il est là et qu'il n'est pas commenté.
mail()
fonctionLa fonction mail prend trois paramètres obligatoires et un quatrième et un cinquième paramètre facultatifs. Si votre appel à mail()
n’a pas au moins trois arguments, il échouera.
Si votre appel à mail()
ne fournit pas les bons arguments dans le bon ordre, il échouera également.
Votre serveur Web doit enregistrer toutes les tentatives d'envoi d'e-mails via celui-ci. L'emplacement de ces journaux varie (vous devrez peut-être demander à l'administrateur de votre serveur où ils se trouvent), mais ils se trouvent généralement sous logs
dans le répertoire racine de l'utilisateur. À l’intérieur se trouvera le message d’erreur signalé par le serveur (le cas échéant) lié à votre tentative d’envoi de l’e-mail.
Le blocage de port est un problème très courant auquel la plupart des développeurs sont confrontés lors de l'intégration de code pour envoyer des e-mails via SMTP. Et cela peut être facilement retracé dans le journal de messagerie du serveur (l'emplacement du serveur de journal de messagerie peut varier d'un serveur à l'autre, comme mentionné ci-dessus). Si vous êtes sur un serveur d'hébergement mutualisé, les ports 25 et 587 sont toujours bloqués par défaut. Ce blocage est effectué intentionnellement par votre hébergeur. Cela est vrai même pour certains serveurs dédiés. Lorsque ces ports sont bloqués, essayez de vous connecter en utilisant le port 2525. Si vous constatez que le port est également bloqué, alors la seule solution est de contacter votre hébergeur pour débloquer ces ports.
La plupart des fournisseurs d'hébergement bloquent ces ports de messagerie pour protéger leur réseau de tout spam envoyé.
Utilisez le port 25 ou 587 pour les connexions normales/TLS et le port 465 pour les connexions SSL. Pour la plupart des utilisateurs, il est recommandé d'utiliser le port 587 pour éviter les limites de débit fixées par certains fournisseurs d'hébergement.
Lorsque l'Error Suppression Operator @
est ajouté avant une expression en PHP, tous les messages d'erreur pouvant être générés par cette expression seront ignorés. Il existe certaines situations où cet opérateur est nécessaire, mais l'envoi d'un message n'en fait pas .
Si votre code contient @mail(...)
,那么您可能隐藏了有助于您调试的重要错误消息。删除@
et voyez si des erreurs sont signalées.
Uniquement si vous utilisez error_get_last()
immédiatement suite à une panne spécifique.
mail()
la valeur de retourmail()
Fonction :
Cela mérite d'être noté car :
FALSE
, vous savez que l'erreur vient du fait que votre serveur accepte votre courrier. Il ne s'agit peut-être pas d'un problème de codage mais d'un problème de configuration du serveur. Vous devez contacter votre administrateur système pour savoir pourquoi cela se produit. TRUE
, cela ne signifie pas que votre e-mail sera envoyé. Cela signifie simplement que l'e-mail a été envoyé avec succès via PHP au gestionnaire approprié sur le serveur. Il existe de nombreux autres points de défaillance indépendants de la volonté de PHP qui peuvent empêcher l'envoi d'e-mails. Donc, FALSE
将帮助您指明正确的方向,而 TRUE
vous aidera à vous orienter dans la bonne direction, tandis que
De nombreux hébergeurs Web partagés, en particulier les fournisseurs d'hébergement Web gratuits, n'autorisent pas l'envoi d'e-mails depuis leurs serveurs ou limitent le nombre pouvant être envoyé au cours d'une période donnée. En effet, ils travaillent dur pour empêcher les spammeurs de profiter de leurs services moins chers.
Si vous pensez que votre hébergeur impose des restrictions de courrier électronique ou bloque l'envoi de courriers électroniques, consultez sa FAQ pour voir s'il répertorie de telles restrictions. Sinon, vous devrez peut-être contacter leur support pour vérifier s'il existe des restrictions sur l'envoi d'e-mails.
Souvent, les e-mails envoyés via PHP (et d'autres langages de programmation côté serveur) finissent dans le dossier spam du destinataire pour diverses raisons. Assurez-vous de vérifier là-bas avant de dépanner votre code. incluent : 🎜
Pour plus d'informations sur ce sujet, consultez Comment s'assurer que les e-mails envoyés par programmation ne sont pas automatiquement marqués comme spam ? .
Certains logiciels anti-spam rejetteront les messages s'il leur 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);
Les en-têtes invalides sont tout aussi mauvais que l'absence d'en-tête du tout. Un caractère incorrect peut faire dérailler votre email. Veuillez vérifier à nouveau que votre syntaxe est correcte, car PHP ne détectera pas ces erreurs à votre place.
$headers = array("From from@example.com", // missing colon "Reply To: replyto@example.com", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes );
发件人:
expéditeursBien que le message doive avoir From:Sender, vous ne pouvez pas simplement utiliser n'importe quelle valeur. En particulier, les adresses d'expéditeur fournies par les utilisateurs constituent un moyen fiable de bloquer les messages :
$headers = array("From: $_POST[contactform_sender_email]"); // No!
Cause : Votre réseau ou serveur de courrier sortant n'est pas sur liste blanche SPF/DKIM et ne peut pas prétendre être responsable des adresses @hotmail ou @gmail. Il peut même supprimer silencieusement le courrier pour les domaines d'expéditeur From:
non configurés.
Parfois, le problème est aussi simple que la valeur incorrecte du destinataire de l'e-mail. Cela peut être dû à l'utilisation de variables incorrectes.
$to = 'user@example.com'; // other variables .... mail($recipient, $subject, $message, $headers); // $recipient should be $to
Une autre façon de tester ce problème consiste à coder en dur la valeur du destinataire dans l'appel de fonction mail()
:
mail('user@example.com', $subject, $message, $headers);
Cela peut être appliqué à tous les mail()
paramètres.
Pour vous aider à résoudre les problèmes de compte de messagerie, envoyez votre e-mail à plusieurs comptes de messagerie auprès de différents fournisseurs de messagerie. . Si votre e-mail n'atteint pas le compte Gmail de l'utilisateur, envoyez le même e-mail à un compte Yahoo, un compte Hotmail et un compte POP3 classique (tel que le compte de messagerie fourni par votre FAI).
Si les e-mails arrivent sur tout ou partie des autres comptes de messagerie, vous savez que votre code envoie des e-mails, mais le fournisseur du compte de messagerie peut les bloquer pour une raison quelconque. Si l'e-mail n'arrive sur aucun compte de messagerie, le problème est probablement lié à votre code.
Si vous avez défini la méthode du formulaire pour POST
,请确保使用 $_POST
查找表单值。如果您已将其设置为 GET
或根本没有设置,请确保使用 $_GET
recherchez la valeur du formulaire.
action
valeurs de votre formulaire pointent vers le bon emplacementAssurez-vous que l'attribut de votre formulaire action
contient une valeur pointant vers votre code mail PHP.