Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox

Créer un formulaire d'envoi de mail avec image de protection

Compatible PHP. Cliquer pour en savoir plus sur les compatibilités.Par mEga, le 13 août 2005

Intérêt : empecher votre formulaire d'etre détourné par des spambots.

Création d'une image avec un texte changeant de manière dynamique.

Nous allons commencer par créer une image qui génèrera de façon aléatoire une chaine de 5 caractères choisis parmi une liste définie.

<?php
/* Démarage d'une session nécéssaire pour récupérer la valeur générée d'une page a l'autre */
session_start();
/* on définie la liste qui va servir a récupérer les lettres qui formeront la valeur a saisir : on exclue le 0 (zéro) pour eviter la confusion avec le O */
$liste = "abcdefghijklmnopqrstuvwxyz123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/* On créer une valeur qui sera notre code secret a saisir */
$code = '';
/* On crée une boucle pour créer une chaine de 5 caractères pris au hasard au sein de la variable $liste */
while(strlen($code) != 5) {
$code .= $liste[rand(0,63)];
}
/* on définit une variable de session nomée $_SESSION['code'] que l'on réutilisera plus tard */
$_SESSION['code']=$code;
/* on crée une image de 50 pixels par 20 pixels */
$larg = 50;
$haut =20;
$img = imageCreate($larg, $haut);
$rouge = imageColorAllocate($img,255,0,0);
$noir = imageColorAllocate($img,0,0,0);
$code_police=5;
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', false); 
header("Content-type: image/jpeg");
/* incorporation de la variable variable $code dans l'image */
imageString($img, $code_police,($larg-imageFontWidth($code_police)*strlen("".$code.""))/2,0, $code,$noir);
/* on crée une image de relative mauvaise qualité (ici 23% d'une image normale pour eviter la reconnaissance visuelle de certains robots */
imagejpeg($img,'',23);
imageDestroy($img);
?>

Enregistrez votre fichier sous le nom de cryptimage.php par exemple. Notez que la taille de l'image importe peu, vous pouvez modifer a votre guise les valeurs $larg et $haut.

Création du formulaire de contact.

Nous allons créer un formulaire avec un champ select avec deux adresses différentes en incorporant l'image.

<form action="contactmail.php" method="post" name="contactmail" id="contactmail">
<p>
<label for="mail">Votre adresse mail :</label><br />
<input type="text" id="mail" name="mail" size="20" maxlength="100"/><br />
<label for="objet">Objet du mail :</label><br />
<input name="objet" type="text" size="20" maxlength="100" /><br />
<label for="msg">Texte du mail :</label><br />
<textarea name="msg" cols="40" rows="4"></textarea><br />
<img src="cryptimage.php" alt="image de securisation du formulaire" title="image de securisation du formulaire" /><br />
<label for="verif">Merci de recopier la combinaison ci dessus dans le champ qui suit :</label><br />
<input type="text" name="verif" size="10" maxlength="5" />
</p>
<p>
<input type="submit" value="Envoyer le mail" />
</p>
</form>

Voici en rouge comment insérer notre image dynamique notez l'extension du fichier qui est en php puisque notre image est générée via une image crée avec la librairie GD en php. Nous avons donc un formulaire qui affiche notre image dynamique. Vous pouvez enregistrer ce fichier comme bon vous semble, disons formulaire.php ;).

Traitement du formulaire

Notre formulaire a pour action définie le fichier contactmail.php ; nous allons donc créer ce fichier.

<?php
/* nous démarrons la session afin de récupérer la valeur codée */
session_start();
/* Nous testons que la variable existe et qu'elle a bien la longueur souhaitée */
if(!isset($_SESSION['code']) OR strlen($_SESSION['code']) !=5) exit("Erreur !");
 
/* Comparaison entre les deux valeurs si elles sont différentes on arrete tout sinon on continue et on envoie le mail */
if($_SESSION['code'] != $_POST['verif']) exit("Erreur les valeurs sont différentes !");
 
/* on récupère le mail de la personne qui envoi le mail si elle la saisi on peut envisager de vérifier que ce champ est rempli avec une adresse valide mais ce n'est pas le but ici */
$exp = $_POST['mail'];
/*on formate les chaine d'objet et de corps du mail */
$objet = stripslashes($_POST['objet']);
$msg = stripslashes($_POST['msg']);
/* envoi du mail a proprement parlé */
$envoi=mail("contacta@site.net", $objet, $msg,"From: $exp\r\n"."Reply-To: $exp\r\n");
if($envoi) echo"Le mail a bien été envoyé !";
else echo"L'envoi a échoué, merci de renouveller l'opération !";
/* on efface et détruit les varaibles de sessions */
session_unset();
session_destroy();
?>

Voilà la boucle est bouclée, et le mail est parti ! Tout en s'assurant que la personne a du franchir le blocage de l'image dynamique ;) Retrouvez les sources commentées de ce tutorial dans le fichier joint.