La fonction de messagerie PHP ne permet pas d'envoyer un e-mail complet

<?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'ai essayé de créer un simple formulaire. Le formulaire lui-même est sur ma page index.html , mais 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'e-mail. s'il vous plaît aider.

390
demandé sur Machavity 2014-07-09 06:18:55

24 réponses

bien qu'il y ait des parties de cette réponse qui s'appliquent seulement à l'utilisation de la fonction mail() elle-même, beaucoup de ces étapes de dépannage peuvent être appliquées à n'importe quel système de mailing PHP.

il y a plusieurs raisons pour lesquelles votre script semble ne pas envoyer de courriels. Il est difficile de diagnostiquer ces choses à moins qu'il y ait une erreur évidente de syntaxe. Sans cela, vous devez passer en revue la liste de contrôle ci-dessous pour trouver tout potentiel les pièges que vous pouvez rencontrer.

s'assurer que la déclaration des erreurs est activée et réglée pour déclarer toutes les erreurs

le rapport d'erreur est essentiel pour éliminer les bogues dans votre code et les erreurs générales que PHP rencontre. Rapport d'erreur doit être activée pour recevoir ces erreurs. Placer le code suivant en haut de vos fichiers PHP (ou dans un fichier de configuration maître) permettra de signaler des erreurs.

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

voir ce Débordement de Pile réponse pour plus de détails sur cette.

assurez-vous que la fonction mail() s'appelle

cela peut sembler stupide mais une erreur courante est d'oublier de placer réellement la fonction mail() dans votre code. Assurez-vous qu'il est là et pas commenté.

s'assurer que la fonction mail() s'appelle correctement

bool mail (string $to , string $sujet , string $message [, string $additional_headers [, string $additional_parameters ]] )

la fonction mail prend trois paramètres requis et éventuellement un quatrième et 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 aussi.

Vérifier le le serveur de messagerie de journaux

votre serveur web devrait enregistrer toutes les tentatives d'envoyer des e-mails à travers elle. L'emplacement de ces journaux variera (vous devrez peut-être demander à l'administrateur de votre 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 du serveur signalé, le cas échéant, pour vos tentatives pour envoyer des e-mails.

vérifier la défaillance de la connexion du Port

bloc de ports est un problème très courant auquel la plupart des développeurs font face en intégrant leur code pour délivrer des e-mails en utilisant SMTP. Et, cela peut être facilement retracé sur le serveur maillogs (l'emplacement du serveur de mail connexion 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 bloc est fait exprès par votre hébergeur. Cela est vrai même pour certains des serveurs dédiés. Lorsque ces les ports sont bloqués, essayez de vous connecter en utilisant le port 2525. Si vous trouvez 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 e-mail pour protéger leur réseau d'envoyer des e-mails spam.

utiliser les ports 25 ou 587 pour les connexions plain/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 taux limites fixées par certains fournisseurs d'hébergement.

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

lorsque le "opérateur de suppression d'erreur @ est prépayé à 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 est pas l'un d'entre eux.

si votre code contient @mail(...) alors vous pouvez cacher des messages d'erreur importants qui vous aideront à déboguer ceci. Supprimer le @ et voir si des erreurs sont rapportées.

c'est seulement conseillé quand vous vérifiez avec error_get_last() juste après pour les pannes de béton.

cocher la Case mail() valeur de retour

Le mail() de la fonction:

retourne TRUE si le courrier a été accepté pour livraison, FALSE autrement. Il est important de noter que ce n'est pas parce que le courrier a été accepté pour livraison que le courrier atteindra la destination prévue.

il est important de le noter car:

  • si vous recevez une valeur de retour FALSE , 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 valeur de retour TRUE cela ne signifie pas que votre email sera envoyé définitivement. Cela signifie simplement que L'email a été envoyé à son gestionnaire respectif sur le serveur avec succès par PHP. Il y a encore plus de points d'échec hors du contrôle de PHP qui peuvent empêcher L'envoi du courriel.

donc FALSE vous aidera à vous diriger dans la bonne direction tandis que TRUE ne pas signifie nécessairement que votre courriel a été envoyé avec succès. C'est important de le noter!

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

de nombreux hébergeurs partagés, en particulier les fournisseurs d'hébergements gratuits, soit ne permettent pas l'envoi de courriels à partir de leurs serveurs, soit limitez le montant qui peut être envoyé au cours d'une période donnée. C'est grâce à leurs efforts pour limiter les spammeurs de profiter de leurs services moins coûteux.

si vous pensez que votre hôte a des limites d'emailing ou bloque l'envoi de courriels, consultez leur FAQ pour voir s'ils énumèrent de telles limites. Sinon, vous pourriez avoir besoin pour atteindre leur soutien à vérifier s'il existe des restrictions en place autour de l'envoi d'e-mails.

Vérifiez spam milliard cinq cent dix neuf million quatre cent quatre vingt dix mille neuf cent vingt"

souvent, pour diverses raisons, les e-mails envoyés par PHP (et d'autres langages de programmation côté serveur) finissent dans le dossier spam du destinataire. Toujours vérifier là avant de dépanner votre code.

pour éviter que le courrier envoyé par PHP ne soit envoyé au dossier spam d'un destinataire, il y a différentes choses que vous pouvez faire, à la fois dans votre code PHP et autrement, pour minimiser les chances que vos e-mails sont marqué comme spam. Les bons conseils de Michiel de Mare comprennent:

  • utilisez des méthodes d'authentification par e-mail, telles que SPF , et DKIM pour prouver que vos e-mails et votre nom de domaine appartiennent ensemble, et pour empêcher la mystification de votre nom de domaine. Le site Web de SPF inclut un assistant pour générer les informations DNS pour votre site.
  • Cochez votre reverse DNS 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 est pas sur une liste noire
  • assurez-vous que l'adresse de réponse est valide, adresse existante.
  • utilisez le nom complet et réel du destinataire dans le champ To, pas seulement l'adresse e-mail (par exemple, "John Smith" <john@blacksmiths-international.com> ).
  • Surveillez vos comptes d'abus, tels que abuse@yourdomain.com et postmaster@yourdomain.com. Cela signifie - assurez-vous que ces comptes existent, lire ce qui leur est envoyé, et agir sur les plaintes.
  • enfin, faites-le vraiment facile à désabonner. Sinon, vos utilisateurs se désabonneront en appuyant sur le bouton spam , et cela affectera votre réputation.

Voir Comment vous assurez-vous que les courriels que vous envoyez par programme n'est pas automatiquement marqué comme spam? pour en savoir plus sur ce sujet.

s'assurer que tous les en-têtes de courrier sont fournis

Certains logiciels pourriels rejetteront le courrier s'il manque des en-têtes communs tels que "From" et "Reply-to":

$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 n'ont pas erreurs de syntaxe

"1519420920 non Valide" en-têtes sont tout aussi mauvais que d'avoir pas les en-têtes. Un caractère incorrect pourrait être tout ce qu'il faut pour faire dérailler votre email. Vérifiez deux fois pour vous assurer que votre syntaxe est correcte car PHP va et non attraper 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
);

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'email. 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 ceci est de coder la valeur du destinataire dans l'appel de fonction mail() :

mail('user@example.com', $subject, $message, $headers); 

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

Envoyer à plusieurs comptes

pour vous aider à éliminer les problèmes liés aux comptes de courriel, envoyez votre courriel à plusieurs comptes de courriel à l'adresse suivante: les fournisseurs de . 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 régulier (comme votre compte e-mail fourni par le FAI).

si les e-mails arrivent à tout ou partie des autres comptes e-mail, vous savez que votre code envoie des e-mails, mais il est probable que le fournisseur de compte e-mail les bloque pour une raison quelconque. Si l'email n'arrive pas à n'importe quel compte e-mail, le problème est plus probablement lié à votre code.

assurez-vous que le code correspond à la méthode de la forme

Si vous avez réglé votre méthode POST , assurez-vous d'utiliser $_POST pour chercher votre formulaire de valeurs. Si vous avez paramétré GET ou ne l'avez pas du tout paramétré, assurez-vous d'utiliser $_GET pour rechercher les valeurs de vos formulaires.

assurez-vous que votre formulaire action indique l'endroit exact

assurez-vous que votre attribut action contient une valeur qui pointe vers votre code de mailing PHP.

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

assurez-vous que l'hôte Web soutient l'envoi de courrier électronique

certains hébergeurs web ne permettent pas ou n'autorisent pas l'envoi de courriels par leurs serveurs. Les raisons peuvent varier, mais si ils ont désactivé l'envoi de courrier, vous devrez utiliser une autre méthode qui utilise un tiers pour envoyer ces e-mails pour vous.

un email à leur support technique (après un voyage à leur support en ligne ou FAQ) devrait clarifier si les capacités de courrier électronique 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 en utilisant 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 le gratuit Mercury Mail .

vous pouvez également utiliser SMTP pour envoyer vos e-mails. Voir cette grande réponse à partir de Vikas Dwivedi pour apprendre comment faire cela.

activer la coutume de PHP mail.log

en plus de votre fichier log DE MTA et PHP, vous pouvez activer la journalisation pour le mail() fonction . Il n'enregistre pas l'interaction SMTP complète, mais au moins les paramètres d'appel de fonction et le script d'invocation.

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érifier auprès d'un service de test de courrier

il existe différents services de livraison et de vérification de spamminess que vous pouvez utiliser pour tester votre configuration MTA/webserver. Généralement, vous envoyez un mail sonde à: leur adresse, puis obtenir un rapport de livraison et plus de défaillances ou d'analyses concrètes plus tard:

utiliser un mailer différent

PHP intégré mail() fonction est pratique et souvent obtient le travail fait, mais il a ses défauts . Heureusement, il y a des solutions de rechange qui offrent plus de pouvoir et de souplesse, y compris le traitement d'un grand nombre des problèmes décrits ci-dessus:

qui peuvent être combinés avec un serveur/fournisseur de services SMTP professionnel. (Parce que les plans de partage d'hébergement web 08/15 typiques sont touchés ou manqués quand il s'agit de la configuration/configurabilité de courrier électronique.)

407
répondu John Conde 2018-08-21 18:55:09

ajouter l'en-tête mail dans la fonction mail

$header = "From: noreply@example.com\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>'; 
}
30
répondu er.irfankhan11 2016-09-29 06:49:16
  1. essayez toujours d'envoyer des en-têtes dans la fonction mail.
  2. si vous envoyez du courrier via localhost alors faites les réglages smtp pour envoyer du courrier.
  3. si vous envoyez du courrier via le serveur, vérifiez que la fonction d'envoi de courrier est activée sur votre serveur.
19
répondu sonam gupta 2015-05-20 13:23:37

utilisez-vous la configuration SMTP pour envoyer votre e-mail? essayez d'utiliser phpmailer à la place. vous pouvez télécharger la bibliothèque à partir de https://github.com/PHPMailer/PHPMailer . j'ai créé mon email en envoyant ce chemin:

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 = "me@walalang.com";
    $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";
}
16
répondu oneDerer 2014-07-09 02:55:30

il suffit d'ajouter quelques en-têtes avant d'envoyer le courrier:

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = 'contact@yoursite.com'; 
$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: from@example.com' . "\r\n" .
'Reply-To: reply@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

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

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

13
répondu user1258544 2017-01-12 21:55:43

cela a fonctionné pour moi sur 000webhost en faisant ce qui 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"; 

Entrez directement l'adresse e-mail lors de l'envoi de l'e-mail

mail('email@gmail.com', $subject, $message, $headers)

utiliser '' et non ""

ce code fonctionne, mais l'email a été reçu avec une demi-heure de retard

12
répondu bat .t 2015-09-29 14:44:35

essayez ces deux thigs séparément et ensemble:

  1. supprimer le if($_POST['submit']){}
  2. supprimer $from (juste mon intestin)
9
répondu vldfr 2015-02-11 15:20:52

la plupart du temps, la fonction mail() est désactivée dans l'hébergement partagé. Une meilleure option est d'utiliser le protocole 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
répondu Karthik 2017-01-13 04:37:55

si vous n'utilisez que la fonction mail() , vous devez remplir le fichier de configuration.

vous devez ouvrir l'extension mail, 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é. Aussi, vous pouvez utiliser la classe PHPMail pour envoyer.

8
répondu iatboy 2014-09-08 07:46:58

vous pouvez utiliser le courriel de configuration par codeigniter, exemple en utilisant smtp (simple way):

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

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

ça marche pour moi!

7
répondu MD Creative Indonesia 2014-10-06 22:33:29

Je ne recommande pas l'utilisation de mail à quiconque trouve que cela va de l'avant . Il y a des réponses qui touchent à cela, mais pas le pourquoi de celui-ci.

la fonction mail de PHP n'est pas seulement opaque, elle dépend entièrement de n'importe quel MTA que vous utilisez (i.e. Sendmail) pour faire le travail. mail ne vous le dira que si le MTA ne l'a pas accepté (i.e. Sendmail était en panne lorsque vous avez essayé d'envoyer). Il ne peut pas vous dire si le courrier a réussi. parce qu'il est remis. En tant que tel (comme les détails de la réponse de John Conde), vous obtenez maintenant de jouer avec les logs de la MTA et l'espoir qu'il vous en dit assez sur l'échec de le corriger. 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 plupart des installations vanilla Pour Linux le gèrent de cette façon.

une bibliothèque de courrier ( PHPMailer , Zend Framework 2+, etc), fait quelque chose de très différent de mail . Ce qu'ils font, c'est ouvrir une socket directement sur le serveur de courrier récepteur et ensuite envoyer les commandes de courrier SMTP directement sur cette socket. En d'autres termes, la classe agit comme son propre MTA (notez que vous pouvez dire aux bibliothèques d'utiliser mail pour finalement envoyer le courrier, mais je vous recommande fortement de ne pas le faire).

ce que cela signifie pour vous est que vous pouvez alors voir directement les réponses du serveur récepteur (dans PHPMailer, par exemple, vous pouvez activez la sortie de débogage ). Plus besoin de deviner si un courrier n'a pas été envoyé ou pourquoi.

si vous utilisez SMTP (i.e. vous appelez isSMTP() ), vous pouvez obtenir une transcription détaillée de la conversation SMTP en utilisant la propriété SMTPDebug .

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 mail vous devez configurer tous vos en-têtes, attachements, 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).

7
répondu Machavity 2016-05-20 12:45:30

je pense que ça devrait faire l'affaire. J'ai juste ajouté un if(isset et ajouté une concaténation 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 = 'contact@yoursite.com'; 
    $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>'; 
    }
}

?>
7
répondu Stephen M 2017-01-12 22:00:35
$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>";
}
5
répondu Chirag patel 2015-07-13 07:32:55

Essayez cette

<?php
$to = "somebody@example.com, somebodyelse@example.com";
$subject = "HTML email";

$message = "
    <html>
    <head>
       <title>HTML email</title>
    </head>
    <body>
      <p>This email contains HTML Tags!</p>
      <table>
        <tr>
         <th>Firstname</th>
         <th>Lastname</th>
        </tr>
        <tr>
          <td>John</td>
          <td>Doe</td>
        </tr>
      </table>
    </body>
    </html>";

// Always set content-type when sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

// More headers
$headers .= 'From: <webmaster@example.com>' . "\r\n";
$headers .= 'Cc: myboss@example.com' . "\r\n";

mail($to,$subject,$message,$headers);
?> 
5
répondu Ganga Reddy 2017-02-21 07:39:54

Essayez cette

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>
        '; 
    }
}
3
répondu Gaurav Sirauthiya 2015-06-23 11:39:51

assurez-vous que Sendmail est bien installé sur votre serveur.

si vous avez coché votre code et vérifié qu'il n'y a aucun problème, allez dans /var/mail et vérifiez si ce dossier est vide.

Si elle est vide, vous devrez faire un:

sudo apt-get install sendmail

si vous êtes sur un serveur Ubuntu.

3
répondu Daniel 2017-09-24 03:50:12

si vous avez des difficultés à envoyer des mails avec PHP, envisagez une alternative comme PHPMailer ou SwiftMailer .

j'utilise habituellement SwiftMailer chaque fois que j'ai besoin d'envoyer des mails avec PHP.


usage 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('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => '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);
}

voir la documentation officielle pour plus d'informations sur la façon d'utiliser SwiftMailer.

2
répondu John Slegers 2016-02-10 13:23:50

peut-être que le problème est 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 ce qu'il faut pour envoyer du courrier, 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 = 'correo@gmail.com';                 
       $mail->Password = 'contrasenia';                           
       $mail->SMTPSecure = 'ssl';                          
       $mail->Port = 465;                                    

       //Recipients
       $mail->setFrom('correo@gmail.com', 'my name');    
       $mail->addAddress('destination@correo.com');               

       //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;
     }
2
répondu Jack Ch 2018-03-19 19:09:53

pour ceux qui ne veulent pas utiliser de mailers externes et qui veulent poster() sur un serveur linux dédié.

la manière, comment php poste, est décrite dans php.ini dans la section [mail function] . Le paramètre sendmail-path décrit comment sendmail est appelé. La valeur par défaut est sendmail -t -i , donc si vous travaillez sendmail -t -i < message.txt dans linux console - vous serez fait. Vous pouvez aussi ajouter mail.log pour déboguer et être sûr que mail() est vraiment appelé.

différents MTA peuvent mettre en œuvre sendmail , ils font juste le lien symbolique à leurs binaires sur ce nom. Par exemple, dans debian, la valeur par défaut est postfix. Configurez votre MTA pour envoyer du courrier et le tester depuis la console avec sendmail -v -t -i < message.txt . Fichier message.txt doit contenir tous les en-têtes d'un message et un corps, adresse de destination pour l'enveloppe sera prise à partir de To: en-tête. Exemple:

From: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.

Text body.

je visez plutôt utiliser ssmtp comme MTA parce qu'il est simple et ne nécessite pas l'exécution d'un démon avec des ports ouverts. ssmtp convient uniquement pour l'envoi de courrier depuis un hôte local, il peut également envoyer un courriel authentifié via votre compte sur un service de courrier public. Installer ssmtp et éditer la config /etc/ssmtp/ssmtp.conf . Pour être en mesure également de recivrer le courrier système local vers les comptes unix(alertes à root à partir de cron jobs, par exemple) configurer /etc/ssmtp/revaliases fichier.

voici ma configuration pour mon compte sur Yandex mail:

root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password
2
répondu user3132194 2018-07-24 03:55:33

tout D'abord,

vous pourriez avoir de nombreux paramètres pour la fonction mail ()... Vous êtes en mesure d'avoir 5 max. mail(to,subject,message,headers,parameters); En ce qui concerne la variable $from , cela devrait venir automatiquement de votre hébergeur si vous utilisez Linux cPanel. Il provient automatiquement de votre nom d'utilisateur cPanel et de votre adresse ip.

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

assurez-vous également que vous avez l'ordre correct des variables dans votre fonction mail (). le mail($to,$subject,$message,etc.) dans cet ordre, ou alors il y a une chance que ça ne marche pas. Laissez-moi savoir si cela aide...

1
répondu aidangig 2016-01-31 14:15:30

Cela affectera seulement une petite poignée d'utilisateurs, mais j'aimerais qu'il documentés pour que la petite poignée. Ce membre de cette petite poignée a passé 6 heures à résoudre un script de courrier PHP qui fonctionne à cause de ce problème.

si vous allez à une université qui dirige XAMPP de www.AceITLab.com, vous devez 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 mail client, pear travaille pour nous. Vous devrez envoyer à un compte Gmail avec des paramètres de faible sécurité.

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 très peu en commun.

1
répondu TonyLuigiC 2017-04-05 01:30:09

vous pouvez utiliser les fonctions empty() et isset (). Si vous voulez le faire fonctionner avec différents fichiers, il suffit de modifier le action='yourphp.php' au html que je vous donne, et store the PHP script à ce yourphp.php . Vous devez aussi changer votre index.html en index.php pour activer la fonctionnalité PHP.

PHP

<?php

    error_reporting(0);
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = 'contact@yoursite.com'; 
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";


    if ($_POST['submit']){
                if (!(empty($_POST['name']))) {
                        if (!(empty($_POST['email']))){
                            if (!(empty($_POST['message']))){
                                mail ($to, $subject, $body, $from);
                                echo '<p>Your message has been sent!</p>';
                            }else{
                                echo '<p>Fill your message please.</p>';}
                        }else {
                            echo '<p>Fill your email please.</p>';}
                }else{
                    echo '<p>Fill your name please.</p>';}              
    }else{
            echo '<p>Fill the form.</p>';}
?>

HTML

<html>
    <form method="post" action="?">
        <table>
            <tr><td>Name</td><td><input type='text' name='name' id='name'/></td></tr>
            <tr><td>Email</td><td><input type='text' name='email' id='email'/></td></tr>
            <tr><td>Message</td><td><input type='text' name='message' id='message'/></td></tr>
            <tr><td></td><td><input type='submit' name='submit' id='submit'/></td></tr>
        </table>
    </form>
</html>

Meilleures Salutations!

1
répondu Bishop 2018-06-02 09:44:53

si vous utilisez ce code sur un serveur local (I. e votre ordinateur à des fins de développement), il n'enverra pas l'e-mail au destinataire. Ce qui va se passer, c'est qu'il va créer un fichier .txt dans un dossier nommé mailoutput .

dans le cas où vous utilisez un service d'hébergement gratuit comme 000webhost ou hostinger , les fournisseurs de services désactivent la fonction mail() pour empêcher les utilisations involontaires de mystification de courriel, de spamming, etc. Je préfère vous contacter pour voir s'ils prennent en charge cette fonctionnalité.

si vous êtes sûr que le fournisseur de services supporte la fonction mail (), vous pouvez vérifier ce manuel PHP pour plus de référence, PHP mail ()

pour vérifier le temps que votre service d'hébergement supporte la fonction mail (), essayez d'exécuter ce code, (N'oubliez pas de changer l'adresse email du destinataire)

<?php
    $to      = 'nobody@example.com';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: webmaster@example.com' . "\r\n" .
        'Reply-To: webmaster@example.com' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

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

Espère que cela a aidé.

0
répondu Ronald P Mathews 2017-04-01 03:30:26

vous pouvez utiliser libmail: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en

include "libmail.php";
$m = new Mail(); // create the mail
$m->From( $_POST['form'] );
$m->To( $_POST['to'] );
$m->Subject( $_POST['subject'] );
$m->Body( $_POST['body'] );
$m->Cc( $_POST['cc']);
$m->Priority(4);
//  attach a file of type image/gif to be displayed in the message if possible
$m->Attach( "/home/leo/toto.gif", "image/gif", "inline" );
$m->Send(); // send the mail
echo "Mail was sent:"
echo $m->Get(); // show the mail source
0
répondu Salim Ibrogimov 2017-10-11 05:21:22