La fonction de messagerie PHP ne termine pas l'envoi de l'e-mail

Jul 09 2014
<?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 courrier électronique. Le formulaire lui-même est sur ma index.htmlpage, mais il se soumet à une page distincte «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?

Réponses

533 JohnConde Jul 09 2014 at 09:21

Bien que certaines parties de cette réponse ne s'appliquent qu'à 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 semble ne pas envoyer d'e-mails. Il est difficile de diagnostiquer ces choses à moins qu'il y ait une erreur de syntaxe évidente. Sans un, vous devez parcourir la liste de contrôle ci-dessous pour trouver les écueils 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 que PHP rencontre. Le rapport d'erreurs doit être activé pour recevoir ces erreurs. Placer le code suivant en haut de vos fichiers PHP (ou dans un fichier de configuration principal) activera le rapport d'erreur.

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 est d'oublier de placer 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 (chaîne $ to, chaîne $ sujet, chaîne $ message [, chaîne $ en-têtes_supplémentaires [, chaîne $ paramètres_supplémentaires]])

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 enregistrer toutes les tentatives d'envoi d'e-mails via celui-ci. L'emplacement de ces journaux varie (vous devrez peut-être demander à votre administrateur de serveur où ils se trouvent), mais ils se trouvent généralement dans le répertoire racine d'un utilisateur sous logs. À l'intérieur se trouveront 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 blocage de port est un problème très courant auquel la plupart des développeurs sont confrontés lorsqu'ils intègrent leur code pour envoyer des e-mails à l'aide de SMTP. Et cela peut être facilement retracé sur les maillogs du serveur (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 mutualisé, 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é, la seule solution est de contacter votre fournisseur d'hébergement pour débloquer ces ports.

La plupart des fournisseurs d'hébergement bloquent ces ports de messagerie pour protéger leur réseau contre l'envoi de spams.

Utilisez les ports 25 ou 587 pour les connexions simples / 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 fournisseurs d'hébergement.

N'utilisez pas l'opérateur de suppression d'erreurs

Lorsque l' opérateur de suppression d'erreur @ est ajouté au début d'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 masquez peut-être des messages d'erreur importants qui vous aideront à déboguer cela. Supprimez le @et voyez si des erreurs sont signalées.

Ce n'est conseillé que lorsque vous vérifiez avecerror_get_last() juste après les défaillances du béton.

Vérifiez la mail()valeur de retour

La mail()fonction:

Renvoie TRUEsi le courrier a été accepté avec succès pour la livraison, FALSEsinon. 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 FALSEvaleur de retour, vous savez que l'erreur réside dans l'acceptation de votre courrier par votre serveur. Ce n'est probablement pas un problème de codage mais un problème de configuration de serveur. Vous devez parler à votre administrateur système pour savoir pourquoi cela se produit.
  • Si vous recevez une TRUEvaleur de retour, cela ne signifie pas que votre e-mail sera définitivement envoyé. Cela signifie simplement que l'e-mail a été envoyé à son gestionnaire respectif sur le serveur avec succès par PHP. Il y a encore plus de points de défaillance hors du contrôle de PHP qui peuvent empêcher l'envoi du courrier électronique.

Cela FALSEvous aidera à vous orienter dans la bonne direction alors que TRUEcela ne signifie pas nécessairement que votre e-mail a été envoyé avec succès. Ceci est important à noter!

Assurez-vous que votre hébergeur vous permet d'envoyer des e-mails et ne limite pas l'envoi de e-mails

De nombreux hébergeurs partagés, en particulier les hébergeurs gratuits, n'autorisent pas l'envoi d'e-mails à partir de leurs serveurs ou limitent le montant qui peut ê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ébergeur a des limites d'envoi d'e-mails ou bloque l'envoi d'e-mails, consultez leur FAQ pour voir s'ils répertorient de telles limitations. Sinon, vous devrez peut-être contacter leur support pour vérifier s'il existe des restrictions en matière d'envoi d'e-mails.

Vérifiez les dossiers de spam; empêcher les e-mails d'être signalé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 les e-mails envoyés via PHP ne soient envoyés dans le dossier spam d'un destinataire, vous pouvez faire différentes choses, à 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 appartiennent ensemble 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 de 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 l'envoi de courrier.
  • Assurez-vous que l'adresse IP que vous utilisez ne figure 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" <[email protected]>).
  • Surveillez vos comptes d'abus, tels que [email protected] et [email protected]. Cela signifie - assurez-vous que ces comptes existent, lisez ce qui leur est envoyé et agissez en cas de plaintes.
  • Enfin, le rendre vraiment facile de se désabonner. Sinon, vos utilisateurs se désabonneront en appuyant sur le bouton spam , ce qui affectera votre réputation.

Consultez 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 les e-mails s’ils ne contiennent pas d’en-têtes courants tels que «De» et «Répondre à»:

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "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 de n'avoir aucun en-tête. Un caractère incorrect peut suffire à faire dérailler votre courrier électronique. Vérifiez à nouveau pour vous assurer que votre syntaxe est correcte car PHP ne détectera pas ces erreurs pour vous.

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

N'utilisez pas un faux From:expéditeur

Alors que le courrier doit avoir un De: sender, vous ne pouvez pas utiliser n'importe quelle valeur. En particulier, les adresses d'expéditeur fournies par l'utilisateur sont un moyen infaillible de bloquer les e-mails:

$headers = array("From: $_POST[contactform_sender_email]"); // No!

Raison: votre serveur de messagerie Web ou d'envoi n'est pas sur la liste blanche SPF / DKIM pour prétendre être responsable des adresses @hotmail ou @gmail. Il peut même supprimer silencieusement des e-mails 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 = '[email protected]';
// 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('[email protected]', $subject, $message, $headers); 

Cela peut s'appliquer à tous les mail()paramètres.

Envoyer à plusieurs comptes

Pour éviter les problèmes de compte de messagerie, envoyez votre e-mail à plusieurs comptes de messagerie de différents fournisseurs de messagerie . Si vos e-mails n'arrivent pas sur le compte Gmail d'un utilisateur, envoyez les mêmes e-mails à un compte Yahoo, un compte Hotmail et un compte POP3 classique (comme votre 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 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 plus susceptible d'être 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 $_POSTpour rechercher vos valeurs de formulaire. Si vous l'avez défini GETou ne l' avez pas défini du tout, assurez-vous $_GETde rechercher les valeurs de votre formulaire.

Assurez-vous que la actionvaleur de votre formulaire pointe vers l'emplacement correct

Assurez-vous que votre actionattribut de formulaire contient une valeur qui pointe vers votre code de messagerie PHP.

<form action="send_email.php" method="POST">

Assurez-vous que l'hôte Web prend en charge l'envoi d'e-mails

Certains hébergeurs Web n'autorisent ni n'activent l'envoi d'e-mails via leurs serveurs. Les raisons peuvent varier, mais s'ils ont désactivé l'envoi de courrier, vous devrez utiliser une méthode alternative utilisant un tiers pour envoyer ces e-mails à votre place.

Un e-mail adressé à leur support technique (après une visite de leur support en ligne ou de leur FAQ) devrait préciser si les capacités de messagerie sont disponibles sur votre serveur.

Assurez-vous que le localhostserveur 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 un, 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 gratuitement Mercury Mail .

Vous pouvez également utiliser SMTP pour envoyer vos e-mails. Voir cette excellente réponse de Vikas Dwivedi pour savoir comment faire cela.

Activer la personnalisation de PHP mail.log

En plus du fichier journal de votre MTA et de PHP, vous pouvez activer la journalisation pour la mail()fonction spécifiquement. 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 php.iniou .user.iniou .htaccesspeut - ê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 courrier à: leur adresse, puis obtenez un rapport de livraison et des échecs ou des analyses plus concrets plus tard:

Utilisez un autre mailer

La fonction intégrée de PHP mail()est pratique et fait souvent le travail, mais elle a ses inconvénients . Heureusement, il existe des alternatives qui offrent plus de puissance et de flexibilité, y compris la gestion d'un grand nombre des problèmes décrits ci-dessus:

Tout cela peut ê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 / la configurabilité des e-mails.)

39 er.irfankhan11 Jul 27 2015 at 21:01

Ajoutez un en-tête de mail dans la fonction mail:

$header = "From: [email protected]\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}
25 sonamgupta May 20 2015 at 20:23
  1. Essayez toujours d'envoyer des en-têtes dans la fonction de messagerie.
  2. Si vous envoyez du courrier via localhost, définissez les paramètres SMTP pour l'envoi du courrier.
  3. Si vous envoyez des e-mails via un serveur, vérifiez que la fonction d'envoi d'e-mails est activée sur votre serveur.
21 oneDerer Jul 09 2014 at 09:55

Si vous utilisez une configuration SMTP pour envoyer votre e-mail, essayez plutôt d' utiliser PHPMailer . Vous pouvez télécharger la bibliothèque sur https://github.com/PHPMailer/PHPMailer .

J'ai créé mon email en envoyant de cette façon:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}
17 user1258544 Jul 09 2014 at 10:22

Ajoutez simplement quelques en-têtes avant d'envoyer un mail:

<?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";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

Et encore une chose. La mail()fonction ne fonctionne pas dans localhost. Téléchargez votre code sur un serveur et essayez.

13 bat.t Sep 29 2015 at 21:25

Cela a fonctionné pour moi sur 000webhost en procédant comme suit:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";

Saisissez directement l'adresse e-mail lors de l'envoi de l'e-mail:

mail('[email protected]', $subject, $message, $headers)

Utilisez ''et non "".

Ce code fonctionne, mais l'e-mail a été reçu avec un décalage d'une demi-heure.

10 Karthik Jun 23 2016 at 16:02

La plupart du temps, 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

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>
9 iatboy Aug 05 2014 at 10:49

Si vous n'utilisez que la mail()fonction, vous devez compléter le fichier de configuration.

Vous devez ouvrir l'extension de messagerie et définir SMTP smtp_port, etc., votre nom d'utilisateur et votre mot de passe. Sans cela, le courrier ne peut pas être envoyé. En outre, vous pouvez utiliser la PHPMailclasse pour envoyer.

9 vldfr Feb 11 2015 at 22:20

Essayez ces deux choses séparément et ensemble:

  1. retirer le if($_POST['submit']){}
  2. supprimer $from(juste mon instinct)
8 StephenM Jan 03 2015 at 09:32

Je pense que cela devrait faire l'affaire. J'ai juste ajouté une if(issetconcaténation et ajouté aux variables dans le corps pour séparer PHP du HTML.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_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>'; 
    }
}

?>
8 Machavity May 20 2016 at 19:45

Pour tous ceux qui trouvent cela à l'avenir, je ne recommanderais pas d'utiliser mail. Il y a des réponses qui touchent à cela, mais pas le pourquoi .

La mailfonction de PHP n'est pas seulement opaque, elle repose entièrement sur le MTA que vous utilisez (c'est-à-dire Sendmail ) pour faire le travail. mailsera 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 a été transmis. En tant que tel (comme les détails de la réponse de John Conde ), vous pouvez maintenant jouer avec les journaux du MTA et espérer qu'il vous en dit assez sur l'échec de la résolution du problème. 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 configuration par défaut de 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 de réception, 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 indiquer aux bibliothèques de l'utiliser mailpour finalement 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 e-mail n'a pas pu être envoyé ou pourquoi.

Si vous utilisez SMTP (c'est-à-dire que vous appelez isSMTP()), vous pouvez obtenir une transcription détaillée de la conversation SMTP à l'aide de la SMTPDebugpropriété.

Définissez cette option en incluant une ligne comme celle-ci dans votre script:

$mail->SMTPDebug = 2;

Vous bénéficiez également d'une meilleure interface. Avec mailvous 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 fait toutes les parties délicates (comme les en-têtes).

6 Chiragpatel Jul 13 2015 at 14:27
$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}
6 dEsta88 Oct 07 2014 at 05:33

Vous pouvez utiliser l'e-mail de configuration par CodeIgniter . Par exemple, en utilisant SMTP (manière simple):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for SMTP
        'smtp_user' => '[email protected]',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('[email protected]', 'Title');
$this->email->to('[email protected]');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   // Conditional true
}

Ça marche pour moi!

4 GauravSirauthiya Jun 23 2015 at 17:58

Essaye ça

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}
4 JackCh Mar 20 2018 at 02:09

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'avoir le port SMTP (Port: 25 et 465), activé.

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
    //Server settings
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = '[email protected]';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('[email protected]', 'my name');
    $mail->addAddress('[email protected]');

    // Attachments
    $mail->addAttachment('optional file');         // Add files, is optional

    // Content
    $mail->isHTML(true);// Set email format to HTML
    $mail->Subject = utf8_decode("subject");
    $mail->Body    = utf8_decode("mail content");
    $mail->AltBody = '';
    $mail->send();
}
catch (Exception $e) {
    $error = $mail->ErrorInfo;
}
3 Daniel Sep 24 2017 at 10:50

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, allez dans / var / mail et vérifiez si ce dossier est vide.

S'il est vide, vous devrez faire un:

sudo apt-get install sendmail

si vous êtes sur un serveur Ubuntu.

3 aidangig Jan 31 2016 at 21:15

Tout d'abord, vous avez peut-être 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 $fromvariable, cela devrait automatiquement provenir de votre hébergeur si vous utilisez Linux cPanel . Il provient automatiquement de votre nom d'utilisateur et de votre adresse IP cPanel.

$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";

Assurez-vous également que vous avez le bon ordre 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.

3 JohnSlegers Feb 10 2016 at 20:23

Si vous rencontrez des difficultés pour envoyer des 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:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

Consultez la documentation officielle pour plus d'informations sur l'utilisation de SwiftMailer.

3 user3132194 Jun 21 2017 at 19:07

Pour ceux qui ne souhaitent pas utiliser de messagerie externe et souhaitent envoyer un courrier () sur un serveur Linux dédié.

La manière, la manière dont PHP envoie des mails, est décrite php.inidans la section [mail function].

Le paramètre sendmail-pathdécrit comment sendmail est appelé. La valeur par défaut est sendmail -t -i, donc si vous obtenez un travail sendmail -t -i < message.txtdans la console Linux - vous aurez terminé. Vous pouvez également ajouter mail.logau débogage et vous assurer que mail () est vraiment appelé.

Différents MTA peuvent mettre 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 depuis la console avec sendmail -v -t -i < message.txt. Le fichier message.txtdoit contenir tous les en-têtes d'un message et un corps, l'adresse de destination de l'enveloppe sera extraite de l'en- To:tête. Exemple:

From: [email protected]
To: [email protected]
Subject: Test mail via sendmail.

Text body.

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 à partir de 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 système local vers des comptes Unix (alertes à la racine des tâches cron, par exemple), configurez le /etc/ssmtp/revaliasesfichier.

Voici ma configuration pour mon compte sur Yandex mail:

[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
2 TonyLuigiC Apr 05 2017 at 08:09

Cela n'affectera qu'une petite poignée d'utilisateurs, mais j'aimerais qu'il 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 devriez savoir ce que notre professeur ne nous a pas dit: le pare-feu AceITLab (pas 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, c'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.

1 Ron Apr 01 2017 at 10:30

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 créera un .txtfichier dans un dossier nommé mailoutput.

Dans le cas où vous utilisez un service de distribution gratuit, comme 000webhostou hostinger, ces fournisseurs de services désactivent la mail()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 d'informations,

Messagerie 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) :

<?php
    $to      = '[email protected]';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: [email protected]' . "\r\n" .
        'Reply-To: [email protected]' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>
1 BadLoser Aug 21 2019 at 16:14

L' installation de Sendmail pour Debian 10.0.0 ('Buster') était en fait triviale!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

Installation standard du package sendmail (autorisant l'envoi):

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

Diverses commandes utiles:

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation
systemctl restart sendmail                  # As and when required

Vérification (de la capacité à envoyer)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

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 !

SuReSh Apr 28 2015 at 13:08

Il existe plusieurs possibilités:

  1. Vous êtes confronté à un problème de serveur. Le serveur n'a aucun serveur de messagerie. Donc, votre courrier ne fonctionne pas, car votre code est correct et le courrier fonctionne avec le type.

  2. Vous n'obtenez pas la valeur affichée. Essayez votre code avec une valeur statique.

  3. Utiliser les e-mails SMTP pour envoyer des e-mails ...

krishna Dec 23 2018 at 21:25

Vous pouvez voir vos erreurs par:

error_reporting(E_ALL);

Et mon exemple de code est:

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';

    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = '[email protected]';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = '[email protected]';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>
ofricofri Aug 16 2020 at 08:44

Si vous êtes coincé avec une application hébergée sur Hostgator, c'est ce qui a résolu mon problème. Merci beaucoup au gars qui a publié la solution détaillée. Au cas où le lien se déconnecterait un jour, vous avez le résumé:

  • Recherchez le chemin de sendmail sur votre serveur. Une façon simple de le vérifier, est d'écrire temporairement le code suivant dans une page qui ne vous accéder, de lire les informations générées: <?php phpinfo(); ?>. Ouvrez cette page et recherchez sendmail path. (Ensuite, n'oubliez pas de supprimer ce code!)
  • Problème et solution: si votre chemin sendmail indique uniquement -t -i, modifiez celui de votre serveur php.iniet ajoutez la ligne suivante:sendmail_path = /usr/sbin/sendmail -t -i;

Mais, après avoir pu envoyer du courrier avec la mail()fonction PHP , j'ai appris qu'il n'envoyait pas de courrier électronique authentifié, ce qui a créé un autre problème. Les e-mails tombaient tous dans la boîte aux lettres indésirable de mon Hotmail, et certains e-mails n'ont jamais été livrés, ce qui, je suppose, est lié au fait qu'ils ne sont pas authentifiés. C'est pourquoi j'ai décidé de passer de mail()à PHPMaileravec SMTP, après tout.