14
L’envoi d’un formulaire par courriel Configuration requise ........................................................................................................ 236 Mail Texte ............................................................................................................................. 237 Mail HTML ........................................................................................................................... 242 Check-list ............................................................................................................................. 248

L’envoid’un formulaire parcourriel

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: L’envoid’un formulaire parcourriel

L’envoi d’unformulairepar courriel

Configuration requise ........................................................................................................ 236Mail Texte ............................................................................................................................. 237Mail HTML ........................................................................................................................... 242Check-list ............................................................................................................................. 248

Page 2: L’envoid’un formulaire parcourriel

L’envoi par courriel d’informations en provenance d’un formulaire estcertainement l’utilisation la plus répandue de PHP. Vous verrez dans cechapitre que PHP vous facilite largement la tâche pour les envois lesplus simples. Vous constaterez en revanche que les courriels mis enforme (HTML) nécessitent davantage de connaissances, notamment ence qui concerne le standard MIME.

9.1. Configuration requiseAlors que l’envoi de courriel ne nécessite aucune configurationparticulière si vos scripts sont exécutés chez un hébergeur, il en va toutautrement s’ils sont placés sur votre machine. Arrêtons-nous un instantsur les adaptations à apporter à votre environnement de travail pour lerendre compatible avec l’envoi de courriels.

Hébergements gratuits

Certains hébergeurs gratuits interdisent l’usage de la commandemail() afin d’éviter les abus de type spam. N’hésitez donc pas, avantde choisir un hébergeur, à vous renseigner sur l’étendue des limitationsau niveau des fonctionnalités du langage.

Si votre version de WampServer n’est pas suffisamment récente, vouspourrez découvrir, en parcourant le fichier php.ini, la section suivante :

Listing 9-1 : section consacrée à l’envoi de courriels dans le fichier php.ini[mail function]; For Win32 only.SMTP = localhost

; For Win32 only.;sendmail_from = [email protected]

La ligne SMTP = localhost indique que PHP est paramétré pourutiliser votre propre machine (localhost) pour l’envoi des courriels. Ils’agit là de la directive de configuration par défaut qui est loin deconvenir.

Le serveur que vous devez utiliser est celui qui est proposé par votrefournisseur d’accès. Il s’agit du serveur SMTP par lequel vous passezégalement dans votre gestionnaire de courriels (par exemple, OutlookExpress, Thunderbird, etc.). Chez Free, le serveur SMTP a pour adresse

236 LE GUIDE COMPLET

L’envoi d’un formulaire par courrielChapitre 9

Page 3: L’envoid’un formulaire parcourriel

smtp.free.fr. Cette norme est à peu près respectée par l’ensemble des FAI(fournisseurs d’accès à Internet). Nous pouvons citer à titre d’exemple :smtp.wanadoo.fr, smtp.noos.fr, smtp.club-internet.fr, etc.

Intéressons-nous maintenant à la ligne ;sendmail_from [email protected]. Le point-virgule initial signifie qu’elle estcommentée et qu’elle n’est donc pas prise en compte. Cette directivepermet de préciser l’origine des courriels envoyés depuis votre machine.Cette directive est importante dans la mesure où les serveurs de courriels« relais » refuseront de faire suivre votre message si son origine n’estpas précisée. Veillez donc à supprimer le point-virgule et à renseignervotre adresse e-mail.

Une fois ces directives de configuration modifiées, le serveur Apachedoit être redémarré.

Accès restreints

Les FAI n’autorisent que leurs clients à utiliser leur serveur SMTP. Unclient Wanadoo ne pourra en aucun cas passer par smtp.free.fr. Cettesituation peut se révéler pénible si vous travaillez sur un portable et quele fournisseur d’accès change d’un lieu à un autre. Une solution consisteà passer par un serveur SMTP gratuit qui vous autorisera à transmettredes courriels quelle que soit votre connexion à Internet. Google proposedésormais ce service à l’ensemble de ses clients Gmail (www.gmail.com).

9.2. Mail TexteComme vous l’avez vu en introduction, l’envoi de courriels en PHP estsimple. Il suffit d’utiliser la fonction mail().

Les arguments de cette fonction sont :

j l’adresse de destination ;j le titre du message ;j le contenu du message ;j d’éventuelles options.

La fonction mail() est généralement appelée de la manière suivante :mail($destinataire,$titre,$message);

Mail Texte Chapitre 9

237LE GUIDE COMPLET

Page 4: L’envoid’un formulaire parcourriel

j $email est l’e-mail de la personne qui va recevoir le courriel, parexemple $destinataire = "[email protected]";.

j $titre est le titre de l’e-mail, par exemple $titre ="réponse au formulaire";.

j $message est le corps du message qui va contenir toutes lesinformations.

La fonction mail() retourne un booléen qui indique si l’envoi s’estbien déroulé. Ce statut ne concerne que l’envoi, il n’indique en aucuncas le fait que le courriel est bien arrivé dans la boîte du destinataire.

Commencez par construire ce message :

Listing 9-2 : Construction du contenu du courriel$message = "";$message .= "Titre : ".$_REQUEST[’titre’]."\n";$str_genre = join(’,’,$_REQUEST[’genre’]);$message .= "Genre : ".$str_genre."\n");$message .= "Description : ".$_REQUEST[’description’]."\n");$message .= "Couleur : ".$_REQUEST[’couleur’]."\n");$message .= "Pays : ".$_REQUEST[’pays’]."\n");$str_soustitre = join(’,’,$_REQUEST[’soustitre’]);$message .= "Sous titres : ".$str_soustitre."\n";

La première ligne initialise la variable (=), les suivantes ajoutent desinformations à la fin de la variable (.=).

Vous remarquez l’usage systématique du caractère \n à la fin de chaqueligne. Il s’agit du caractère représentant un saut de ligne.

Jusqu’à maintenant, vous utilisiez la balise <BR/> pour effectuer dessauts de ligne car les informations générées par vos scripts s’affichaientdans un navigateur web. Or, en HTML, un saut de ligne est représentépar la balise <BR/>.

Dans le cas présent, c’est un lecteur de courriels (de type Thunderbirdou Outlook) qui va afficher l’information. Cette fois, les données sontconsidérées comme du texte brut. Le caractère de saut de ligne est alorsreprésenté par un \n (ou \r\n sous Windows). Il existe d’autrescaractères spéciaux qui peuvent être utilisés dans du texte brut, parexemple le \t qui correspond à une tabulation.

238 LE GUIDE COMPLET

L’envoi d’un formulaire par courrielChapitre 9

Page 5: L’envoid’un formulaire parcourriel

Votre script prend finalement la forme suivante :<?php

function verif(){

$erreur = "";

if (strlen($_REQUEST[’titre’])<=2)$erreur .= "- le champ titre est mal rempli<br/>";

if( strlen($_REQUEST[’description’])<=10 ||strlen($_REQUEST[’description’])>=500)$erreur .= "- le champ description est mal rempli<br/>";

if ($_REQUEST[’annee’]<1930 || $_REQUEST[’annee’]>2006)$erreur .= "- le champ année est mal rempli<br/>";

if ($_REQUEST[’couleur’]!=0 && $_REQUEST[’couleur’]!=1)$erreur .= "- le champ couleur est mal rempli<br/>";

$tableau_pays = array(’fr’,’us’,’gb’);if (in_array($_REQUEST[’pays’],$tableau_pays)==false)

$erreur .= "- le champ pays est mal rempli<br/>";

if (is_array($_REQUEST[’genre’])==false ||count($_REQUEST[’genre’])<1) {

$erreur .= "- le genre n’est pas correct<br/>";}else {

$tableau_genre = array(’policier’,’sf’,’culte’);foreach ($_REQUEST[’genre’] as $tmp) {

if (in_array($tmp,$tableau_genre)==false)$erreur .= "- le genre $tmp n’est pas correct<br/>";

}}

if (is_array($_REQUEST[’soustitre’])==false ||count($_REQUEST[’soustitre’])<1) {

$erreur .= "- le sous-titre n’est pas correct<br/>";}else {

$tableau_soustitre = array(’fr’,’gb’,’es’);foreach ($_REQUEST[’soustitre’] as $tmp) {

if (in_array($tmp,$tableau_soustitre)==false)$erreur .= "- le sous-titre $tmp n’est pas✂ correct<br/>";

}}

if (!empty($erreur)) {

Mail Texte Chapitre 9

239LE GUIDE COMPLET

Page 6: L’envoid’un formulaire parcourriel

print($erreur);return false;

}

return true;

}

if (verif()==false) exit(0);

print("<b>Titre</b> : ".$_REQUEST[’titre’]."<br/>");print("<b>Année</b> : ".$_REQUEST[’annee’]."<br/>");$str_genre = join(’,’,$_REQUEST[’genre’]);print("<b>Genre</b> : ".$str_genre."<br/>");print("<b>Description</b> : ".$_REQUEST[’description’]."<br/>");print("<b>Couleur</b> : ".$_REQUEST[’couleur’]."<br/>");print("<b>Pays</b> : ".$_REQUEST[’pays’]."<br/>");$str_soustitre = join(’,’,$_REQUEST[’soustitre’]);print("<b>Sous titres</b> : ".$str_soustitre."<br/>");

$destinataire = "[email protected]";$titre = "réponse au formulaire";

$message = "";$message .= "Titre : ".$_REQUEST[’titre’]."\n";$message .= "Année : ".$_REQUEST[’annee’]."\n";$str_genre = join(’,’,$_REQUEST[’genre’]);$message .= "Genre : ".$str_genre."\n";$message .= "Description : ".$_REQUEST[’description’]."\n";$message .= "Couleur : ".$_REQUEST[’couleur’]."\n";$message .= "Pays : ".$_REQUEST[’pays’]."\n";$str_soustitre = join(’,’,$_REQUEST[’soustitre’]);$message .= "Sous titres : ".$str_soustitre."\n";

if (mail($destinataire,$titre,$message)==true) {print("<hr/>Les informations ont bien été transmises.");

}else {

die("<hr/>L’envoi du courriel a échoué.");}

?>

240 LE GUIDE COMPLET

L’envoi d’un formulaire par courrielChapitre 9

Page 7: L’envoid’un formulaire parcourriel

Présentation des courriels en mode texte

Certains gestionnaires de courriels reconnaissent en mode texte desbalises qui permettent d’enrichir visuellement le contenu. Un mot peutainsi être passé en gras s’il est entouré d’astérisques (*), en soulignéavec d _ et en italique avec /.

Figure 9.1 : Message envoyé par le script et visualisé avec Thunderbird

Figure 9.2 : Mise en forme minimale dans un courriel en mode texte

Mail Texte Chapitre 9

241LE GUIDE COMPLET

Page 8: L’envoid’un formulaire parcourriel

9.3. Mail HTMLLe script que vous venez d’écrire ne permet d’envoyer un courriel qu’auformat texte.

Mettre une page HTML dans le corps du message ne fonctionnerait pas.L’émission d’un courriel au format HTML nécessite la mise en œuvredu quatrième paramètre de la fonction mail(). Ce paramètre est unechaîne de caractères contenant des informations qui seront ajoutées àl’en-tête (header) du message.

Un courriel est composé de deux parties principales : l’en-tête et lecorps du message. L’en-tête contient un certain nombre d’informationssur le courriel : son origine, le destinataire, le format, le sujet, l’heured’envoi, le logiciel d’envoi.

L’organisation des données dans cet en-tête est très simple :champs1: valeur1champs2: valeur2etc.

Voyez cet exemple d’en-tête de courriel :From: [email protected]: [email protected]: retour de vacancesX-Mailer: Microsoft Outlook Express

La commande mail() compose donc un en-tête par défaut en intégrantles données passées en paramètres : le destinataire (To:), le sujet

Figure 9.3 :Partie de l’en-tête d’un courriel (vu avecOutlook Express)

242 LE GUIDE COMPLET

L’envoi d’un formulaire par courrielChapitre 9

Page 9: L’envoid’un formulaire parcourriel

(Subject:). Le quatrième paramètre permet d’ajouter certainesinformations à cet en-tête.

Il est courant qu’une personne recevant un courriel émanant d’un scriptPHP ne sache pas qui lui a envoyé. En ajoutant "From:[email protected]" comme quatrième paramètre, le destinataire est enmesure de connaître l’origine du courriel.

Les lignes contenues dans le quatrième paramètre doivent être séparéespar des sauts de ligne : \n.

Ajoutez également une adresse de réponse (Reply−To) différente del’adresse de l’émetteur (From) :mail("[email protected]","retour de vacances","excellent",

"From: [email protected]\nReply-To: [email protected]");

C’est aussi grâce à l’en-tête que vous allez être en mesure de dire augestionnaire de courriels que le message qu’il a reçu doit être considérécomme une page HTML. Les deux lignes suivantes dans l’en-têteindiquent que le courriel n’est pas du simple texte.MIME-Version: 1.0Content-Type: multipart/alternative; boundary=B97C1230

Le corps du courriel doit lui aussi être construit de manière spécifique.Le contenu HTML doit être précédé de :This is a multi-part message in MIME format.--B97C1230Content-Type: text/html; charset="iso-8859-1"

… et suivi de :--B97C1230--end of the multi-part

La valeur "B97C1230", que l’on retrouve en trois endroits, est unevaleur à la fois aléatoire et unique. Il est possible de calculer une valeurunique en PHP de la façon suivante :$val_unique = md5(uniqid(rand()));

Affichez une liste de 20 valeurs uniques générées avec cette technique :for ($i=1;$i<=20;$i++){

$unique = md5(uniqid(rand()));print("$i - $unique<br>");

}

Mail HTML Chapitre 9

243LE GUIDE COMPLET

Page 10: L’envoid’un formulaire parcourriel

Envoyez votre premier courriel en HTML :<?php

$boundary = md5(uniqid(rand()));

$header = "";$header .= "From: php <[email protected]>\n";$header .= "Reply-To: [email protected]\n";$header .= "MIME-Version: 1.0\n";$header .= "Content-Type: multipart/alternative;✂ boundary=$boundary\n";

$sujet = "test d’envoi HTML";

$html = "\nThis is a multi-part message in MIME format.";$html .= "\n--$boundary\nContent-Type: text/html;✂ charset=\"iso-8859-1\"\n\n";$html .= "<html><body>\n";$html .= "<br><br><center><h2><font color=’red’>premier✂ courriel HTML</font></h2>\n";$html .= "</body></html>\n";$html .= "\n--$boundary--\n end of the multi-part";

Figure 9.4 : Liste de 20 valeurs uniques

244 LE GUIDE COMPLET

L’envoi d’un formulaire par courrielChapitre 9

Page 11: L’envoid’un formulaire parcourriel

mail("[email protected]",$sujet,$html,$header);

print("courriel envoyé ...");

?>

Le résultat correspond tout à fait à vos attentes :

Pour voir comment la fonction a organisé les données, vous pouvezafficher les sources du courriel :

Vous retrouvez bien tous les éléments transmis.

Figure 9.5 :Un premier courrielHTML

Figure 9.6 :Source du courriel HTML

Mail HTML Chapitre 9

245LE GUIDE COMPLET

Page 12: L’envoid’un formulaire parcourriel

Images et courriels

Il est possible de joindre les images composant le courriel dans lecontenu même de ce dernier. Cette méthode complexe n’est cependantpas obligatoire. Il est préférable de placer les images sur un serveurd’hébergement accessible sur le Net et d’y faire appel en utilisant lechemin absolu, par exemple :<img src="http://server.com/img/titre.gif" />.

Reprenez votre exemple d’envoi de profil en ajoutant la dimensionHTML :

Listing 9-3 : Envoi des informations dans un courriel HTML$destinataire = "[email protected]";

$titre = "réponse au formulaire";

$boundary = md5(uniqid(rand()));

$header = "";$header .= "From: script php <[email protected]>\n";$header .= "Reply-To: [email protected] \n";$header .= "MIME-Version: 1.0\n";$header .= "Content-Type: multipart/alternative;✂ boundary=$boundary\n";

$message = "";$message .= "\nThis is a multi-part message in MIME format.";$message .= "\n--$boundary\nContent-Type: text/html;✂ charset=\"iso-8859-1\"\n\n";$message .= "<html><body>\n";$message .= "<b>Titre</b> : <font color=’red’>".$_REQUEST✂ [’titre’]."</font><br/>\n";$message .= "<b>Année</b> : ".$_REQUEST[’annee’]."<br/>\n";$str_genre = join(’,’,$_REQUEST[’genre’]);$message .= "<b>Genre</b> : ".$str_genre."<br/>\n";$message .= "<b>Description</b> : ".$_REQUEST✂ [’description’]."<br/>\n";$message .= "<b>Couleur</b> : ".$_REQUEST[’couleur’]✂ ."<br/>\n";$message .= "<b>Pays</b> : ".$_REQUEST[’pays’]."<br/>\n";$str_soustitre = join(’,’,$_REQUEST[’soustitre’]);$message .= "<b>Sous-titres</b> : <i>".$str_soustitre✂ ."</i><br/>\n";$message .= "</body></html>\n";$message .= "\n--$boundary--\n end of the multi-part";

246 LE GUIDE COMPLET

L’envoi d’un formulaire par courrielChapitre 9

Page 13: L’envoid’un formulaire parcourriel

if (mail($destinataire,$titre,$message,$header)==true) {print("<hr/>Les informations ont bien été transmises.");

}else {

die("<hr/>L’envoi du courriel a échoué.");}

Tous les champs sont maintenant bien renseignés (voir le champ From).

Le cinquième paramètre

Les versions les plus récentes de PHP (supérieures à 4.0.5) ajoutent uncinquième paramètre optionnel à la fonction mail(). Ce paramètrepermet de transmettre des « instructions » au logiciel qui va se chargerd’envoyer le courriel sur le Net. Parmi les commandes intéressantes, ontrouve essentiellement "−f$adr", où $adr correspond à l’e-mail de lapersonne qui recevra un message d’erreur si le courriel ne peut arriver àdestination. La fonction mail() s’utilise alors comme suit :mail($destinataire,$titre,$message,$header,"−f$adr");.Ce paramètre permet aussi d’éviter certaines erreurs avec les serveursSMTP qui refusent les courriels dont l’origine n’est pas précisée. Ceparamètre n’est pas disponible si PHP est configuré en safe_mode.

Figure 9.7 : Courriel en HTML

Mail HTML Chapitre 9

247LE GUIDE COMPLET

Page 14: L’envoid’un formulaire parcourriel

9.4. Check-listj L’envoi de courriels en PHP est une opération très simple.j Les courriels contenant de la couleur ou des images nécessitent la

modification de l’en-tête du courriel.j L’en-tête du courriel permet également de préciser son origine

(From), l’adresse e-mail de retour et une multitude d’autresinformations.

j Le cinquième paramètre de la fonction mail() est très utile pourrécupérer les messages d’erreur.

248 LE GUIDE COMPLET

L’envoi d’un formulaire par courrielChapitre 9