Lien Get Et Formulaire Post

Temps d'étude : 2h30. Niveau : Moyen.
Tags : Lien Get Et Formulaire Post
Fichier(s) utile(s) pour ce cours : /

Superglobale GET - Passage d'argument d'une page à l'autre

Dans la phase de construction d'un site web, il peut être utile de véhiculer des informations d'une page à une autre.

Pourquoi ?

Imaginons le catalogue (catalogue.php) d'une boutique ecommerce avec plusieurs produits :

explication PHP

L'affichage ci-dessus est généré grâce à une requête SQL qui rappatrie toutes les données de la base.

La plupart du temps, nous pouvons cliquer sur ces produits et arriver sur la fiche produit contenant davantages d'informations détaillées.

Maintenant imaginons la fiche produit détaillée (ficheProduit.php) :

explication PHP

Êtes vous d'accord sur le fait que s'il y a 1500 produits, il n'y aura pas 1500 fichiers du type ficheProduit1.php, ficheProduit2.php, ficheProduit3.php, ficheProduit4.php, ficheProduit5.php, etc.

Bien entendu cela serait ingérable et le contraire de dynamique !

Par conséquent, nous aurons qu'un seul fichier se nommant ficheProduit.php et pouvant présenter potentiellement tous les produits. C'est ce qu'on appelle un template (un modèle de page pouvant présenter différents contenus)

Mais s'il n'y a qu'un seul fichier, comment saura t'il quel produit il doit présenter ?

Et bien nous n'allons pas arriver sur la page ficheProduit.php les mains vides, nous irons sur la page ficheProduit.php?idProduit=1 ou par exemple ficheProduit.php?idProduit=3 (pour le tshirt rouge).

Pour rappel, l'idProduit représente le numéro du produit dans la base de données

Ce système est le même pour tous les sites web ! Essayez donc de vous balader dans un site web ecommerce et vous verrez bien des informations passées dans l'url (si vous y faites attention).
Voici un exemple avec le site web de ZARA :

explication PHP

Ces informations n'apparaitront peut être pas aussi nettement que ?idProduit=1 car souvent les sites font de l'url rewriting (réécriture d'url).

L'affichage va donc être généré grâce à une requête SQL qui rappatriera 1 produit en particulier de la base (1 ligne de résultat).

Pour afficher le bon produit dans la fiche produit, vous l'aurez compris, il nous faudra passer et récupérer le bon numéro de produit dans l'url.

Pour passer un numéro de produit c'est très simple puisque nous n'avons besoin que du HTML :

catalogue.php
	 Produit 1 
Le format a respecter est cle=valeur.

Créez le fichier catalogue.php et ficheProduit.php et vous verrez qu'en cliquant sur le lien de la page catalogue.php, vous arrivez sur la page ficheProduit.php avec le numéro de produit dans l'url.

Pour récupérer cette information, nous aurons besoin de la superglobale $_GET :

ficheProduit.php
	echo $_GET['idProduit'];
C'est tout simple, il suffit de mettre le nom de la clé (définie auparavant dans le html).

$_GET permet de récupérer une ou plusieurs information(s) contenue dans l'url afin de s'en servir dans la page web.

Nous utilisons les crochets car toutes les superglobales sont des tableaux ARRAY.

Résultat

1


Par précaution, si jamais pour une raison x ou y l'url ne contient pas d'arguments (parametres) ou que l'internaute tente d' aller directement sur ficheProduit.php sans passer par notre lien créé sur la page catalogue.php, cela donnera une erreur unedfined variable car nous chercherons à récupérer quelque chose de l'url qui n'existe pas.

Pour cette raison, il est préférable de prévoir une condition :

ficheProduit.php
	<?php
	if(!empty($_GET['idProduit']))
	{
		echo $_GET['idProduit'];
	}

Nous demandons si l'url n'est pas vide (avec le point d'exclamation "!"), autrement dit, y'a t'il un idProduit à récupérer dans l'url ?
Si oui, nous le récupérons. Si non, l'interpréteur ignorera cette portion de code.

Autre exemple avec le fichier de test "get1.php" :

get1.php
	 Cliquez ici ! 
Nous pouvons passer toutes les informations qui nous intéresse dans l'url à condition d'éviter les espaces, les accents, et de respecter le format cle=valeur.

C'est ce format qui permettra de remplir le tableau array de la superglobale $_GET.

Voici le fichier get2.php (pour s'entrainer) :

get2.php
	<?php
	if(!empty($_GET))
	{
		echo "produit $_GET[produit] 
"; echo "couleur $_GET[couleur]
"; echo "prix $_GET[prix]
"; echo implode ($_GET, " - "); echo '
'; print_r($_GET); echo '
'; }
Pas de quotes dans les crochets d'un tableau array si l'instruction echo englobe le tout entre guillemets

Résultat
L'instruction echo:
produit tshirt
couleur bleu
prix 30

La fonction prédéfinie implode :
tshirt - bleu - 30

Avec le print_r :
Array
(
    [produit] => tshirt
    [couleur] => bleu
    [prix] => 30
)

Avec une représentation plus compréhensible :

clé valeur
produit tshirt
couleur bleu
prix 30

C'est donc notre lien html <a> qui envoie des informations dans l'url et qui nous permet de construire le tableau ARRAY de $_GET.

Avez-vous compris l'intérêt et à quoi sert $_GET ? Avez-vous compris comment fonctionne $_GET ? C'est indispensable pour la suite !

Superglobale POST - Récupération des saisies d'un formulaire

Utiliser les formulaires avec PHP permet d’échanger des données avec l’internaute. C'est-à-dire, lui envoyer des données, mais aussi en recevoir de sa part.

Autant dire qu'un site web sans formulaire n'existe pas !

Les formulaires revienent très régulièrement sur les sites web, par exemple pour un formulaire de contact, un formulaire d'inscription en tant que membre, un formulaire de recherche, un formulaire de recrutement, un formulaire de satisfaction, un formulaire de commande, etc..

Comment récupérer les informations d'un formulaire ?

Nous savons qu'avec les langages Html et Css il est possible de concevoir un formulaire.

Voici donc un simple formulaire demandant une adresse (avec ville et code postal).

formulaire1.php
		










Pour rappel, le formulaire html est contenu entre les balises <form> </form> .

L'attribut method permet de préciser comment vont circuler les données, 2 choix s'offrent à nous : POST ou GET.
Retenez que nous utilisons dans la majorité des cas POST.

L'attribut action permet de préciser la page de destination (sur laquelle l'internaute sera redirigée après avoir soumis le formulaire en cliquant sur le bouton submit) pour effectuer les traitements.
Dans notre cas, nous resterons sur la même page web pour effectuer les traitements et n'emménerons l'internaute nulle part.

La balise <label> permet de créer une étiquette, son attribut for et est relié à l'attribut id de la balise <input> (lorsqu'on clique sur le texte, le curseur se place dans la case de saisie).

L'id peut être utilisé comme un id css ou javascript, mais dans ce contexte ce n'est pas son rôle premier.

Label for et id n'est donc pas d'une importance capitale pour faire fonctionner notre formulaire mais je vous recommande de toujours le prévoir car cela fait partie des normes accessiweb (pour les mal-voyants). Facilitons leur la navigation !

L'attribut placeholder est également facultatif, il permet d'afficher une indication supplémentaire avec un texte opaque présaisi qui s'effacera lorsque l'internaute commencera à saisir au clavier des informations dans la case <input> .

L'attribut name est capital puisque sans lui nous ne pourrions pas récupérer les données même avec PHP.

fléche Attention
L'attribut name est indispensable !!! Un attribut name doit être écrit par élément de formulaire (1 name = 1 saisie récupérée).
La valeur que vous placerez dans l'attribut name ne doit pas comporter d'espace, ni d'accent et de préférence ne pas contenir de majuscule (senssible à la casse).

Nous avons mis le name "cp" pour le champ code postal

Le bouton submit est présent afin que l'on puisse valider le formulaire.

Vous pouvez consulter la page récapitulant tous les éléments des formulaires HTML

Résultat
explication PHP


Un formulaire est une porte ouverte sur le serveur… Ce qui signifie qu’une personne mal intentionnée peut potentiellement exploiter des failles de sécurité…

Ce formulaire est parfaitement valide en html mais ne pourra pas être exploité sans l'aide de PHP.

Alors voici la partie PHP pour la récupération des données sur un formulaire :

formulaire1.php
		<?php
			echo 'ville : ' . $_POST['ville'] . '
'; echo 'cp : ' . $_POST['cp'] . '
'; echo 'adresse : ' . $_POST['adresse'] . '
'; ?>










Quelques Explications :

Comme d'habitude l'instruction echo peut être traduit par "affiche moi".

echo $_POST['ville'] peut être traduit par "affiche moi la ville postée".

Le texte contenu entre crochet est en liaison avec le name de l'élément HTML.

Faite le test en remplissant votre formulaire et en cliquant sur le bouton submit!


Résultat (avant d'avoir cliqué sur submit) explication PHP


Des erreurs "undefined" s'affichent sur la page web car la toute première fois où l'interpréteur exécute le code, vous lui demandez d'aller chercher des saisies postées mais s'il s'agit du moment où le formulaire est affiché par l'internaute, l'internaute n'aura pas encore eu le temps de poster quoi que ce soit (puisqu'il vient d'arriver à la seconde).

L'interpréteur vous indique que les clés du tableau array $_POST (respectivement ville, cp, et adresse) ne sont pas connues (ces clés existeront uniquement si l'internaute soumet le formulaire en cliquant sur le bouton submit).

Même si des erreurs apparaissent, vous pouvez quand même faire le test en remplissant le formulaire et en cliquant sur le bouton submit, vous verrez que ce code fonctionne :


Résultat (après avoir cliqué sur submit) explication PHP


Les saisies de l'internaute vont s'afficher correctement sur la page web.

C'est bien là que ça se joue, lorsque le bouton submit est cliqué par l'internaute, LA PAGE SE RECHARGE ET L'INTERPRETEUR RELIE LE CODE, cette fois-ci l'interpréteur est capable d'afficher les saisies ville, cp et adresse postées.


Pour simuler la première visite sur la page, effectuer au clavier F6+Entrer
Pour recharger la page (et répéter la dernière action effectuée), appuyez sur la touche F5 ou Ctrl+R

Afficher la page pour la première fois (cliquer sur l'url et faire entrer au clavier ou F6+Entrer) et recharger la page (F5 ou Ctrl+R) ne sont pas du tout pareil !

Vous avez sans doute dû déjà voir ce message :
explication PHP

Il est important de prendre le temps de le comprendre ! Ne vous contentez pas de l'approximatif, ayez toujours envie de comprendre précisément et creuser un sujet jusqu'au bout.

Ce message vous demande si vous êtes d'accord pour répéter la dernière action effectuée.
Si la dernière action était un POST (un clic sur le bouton submit), cela fera un 2e POST (comme un 2e clic sur le bouton submit).

Il était utile de porter un regard sur ces deux situations pour que vous en ayez connaissance (et prendre le temps de comprendre les mécanismes en détail) mais maintenant que c'est fait, bien entendu nous n'allons pas garder ces erreurs.

Nous allons prévoir une condition IF qui réglera tous nos problèmes, car il n'y a jamais de problèmes mais que des solutions !

Nous allons dire :
...Si l'internaute a posté quelque chose, tu me l'affiches.
Sinon rien (il n'y aura pas de sinon (else)).

Voici le code final :

formulaire1.php
		<?php
		if(!empty($_POST))
		{
			echo 'Recuperation des données saisies : 
'; echo 'ville : ' . $_POST['ville'] . '
'; echo 'cp : ' . $_POST['cp'] . '
'; echo 'adresse : ' . $_POST['adresse'] . '
'; } ?>










Quelques Explications :

Nous disons à l'interpréteur PHP : si le POST n'est pas (caractère "!") vide (c'est donc qu'il est rempli et que l'internaute a posté), à ce moment-là on peut afficher les saisies sur la page web.

Dans le cas où l'internaute arrive pour la 1ère fois sur la page web, l'interpréteur ignorera les lignes PHP de récupération puisqu'il ne rentrera pas dans la condition.

Pour être clair :

- La toute premiere fois quand on clique sur l'url et qu'on fait "entrer", nous ne rentrons pas dans le IF.
- Toutes les fois suivantes si nous cliquons sur le bouton "envoi", le code se ré-exécute et nous rentrons dans le IF.

Le texte contenu entre crochet est en liaison avec le name de l'élément HTML.

Résultat
explication PHP


Puisque toutes les superglobales sont ARRAY, nous pourrions également demandé un affichage avec l'aide de print_r :
		<?php
		if(!empty($_POST))
		{
			echo 'Recuperation des données saisies : 
'; echo 'ville : ' . $_POST['ville'] . '
'; echo 'cp : ' . $_POST['cp'] . '
'; echo 'adresse : ' . $_POST['adresse'] . '
'; echo '
'; print_r($_POST); echo '
'; } ?>
Résultat
clé valeur
ville Paris (saisie de l'internaute)
cp 75015 (saisie de l'internaute)
adresse 30 rue de la convention (saisie de l'internaute)

Formulaire modèle avec récupération de données $_POST

Si nous voulions ajouter la structure d'une page web (avec les entêtes, doctype, etc.), nous ferions comme ceci :

formulaireModele.php
	<?php
	$message = '';
	if(!empty($_POST))
	{
		$message .= 'Recuperation des données saisies : 
'; $message .= 'ville : ' . $_POST['ville'] . '
'; $message .= 'cp : ' . $_POST['cp'] . '
'; $message .= 'adresse : ' . $_POST['adresse'] . '
'; } ?> <!Doctype html> <html> <head> Ma Page <meta charset="utf-8"> </head> <body>
<?php echo $message; ?>









</body> </html>

$_POST permet de récupérer et d'afficher la saisie qui a été postée.

Dans le cadre d'une page web complète, nous mettons le code php le plus en haut possible : d'abord les traitements avant l'affichage (norme et architecture MVC).

Nous ne mettons plus d'instruction echo car sinon les informations s'afficheraient au dessus du doctype, leurs positionnements seraient assez contraignant et le code ne passerait pas la validation w3c.

Par conséquent, nous passons par une variable $message qui va retenir l'affichage (les messages seront affectés à la variable).

La variable $message ne sera pas affichée immédiatement mais un peu plus bas, à l'endroit de notre choix, dans les balises body /body afin de respecter la structure de la page web.

Vous pouvez garder ce formulaire comme modèle pour vos prochains développements avec la superglobale $_POST.

Sauvegarde des données venant d'un formulaire

Après avoir récupéré et affiché les saisies d'un formulaire que fait-on ?

Nous pourrions, plus tard, envoyer ces données dans une base de données (c'est comme cela que fonctionnent les pages d'inscription d'un site web).

Nous pourrions également afficher un message de confirmation à l'internaute pour dire que sa validation a été enregistrée.

Formulaire avec récupération de données $_POST sur 2 pages

Créons deux fichiers : formulaire2.html et formulaire3.php.

L'objectif sera d'avoir le formulaire HTML dans le fichier formulaire2.html et les traitements dans le fichier formulaire3.php

Nous prévoirons 2 champs : pseudo & email.

formulaire2.html
	<!Doctype html>
	<html>
		<head>
			Ma Page
			
			<meta charset="utf-8">
			
			
			
		</head>
		<body>
			






</body> </html>
Le fichier HTML formulaire2.html contient le formulaire, l'action pointe vers le fichier formulaire3.php.
Par conséquent, en cliquant sur le bouton submit, l'internaute sera automatiquement envoyé sur le fichier formulaire3.php.
C'est donc dans ce fichier formulaire3.php que nous ferons les traitements PHP.

formulaire3.php
	<?php
	if(!empty($_POST))
	{
		echo 'Recuperation des données saisies : 
'; echo 'pseudo : ' . $_POST['pseudo'] . '
'; echo 'email : ' . $_POST['email'] . '
'; } ?>

Sauvegarder les informations d'un formulaire dans un fichier texte

Votre dossier est composé de 2 fichiers :
------ formulaire2.html
------ formulaire3.php

Nous allons faire en sorte de sauvegarder les données saisies (postées par les internautes) dans un fichier texte qui sera généré à la volée.

Pour cela, utilisons les fonctions prédéfinie de PHP : fopen, fwrite, fclose.

Reprenons le code Html suivant :

formulaire2.html
		<!Doctype html>
		<html>
			<head>
				Ma Page
				
				<meta charset="utf-8">
				
				
				
			</head>
			<body>
				






</body> </html>

Et voici le code PHP correspondant:
formulaire3.php
		<?php
		if(!empty($_POST))
		{
			echo 'Recuperation des données saisies : 
'; echo 'pseudo : ' . $_POST['pseudo'] . '
'; echo 'email : ' . $_POST['email'] . '
'; $f = fopen("sauvegarde.txt","a"); fwrite($f, $_POST['pseudo'] . " - "); fwrite($f, $_POST['email'] . "\n"); $f = fclose($f); } ?>

La fonction prédéfinie fopen() permet d'ouvrir un fichier, ils attend 2 arguments, son nom et le mode d'ouverture.
Le mode "a" (que nous utilisons dans cet exemple) permet d'ouvrir le fichier, ou de le créer s'il n'est pas trouvé.
Le fichier est donc ouvert, ou bien créé + ouvert, la variable $f représente le fichier ouvert.
fwrite() permet d'écrire dans le fichier représenté par $f.
\n entre guillemets permet de passer à la ligne dans un fichier (équivalent de <br> dans une page web).
fclose(), n'est pas indispensable pour faire fonctionner l'exemple, cette fonction prédéfinie permet de fermer le fichier et ainsi libérer la ressource.

Après avoir posté un pseudo et un email, vous pouvez retourner dans votre dossier et vous devriez voir apparaitre un nouveau fichier nommé : sauvegarde.txt

/post/
------ formulaire2.html
------ formulaire3.php
------ sauvegarde.txt

Ouvrez le fichier sauvegarde.txt avec notepad, vous verrez que les enregistrements se trouvent à l'intérieur.

La 1ère fois le fichier est créé et ouvert, toutes les fois suivantes le fichier est simplement ouvert.

Contexte et cas d'utilisation : Si l'on souhaite enregistrer des membres à une newsletter et que l'on ne possède pas de BDD, il serait interessant de le faire via un fichier texte.

Résultat
explication PHP explication PHP

Lire dans une page web les informations contenues dans un fichier texte

Suite à l'exemple précédent, le fichier liste.txt a été créé (généré) et contient des informations (pseudo et email) suite à la validation de notre formulaire.

Nous pouvons effectuer l'opération inverse, c'est à dire, se connecter au fichier en php et lire les informations contenues dedans à l'intérieur :

lecture.php
		$nomFichier = "liste.txt"; 
		$fichier = file($nomFichier);  // la fonction file() fait tout le travail, elle retourne chaque ligne d'un fichier à des indices différents d'un tableau array.

		print "
"; print_r($fichier); print "
"; // Affichage du tableau Array dans sa structure. foreach($fichier as $ligne) // Parcours du tableau Array pour un affichage plus conventionnel. { echo $ligne."
"; } echo ''; echo implode($fichier, "
"); // Affichage du tableau Array avec un passage à la ligne.

Explications

$nomFichier représente le nom du fichier à explorer (il faut que le fichier existe et soit dans le même dossier de préférence).

file est une fonction PHP prédéfinie permettant d'ouvrir un fichier et de retourner son contenu sous forme de tableau ARRAY (chaque ligne représentera une nouvelle clé du tableau array). Nous lui transmettons la variable $nomFichier afin que le bon fichier soit ouvert.

print_r permet d'afficher le contenu et d'observer la structure du tableau Array

foreach permet de boucler et d'afficher toutes les informations du tableau Array

implode permet également d'afficher toutes les informations du tableau Array

Résultat
Avec print_r :

Array
(
    [0] => le pseudo posté
    [1] => l'email posté
)


Avec foreach :

le pseudo posté - l'email posté


Avec implode :

le pseudo posté - l'email posté


Créer un formulaire de contact et envoyer un email

Envoyer un email en PHP

Pour envoyer un email en PHP, il existe la fonction mail() très pratique.

La fonction mail prend 4 arguments (pas plus, pas moins) dans un ordre précis :

		<?php
		mail("monadressedereception@gmail.com", "Le sujet", "Le message", "adresseemailexpediteur@gmail.com"); 

Comme dans la plupart des fonctions, il faut respecter le NOMBRE et l'ORDRE des arguments que l'on transmet à une fonction prédéfinie de PHP.

La fonction mail() reçoit toujours 4 ARGUMENTS dans cet ordre précis : adresse email du destinataire, le sujet, le message, adresse email de l'expéditeur.

Bien entendu les adresses email doivent être valides, l'idéal est de privilégier gmail pour sa rapidité et sa flexibilité au niveau de la reception d'emails.

Si vous tester ce code en ligne (sur un hébergeur et une page web), ce code d'1 seule ligne fonctionnera instantanément.

Si vous êtes sous WAMP en localhost, vous devrez configurer légérement votre fichier php.ini.

Pour cela, rendez-vous dans wamp > php > php.ini :

explication PHP

Effectuer au clavier : Ctrl+F (édition>rechercher)
Rechercher la chaîne : "smtp".
Modifier la ligne smtp=localhost par votre SMTP.
Dans mon cas (j'ai la freebox), cela donnera : smtp=smtp.free.fr
Ensuite, vous pouvez effectuer un Ctrl+S (fichier>enregistrer)
Et pour finir : Alt+F4 (fermeture)

Une fois que vous avez modifié un fichier de configuration, pensez à redémarrer les services de wamp en cliquant sur l'icône "Redémarrer les services / Restart All services" :

explication PHP

Si vous avez un antivirus (firewall), il peut bloquer le port 25 et donc l'envoi d'email, il faudra peut être le configurer ou le désactiver le temps des tests (pareil pour le parefeu).

Si la configuration est difficile, n'hésitez pas à faire les tests directement sur internet (pour cela il faut posséder un hébergement).

Nous avons vu précédemment que la fonction mail() permettait d'envoyer un email.

Plutôt qu'avoir des valeurs fixes, nous pouvons gérer cela avec un formulaire d'envoi d'email ou un formulaire de contact (très répandu sur la plupart des sites).

Prenons ce formulaire HTML :

email1.php
		













Ajoutons le code PHP :

email1.php
		<?php
		if(!empty($_POST))
		{
			// affichage des saisies pour être sur de les obtenir avant de les exploiter.
			echo "destinataire : $_POST[destinataire] 
"; echo "sujet : $_POST[sujet]
"; echo "message : $_POST[message]
"; echo "expediteur : $_POST[expediteur]
"; // entête email $headers = 'MIME-Version: 1.0' . "\n"; $headers .= 'Content-type: text/html; charset=ISO-8859-1'."\n"; $headers .= 'Reply-To: ' . $_POST['expediteur'] . "\n"; $headers .= 'From: "' . ucfirst(substr($_POST['expediteur'], 0, strpos($_POST['expediteur'], '@'))) . '"<'.$_POST['expediteur'].'>' . "\n"; $headers .= 'Delivered-to: ' . $_POST['destinataire'] . "\n"; mail($_POST['destinataire'], $_POST['sujet'], $_POST['message'], $headers); } ?>













Dans cet exemple, nous prévoyons une condition IF permettant de dire "si l'internaute à posté".

Quelques instructions echo sont présentes afin d'avoir un affichage et ainsi être certain que les saisies soient bien récupérées.

Ensuite, par l'intermédiaire de la variable $headers une partie est en place pour définir les entêtes du mail :

MIME-Version (Multipurpose Internet Mail Extensions). Il s'agit d'un standard.
Seule la version 1 existe, cette ligne n'est donc pas destinée à changer.

Content-type permet de définir l'encodage et le format html.

Reply-To permet d'indiquer une adresse email de réponse.

From permet de préciser le nom de l'expediteur et l'adresse email de l'expéditeur
Cela pourrait être géré avec un champ prenom et nom dans le formulaire html, dans notre cas nous avons préféré isoler le pseudo de l'expéditeur (avant le caractère '@') avec la combinaison des fonctions substr (coupe une chaine), strpos (donne la position d'un caractère dans une chaine) et ucfirst (met la 1ère lettre en majuscule).

Delivered-to indique l'adresse du destinataire à qui l'email est adressé.

Ensuite, c'est bien la fonction mail qui permet d'envoyer le message :
1er argument : adresse email du destinataire.
2e argument : sujet / objet.
3e argument : message.
4e argument : adresse email de l'expéditeur avec les entêtes.
Nous utiliserons $headers (plus complet en informations et qui contient $_POST['expediteur']) plutôt que $_POST['expediteur'] tout seul (contenant seulement l'adresse email de l'expéditeur).

Faites le test !
Vous pouvez aussi saisir du html :
Bonjour!
Résultat
explication PHP

explication PHP

explication PHP


Et oui, vous pouvez prendre l'adresse email de nimporte qui. On peut toujours réver !

Mais ce n'est pas le but, restez sage, pas d'usurpation d'identité sauf si c'est pour rire que ça ne porte préjudice à personne ;)

Les entêtes complet d'un email

En théorie, pour envoyer un email de qualité (et mettre toutes les chances de votre côté pour que celui-ci ne soit pas catégorisé en spam chez vos internautes), vous devrez communiquer avec un serveur SMTP en lui fournissant certaines informations.

Voici un tableau récapitulatif :

Entête Description
Subject Le sujet/objet du message.
From Adresse email de l'auteur du message.
Sender Adresse email de l'expéditeur (souvent la même que From, sauf si l'envoyeur est différent de celui qui a écrit le message).
Reply-To Adresse email de réponse au message (pratique pour communiquer avec un site web lors d'envoi de mail automatique).
To Listing des adresse(s) email(s) des destinataire(s) direct du message (un même email peut être envoyé à plusieurs personnes).
Cc
Carbon copy
Listing des adresse(s) email(s) des destinataire(s) en copie du message.
Bcc
Blind carbon copy
Listing des adresse(s) email(s) des destinataire(s) en copie invisible du message.
Message-ID Code unique d'identification du message.
In-Reply-To Représente l'id du message (pratique pour grouper des échanges d'emails et en faire des conversations)
References Représente l'id de la conversation (lors d'échanges emails).
Comments Commentaires éventuels en lien avec le message.
X-Mailer Messagerie ou Logiciel émetteur du message.
Keywords Mots-clés devrivant le message.
Date Date et heure d'expédition.
MIME-Version Version MIME du mail (seule la version 1.0 existe).
Priority Niveau de priorité du mail.
Content-Type Type de message (par exemple : html ou texte).
Content-transfer-encoding Encodage du message.
Content-Description Description du message.

Créer un formulaire de contact et envoyer un email en PHP pour son site web

Si vous souhaitez être la seule personne à recevoir des emails, il suffit de retirer la case destinataire du formulaire HTML et adapter légérement le code PHP en conséquence :

Ajoutons le code PHP :

email2.php
		<?php
		if(!empty($_POST))
		{
			// affichage des saisies pour être sur de les obtenir avant de les exploiter.
			echo "sujet : $_POST[sujet] 
"; echo "message : $_POST[message]
"; echo "expediteur : $_POST[expediteur]
"; // entête email $headers = 'MIME-Version: 1.0' . "\n"; $headers .= 'Content-type: text/html; charset=ISO-8859-1'."\n"; $headers .= 'Reply-To: ' . $_POST['expediteur'] . "\n"; $headers .= 'From: "' . ucfirst(substr($_POST['expediteur'], 0, strpos($_POST['expediteur'], '@'))) . '"<'.$_POST['expediteur'].'>' . "\n"; $headers .= 'Delivered-to: monadresse@gmail.com' . "\n"; mail("monadresse@gmail.com", $_POST['sujet'], $_POST['message'], $headers); } ?>










Résultat
explication PHP


Nous n'utilisons pas le $_POST['destinataire'], puisque ce sera toujours vous, nous avons retiré la case de saisie du formulaire HTML.

Ceci est mieux que l'utilisation d'un mailto() dans la mesure où votre adresse (dans le code php exécuté côté serveur) ne sera pas visible par les robots et vous ne risquerez pas d'être spammé !

Créer un formulaire de contact et envoyer un email en PHP avec plusieurs informations

Si vous souhaitez ajouter récolter d'autres informations sur l'internaute, il suffit d'ajouter d'autres champs de formulaire HTML et de prévoir le code de récupération en PHP :

Prenons ce code :

email3.php
		<?php
		if(!empty($_POST))
		{
			// affichage des saisies pour être sur de les obtenir avant de les exploiter.
			echo "expediteur : $_POST[expediteur] 
"; echo "nom : $_POST[nom]
"; echo "prenom : $_POST[prenom]
"; echo "societe : $_POST[societe]
"; echo "sujet : $_POST[sujet]
"; echo "message : $_POST[message]
"; // entête email $headers = 'MIME-Version: 1.0' . "\n"; $headers .= 'Content-type: text/html; charset=ISO-8859-1'."\n"; $headers .= 'Reply-To: ' . $_POST['expediteur'] . "\n"; $headers .= 'From: "' . ucfirst(substr($_POST['expediteur'], 0, strpos($_POST['expediteur'], '@'))) . '"<'.$_POST['expediteur'].'>' . "\n"; $headers .= 'Delivered-to: monadresse@gmail.com' . "\n"; $message = "Nom : " . $_POST['nom'] . "\nPrénom : " . $_POST['prenom'] . "\nSociété : " . $_POST['societe'] . "\nMessage : " . $_POST['message']; mail("monadresse@gmail.com", $_POST['sujet'], $message, $headers); } ?>



















Résultat
explication PHP


fléche Attention
Nous ne pouvons pas ajouter plus d'arguments à la fonction mail() et par conséquent nous ne pouvons pas lui passer tous les $_POST de notre formulaire.


Notre code permet de mettre toutes les informations à l'intérieur de $_POST['message']. Et puisqu'on le redéfinit, il ne faut pas oublier de ré-affecter le message lui même.