La fonction de messagerie PHP ne termine pas l'envoi de l'e-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";
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.html
page, 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
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
TRUE
si le courrier a été accepté avec succès pour la livraison,FALSE
sinon. 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
FALSE
valeur 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
TRUE
valeur de retour, cela ne signifie pas que votre e-mail sera définitivement envoyé. Cela signifie simplement que l'e-mail a été envoyé à 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 FALSE
vous aidera à vous orienter dans la bonne direction alors que TRUE
cela 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 $_POST
pour rechercher vos valeurs de formulaire. Si vous l'avez défini GET
ou ne l' avez pas défini du tout, assurez-vous $_GET
de rechercher les valeurs de votre formulaire.
Assurez-vous que la action
valeur de votre formulaire pointe vers l'emplacement correct
Assurez-vous que votre action
attribut 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 localhost
serveur de messagerie est configuré
Si vous développez sur votre poste de travail local à l'aide de WAMP, MAMP ou XAMPP, un serveur de messagerie n'est probablement pas installé sur votre poste de travail. Sans 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.ini
ou .user.ini
ou .htaccess
peut - être.)
Vérifiez auprès d'un service de test de courrier
Il existe différents services de livraison et de vérification du spam que vous pouvez utiliser pour tester la configuration de votre MTA / serveur Web. En règle générale, vous envoyez une sonde de courrier à: leur adresse, puis obtenez un rapport de livraison et des échecs ou des analyses plus concrets plus tard:
- mail-tester.com (gratuit / simple)
- glockapps.com (gratuit / $$$)
- senforensics.com (inscription / $$$)
- mailtrap.io (pro / $$$)
- ultratools /… / emailTest (contrôles gratuits / MX uniquement)
- Divers: http://www.verticalresponse.com/blog/7-email-testing-delivery-tools/
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:
- Le plus populaire étant: PHPMailer
- De la même manière: SwiftMailer
- Ou même l'ancien PEAR :: Mail .
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.)
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>';
}
- Essayez toujours d'envoyer des en-têtes dans la fonction de messagerie.
- Si vous envoyez du courrier via localhost, définissez les paramètres SMTP pour l'envoi du courrier.
- 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.
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";
}
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.
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.
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();
}
?>
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 PHPMail
classe pour envoyer.
Essayez ces deux choses séparément et ensemble:
- retirer le
if($_POST['submit']){}
- supprimer
$from
(juste mon instinct)
Je pense que cela devrait faire l'affaire. J'ai juste ajouté une if(isset
concaté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>';
}
}
?>
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 mail
fonction 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. mail
sera seulement vous dire si le MTA n'a pas réussi à l' accepter (c. -à- Sendmail est en baisse lorsque vous avez essayé d'envoyer). Il ne peut pas vous dire si le courrier a réussi car il 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 mail
pour 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 laSMTPDebug
proprié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 mail
vous devez configurer tous vos en-têtes, pièces jointes, etc. Avec une bibliothèque, vous avez une fonction dédiée pour le faire. Cela signifie également que la fonction fait toutes les parties délicates (comme les en-têtes).
$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>";
}
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!
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>
';
}
}
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;
}
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.
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 $from
variable, 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.
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.
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.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 obtenez un travail sendmail -t -i < message.txt
dans la console Linux - vous aurez terminé. Vous pouvez également ajouter mail.log
au 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.txt
doit 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/revaliases
fichier.
Voici ma configuration pour mon compte sur Yandex mail:
[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
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.
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 .txt
fichier dans un dossier nommé mailoutput
.
Dans le cas où vous utilisez un service de distribution gratuit, comme 000webhost
ou 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,
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);
?>
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 !
Il existe plusieurs possibilités:
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.
Vous n'obtenez pas la valeur affichée. Essayez votre code avec une valeur statique.
Utiliser les e-mails SMTP pour envoyer des e-mails ...
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';
?>
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 recherchezsendmail 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 serveurphp.ini
et 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()
à PHPMailer
avec SMTP, après tout.