L envoi d un formulaire par courriel Configuration requise... 236 Mail Texte... 237 Mail HTML... 242 Check-list... 248
Chapitre 9 L envoi d un formulaire par courriel L envoi par courriel d informations en provenance d un formulaire est certainement l utilisation la plus répandue de PHP. Vous verrez dans ce chapitre que PHP vous facilite largement la tâche pour les envois les plus simples. Vous constaterez en revanche que les courriels mis en forme (HTML) nécessitent davantage de connaissances, notamment en ce qui concerne le standard MIME. 9.1. Configuration requise Alors que l envoi de courriel ne nécessite aucune configuration particulière si vos scripts sont exécutés chez un hébergeur, il en va tout autrement s ils sont placés sur votre machine. Arrêtons-nous un instant sur les adaptations à apporter à votre environnement de travail pour le rendre compatible avec l envoi de courriels. Hébergements gratuits Certains hébergeurs gratuits interdisent l usage de la commande mail() afin d éviter les abus de type spam. N hésitez donc pas, avant de choisir un hébergeur, à vous renseigner sur l étendue des limitations au niveau des fonctionnalités du langage. Si votre version de WampServer n est pas suffisamment récente, vous pourrez 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 = me@example.com La ligne SMTP = localhost indique que PHP est paramétré pour utiliser votre propre machine (localhost) pour l envoi des courriels. Il s agit là de la directive de configuration par défaut qui est loin de convenir. Le serveur que vous devez utiliser est celui qui est proposé par votre fournisseur d accès. Il s agit du serveur SMTP par lequel vous passez également dans votre gestionnaire de courriels (par exemple, Outlook Express, Thunderbird, etc.). Chez Free, le serveur SMTP a pour adresse 236 LE GUIDE COMPLET
Mail Texte Chapitre 9 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 = me@example.com. Le point-virgule initial signifie qu elle est commentée et qu elle n est donc pas prise en compte. Cette directive permet 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 est pas précisée. Veillez donc à supprimer le point-virgule et à renseigner votre adresse e-mail. Une fois ces directives de configuration modifiées, le serveur Apache doit être redémarré. Accès restreints Les FAI n autorisent que leurs clients à utiliser leur serveur SMTP. Un client Wanadoo ne pourra en aucun cas passer par smtp.free.fr. Cette situation peut se révéler pénible si vous travaillez sur un portable et que le fournisseur d accès change d un lieu à un autre. Une solution consiste à passer par un serveur SMTP gratuit qui vous autorisera à transmettre des courriels quelle que soit votre connexion à Internet. Google propose désormais ce service à l ensemble de ses clients Gmail (www.gmail.com). 9.2. Mail Texte Comme vous l avez vu en introduction, l envoi de courriels en PHP est simple. 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); LE GUIDE COMPLET 237
Chapitre 9 L envoi d un formulaire par courriel j $email est l e-mail de la personne qui va recevoir le courriel, par exemple $destinataire = "bill@domaine.fr";. 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 les informations. La fonction mail() retourne un booléen qui indique si l envoi s est bien déroulé. Ce statut ne concerne que l envoi, il n indique en aucun cas 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 des informations à la fin de la variable (.=). Vous remarquez l usage systématique du caractère \n à la fin de chaque ligne. Il s agit du caractère représentant un saut de ligne. Jusqu à maintenant, vous utilisiez la balise <BR/> pour effectuer des sauts de ligne car les informations générées par vos scripts s affichaient dans 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 Thunderbird ou Outlook) qui va afficher l information. Cette fois, les données sont considérées comme du texte brut. Le caractère de saut de ligne est alors représenté par un \n (ou \r\n sous Windows). Il existe d autres caractères spéciaux qui peuvent être utilisés dans du texte brut, par exemple le \t qui correspond à une tabulation. 238 LE GUIDE COMPLET
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 LE GUIDE COMPLET 239
Chapitre 9 L envoi d un formulaire par courriel 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 = "fx@kernix.com"; $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
Mail Texte Chapitre 9 Figure 9.1 : Message envoyé par le script et visualisé avec Thunderbird Présentation des courriels en mode texte Certains gestionnaires de courriels reconnaissent en mode texte des balises qui permettent d enrichir visuellement le contenu. Un mot peut ainsi être passé en gras s il est entouré d astérisques (*), en souligné avec d_et en italique avec /. Figure 9.2 : Mise en forme minimale dans un courriel en mode texte LE GUIDE COMPLET 241
Chapitre 9 L envoi d un formulaire par courriel 9.3. Mail HTML Le script que vous venez d écrire ne permet d envoyer un courriel qu au format 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 œuvre du quatrième paramètre de la fonction mail(). Ce paramètre est une chaî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 le corps du message. L en-tête contient un certain nombre d informations sur le courriel : son origine, le destinataire, le format, le sujet, l heure d envoi, le logiciel d envoi. L organisation des données dans cet en-tête est très simple : champs1: valeur1 champs2: valeur2 etc. Voyez cet exemple d en-tête de courriel : From: michel@toto.fr To: Paul@titi.fr Subject: retour de vacances X-Mailer: Microsoft Outlook Express Figure 9.3 : Partie de l en-tête d un courriel (vu avec Outlook Express) La commande mail() compose donc un en-tête par défaut en intégrant les données passées en paramètres : le destinataire (To:), le sujet 242 LE GUIDE COMPLET
(Subject:). Le quatrième paramètre permet d ajouter certaines informations à cet en-tête. Il est courant qu une personne recevant un courriel émanant d un script PHP ne sache pas qui lui a envoyé. En ajoutant "From: michel@toto.fr" comme quatrième paramètre, le destinataire est en mesure de connaître l origine du courriel. Les lignes contenues dans le quatrième paramètre doivent être séparées par des sauts de ligne : \n. Ajoutez également une adresse de réponse (Reply To) différente de l adresse de l émetteur (From): mail("paul@host.com","retour de vacances","excellent", "From: michel@toto.fr\nreply-to: eric@toto.fr"); C est aussi grâce à l en-tête que vous allez être en mesure de dire au gestionnaire 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ête indiquent que le courriel n est pas du simple texte. MIME-Version: 1.0 Content-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. --B97C1230 Content-Type: text/html; charset="iso-8859-1" et suivi de : --B97C1230-- end of the multi-part Mail HTML Chapitre 9 La valeur "B97C1230", que l on retrouve en trois endroits, est une valeur à la fois aléatoire et unique. Il est possible de calculer une valeur unique 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>"); LE GUIDE COMPLET 243
Chapitre 9 L envoi d un formulaire par courriel Figure 9.4 : Liste de 20 valeurs uniques Envoyez votre premier courriel en HTML : <?php $boundary = md5(uniqid(rand())); $header = ""; $header.= "From: php <test@mondomaine.com>\n"; $header.= "Reply-To: reply@mondomaine.com\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"; 244 LE GUIDE COMPLET
Mail HTML Chapitre 9 mail("test@kernix.com",$sujet,$html,$header); print("courriel envoyé...");?> Le résultat correspond tout à fait à vos attentes : Figure 9.5 : Un premier courriel HTML Pour voir comment la fonction a organisé les données, vous pouvez afficher les sources du courriel : Vous retrouvez bien tous les éléments transmis. Figure 9.6 : Source du courriel HTML LE GUIDE COMPLET 245
Chapitre 9 L envoi d un formulaire par courriel Images et courriels Il est possible de joindre les images composant le courriel dans le contenu même de ce dernier. Cette méthode complexe n est cependant pas obligatoire. Il est préférable de placer les images sur un serveur d hébergement accessible sur le Net et d y faire appel en utilisant le chemin absolu, par exemple : <img src="http://server.com/img/titre.gif" />. Reprenez votre exemple d envoi de profil en ajoutant la dimension HTML : Listing 9-3 : Envoi des informations dans un courriel HTML $destinataire = "test@kernix.com"; $titre = "réponse au formulaire"; $boundary = md5(uniqid(rand())); $header = ""; $header.= "From: script php <test@mondomaine.com>\n"; $header.= "Reply-To: reply@mondomaine.com \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
Mail HTML Chapitre 9 if (mail($destinataire,$titre,$message,$header)==true) { print("<hr/>les informations ont bien été transmises."); else { die("<hr/>l envoi du courriel a échoué."); Figure 9.7 : Courriel en HTML 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 un cinquième paramètre optionnel à la fonction mail(). Ce paramètre permet de transmettre des «instructions» au logiciel qui va se charger d envoyer le courriel sur le Net. Parmi les commandes intéressantes, on trouve essentiellement " f$adr", où $adr correspond à l e-mail de la personne 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 serveurs SMTP qui refusent les courriels dont l origine n est pas précisée. Ce paramètre n est pas disponible si PHP est configuré en safe_mode. LE GUIDE COMPLET 247
Chapitre 9 L envoi d un formulaire par courriel 9.4. Check-list j j j j L envoi de courriels en PHP est une opération très simple. Les courriels contenant de la couleur ou des images nécessitent la modification de l en-tête du courriel. L en-tête du courriel permet également de préciser son origine (From), l adresse e-mail de retour et une multitude d autres informations. Le cinquième paramètre de la fonction mail() est très utile pour récupérer les messages d erreur. 248 LE GUIDE COMPLET