Fonction mail dans PHP

Bonjour !

Je suis débutant en PHP…

J’ai créé un formulaire de contact avec envoi d’e-mail mais je ne suis pas satisfait du résultat !..
En effet, l’en-tête du mail que je reçois ne me convient pas :

  • il y a un point entre le prénom et le nom,
  • l’adresse expéditeur qui s’affiche semble provenir de mon serveur (shost.ca).

Ce qui me fait le plus enrager c’est que j’ai déjà réussi à obtenir ce que je voulais… mais je n’arrive plus à remettre la main dessus !

PLEASE HELP !

Voici mon code, merci de votre aide !

Jérôme

<?php

if (isset($_POST['nom'], $_POST['prenom'], $_POST['email'], $_POST['message']))
	{
		$to = '[email protected]';
		$subject = $_POST['sujet'];
		$headers = 'From: ' . $_POST['prenom'] . ' ' . $_POST['nom'] . "\r\n" . 
				'Reply-To: ' . $_POST['email'];
		$sent_success = mail($to, $subject, $_POST['message'], $headers);
		if ($sent_success)
			{
				echo "Message envoyé avec succès :-)";
			}
		else
			{
				echo "Une erreur est survenue, veuillez essayer à nouveau... :-(";
			}

	}
?>

Bonjour,

Ça fait un moment que je n’ai plus envoyé de mail en flat PHP… Maintenant, je passe par des frameworks, implémentant un module de mailing, qui est plus simple à utiliser. Si tu as le temps de te renseigner, fais-le.

Cependant, bien que je ne peux pas te renseigner sur le problème dans ton code, je te conseille de lire cet article qui explique pas mal de choses : https://openclassrooms.com/courses/e-mail-envoyer-un-e-mail-en-php

Rapidement, mais sans aucune certitude, je pense qu’il y a un problème avec \r\n (cf. article) et le From qui contient un nom au lieu d’une adresse email (cf. article encore).

En espérant t’aider.

1 J'aime

Bonsoir @kneelnrise, merci pour ta réponse !

Malheureusement, je n’ai pas réussi à solder mon problème en lisant cet article…
Mais ce qui est rigolo, c’est que c’est justement en suivant un cours sur Openclassrooms que j’en suis venu à créer ce formulaire !

Sinon, tu parlais de “frameworks implémentant un module de mailing” ?.. :-)
What’s that ?
Tu pourrais m’en dire un peu plus s’il te plaît ?

Heu… je développe avec le framework Symfony2 (il y a un cours sur openclassrooms également). Cependant, c’est un tout autre niveau que ce que tu fais. Mais par là, je voulais te dire qu’il y a peut-être des modules qui existent également, mais tu devras faire tes propres recherches.

J’ai récupéré un vieux code pour envoyer un mail (cf. fin de message). Mais en le comparant au tiens et celui du tuto, je pense pour le moment que le problème vient de ton champ From ne répond pas à la norme (email|"nom" <email>). (cf. https://en.wikipedia.org/wiki/Email#Header_fields, un exemple dans la version française https://fr.wikipedia.org/wiki/Courrier_électronique#Exemple_de_contenu_brut_d.27un_courrier_.C3.A9lectronique).

Je te conseille donc de remplacer :

$headers = 'From: ' . $_POST['prenom'] . ' ' . $_POST['nom'] . "\r\n" .
    'Reply-To: ' . $_POST['email'];

Par :

$headers = 'From: "' . $_POST['prenom'] . ' ' . $_POST['nom'] . '" <' . $_POST['email'] . '>' . "\r\n" .
    'Reply-To: ' . $_POST['email'];

Essaye ainsi, et dis-nous le résultat.

Sinon, évite d’indiquer des adresses email dans tes codes (champ $to) ou tout information sensible quand tu postes sur internet.

Mon code, inspiré du tutoriel et un peu nettoyé (désolé, je ne sais pas où sont les couleurs) :

function action() {
  $name = isset($_POST['name']) ? $_POST['name'] : null;
  //other fields
  if (/* checking */) {
    // +error messages
  } else {
    $to = '[email protected]';
    $rn = preg_match("#^[a-z0-9._-][email protected](hotmail|live|msn).[a-z]{2,4}$#", $to) ? "\n" : "\r\n";

    $text = // message en texte brut
    $html = // message en HTML

    $boundary = '-----=' . md5(rand());

    // Format = "nom" <email>
    $header = 'From: "' . $name . '"<' . $email . '>' . $rn;
    $header.= 'Reply-to: "' . $name . '"<' . $email . '>' . $rn;
    $header.= 'MIME-Version: 1.0' . $rn;
    $header.= 'Content-Type: multipart/alternative;' . $rn . ' boundary="' . $boundary . '"' . $rn;

    $content = $rn . '--' . $boundary . $rn;

    $content.= 'Content-Type: text/plain; charset="UTF-8"' . $rn;
    $content.= 'Content-Transfer-Encoding: 8bit' . $rn;
    $content.= $rn . $text . $rn;

    $content.= $rn . '--' . $boundary . $rn;

    $content.= 'Content-Type: text/html; charset="UTF-8"' . $rn;
    $content.= 'Content-Transfer-Encoding: 8bit' . $rn;
    $content.= $rn . $html . $rn;

    $content.= $rn . '--' . $boundary . '--' . $rn;
    $content.= $rn . '--' . $boundary . '--' . $rn;

    mail($to, $title, $content, $header);
  }
}

Je ne comprends pas pourquoi la communaute PHP n’a toujours pas creer une couche supplémentaire pour l’envoie de mail.

Si tu es dans le cas ou tu dois absolument envoye un mail (demande par le projet par exemple). Eh bien, tu pourrais utiliser des bibliothèques tiers comme PHPmailer.

Merci pour ton aide mais malheureusement, je ne suis toujours pas arrivé à quelque chose de “satisfaisant”…
Après, comme je débute dans le domaine, dès que ça devient un peu tordu j’ai tendance à décrocher !^^

Mais je vais finir par y arriver…

Merci encore !

Merci @bastienvinh pour ton aide !

J’ai été voir PHPmailer sur github… ça a l’air vachement intéressant !
Mais comme je l’ai dit à Kneelnrise, étant débutant, je décroche assez facilement…
Du coup, je ne suis pas non plus arrivé à mes fins avec PHPmailer… mais je me suis quand même cloné le repository !.. au cas où… pour plus tard…^^

Merci du tuyau donc !

Je vais te dire un truc c’est que meme moi la fonction de mail me rebute ^^.
En fait pour apprendre, on passe tous par la. mais tu dois réellement produire quelque chose c’est mieux de passer par des bibliothèques tiers.

Utiliser la fonction mail de PHP c’est comme demander a quelque de faire du pure HTTP c’est dire écrire l’entête toi meme plus le body et les form-data.

Sans compter que chaque en tete doit différents ou des truc doit etre pris en compte a cause des serveurs mails comme gmail, free, orange. Car il y a tellement de spams dans le monde que des en-tete particulier doit mis en place pour prendre en compte chaque server de mails. Sinon ton mail est soit en spam, soit jamais retransfere.

Et la tu te retrouve a écrire des entête de fou juste pour envoyer un mail. C’est pour cela qu’utiliser des bibliothèques tiers est pas mal.

D’ailleurs personne ne t’a pose cette question, surtout que tu es debutant. Mais est-ce que sur le serveur de ton script, tu as mis en place un serveur de transfert de mail ^^ ? ou configurer pour utiliser celui d’un tier comme gmail ou autres.

Parce que sans MTA tu feras pas grand chose ^^. Tiens je me rappelle d’un poste interessant : http://www.grafikart.fr/blog/mail-local-wamp.
Pour linux, il suffit d’installer le package mailutils.

Ah n’oublie pas de débloquer le port d’envoie de mail sur ta box aussi. Free le bloque par défaut ^^ pour éviter que tu deviennes un serveur fantôme j’imagine.

Non effectivement, je n’ai du tout pensé à mettre en place un serveur de transfert de mail !.. A vrai dire, pour l’instant, je remplissais mon formulaire de contact, le machin m’envoyait un mail, j’étais content !^^

Toutes les considérations du genre mettre plusieurs personnes dans la boucle, SMTP/POP3, SSL, etc. m’étaient com-plè-te-ment sorties de la tête !.. Je me demande même si elles y étaient rentrées !^^

En fait, je découvre que mon “problème” n’est qu’en fait l’arbrisseau qui cache la forêt !^^
Mais ça tombe bien, je veux devenir bûcheron ! ;-)

Merci encore pour ton aide !
C’est super sympa ! :-)

Human Coders - Le centre de formation recommandé par les développeur·se·s pour les développeur·se·s