recherche

Maison  >  Questions et réponses  >  le corps du texte

La fonction de messagerie PHP ne peut pas envoyer complètement d'e-mails

<?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粉125450549P粉125450549413 Il y a quelques jours574

répondre à tous(1)je répondrai

  • P粉398117857

    P粉3981178572023-10-12 18:23:25

    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.

    Assurez-vous que le rapport d'erreurs est activé et configuré pour signaler toutes les erreurs

    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.

    Assurez-vous d'appeler la fonction 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é.

    Assurez-vous d'appeler correctement la mail()fonction

    La 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.

    Vérifiez le journal de messagerie du serveur

    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.

    Vérifiez si la connexion au port échoue

    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.

    N'utilisez pas d'opérateurs de suppression d'erreurs

    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.

    Vérifiezmail()la valeur de retour

    mail() Fonction :

    Cela mérite d'être noté car :

    • Si vous recevez une valeur de retour 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.
    • Si vous recevez une valeur de retour 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

    ne signifie pas nécessairement que votre e-mail a été envoyé avec succès. Cela vaut la peine d’être noté !

    Assurez-vous que votre fournisseur d'hébergement vous permet d'envoyer des e-mails et ne restreint pas l'envoi de courrier

    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.

    Vérifiez le dossier spam ; empêchez les e-mails d'être marqués comme spam

    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.

    Pour éviter que les e-mails envoyés via PHP ne soient envoyés dans le dossier spam du destinataire, vous pouvez faire un certain nombre de choses dans votre code PHP ou autrement pour minimiser les risques que votre e-mail soit marqué comme spam. Les bons conseils de Michiel de Mare

    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 ? .

    Assurez-vous de fournir tous les en-têtes de courrier électronique

    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);

    Assurez-vous qu'il n'y a pas d'erreurs grammaticales dans l'en-tête de l'e-mail

    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
    );

    N'utilisez pas de faux 发件人:expéditeurs

    Bien 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 des messages avec un domaine d'expéditeur From: non configuré.

    Assurez-vous que la valeur du destinataire est correcte

    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.

    Envoyer à plusieurs comptes

    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.

    Assurez-vous que le code correspond à la méthode du formulaire

    Si vous avez défini la méthode du formulaire pour POST,请确保使用 $_POST 查找表单值。如果您已将其设置为 GET 或根本没有设置,请确保使用 $_GET recherchez la valeur du formulaire.

    Assurez-vous que les actionvaleurs de votre formulaire pointent vers le bon emplacement

    Assurez-vous que l'attribut de votre formulaire action contient une valeur pointant vers votre code mail PHP.

    Assurez-vous que votre hébergeur prend en charge l'envoi d'e-mails

    Certains fournisseurs d'hébergement Web n'autorisent pas ou n'activent pas l'envoi d'e-mails via leurs serveurs. Les raisons peuvent varier, mais s'ils bloquent les e-mails, vous devrez utiliser une méthode alternative, qui consiste à faire appel à un tiers pour envoyer ces e-mails à votre place.

    Un e-mail envoyé à leur support technique (après avoir visité leur support en ligne ou leur FAQ) devrait préciser si la fonctionnalité de messagerie est disponible sur votre serveur.

    Assurez-vous que votre localhostserveur de messagerie est configuré

    Si vous développez sur un poste de travail local en utilisant WAMP, MAMP ou XAMPP, il se peut que vous n'ayez pas de serveur de messagerie installé sur votre poste de travail. Sinon, PHP ne pourra pas envoyer d'e-mails par défaut.

    Vous pouvez surmonter ce problème en installant un serveur de messagerie de base. Pour Windows, vous pouvez utiliser le Mercury Mail gratuit.

    Vous pouvez également envoyer des e-mails via SMTP. Consultez cette excellente réponse de > Vikas Dwivedi pour savoir comment procéder.

    Activer la personnalisation PHP

    mail.log

    En plus des fichiers journaux MTA et PHP, vous pouvez également activer la

    journalisation spécifique des fonctionsmail(). Il n'enregistre pas l'interaction SMTP complète, mais au moins il enregistre les paramètres d'appel de fonction et le script appelant.

    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. (Mieux vaut activer ces options dans .) php.ini.user.ini.htaccess

    Vérifiez le service de test de courrier

    Vous pouvez tester la configuration de votre MTA/serveur Web à l'aide de divers services de livraison et de vérification du spam. Généralement, vous envoyez des courriers électroniques à : Leur adresse, puis obtenez des rapports de livraison et des échecs ou analyses plus spécifiques plus tard :

    Utilisez un autre programme de messagerie

    Les fonctions

    intégrées de

    PHP sont pratiques et font généralement le travail, mais elles mail()ont leurs inconvénients. Heureusement, il existe des alternatives qui offrent plus de puissance et de flexibilité, notamment pour gérer bon nombre des problèmes mentionnés ci-dessus :

    Tout cela peut être utilisé en conjonction avec un serveur/fournisseur de services SMTP professionnel. (Parce que les plans d'hébergement Web partagés typiques du 15/08 sont aléatoires en termes de configuration/configuration de la messagerie.)

    répondre
    0
  • Annulerrépondre