Formmail sécurisé

Contenu du snippet

Script de formmail qui permet de recevoir un feedback des visiteurs de votre site... Le visiteur peut choisir entre plusieurs detinataire!

Source / Exemple :


<?php
 
// TITRE

echo"<h1>Contact</h1>\n";

// APPEL DES FONCTIONS

// AFFICHER

if(!$_POST)
{
	formulaire_contact($connexion, $_POST);
}

// VERIFIER/ENVOYER

elseif($_POST)
{
	// ON VERIFIE LES CHAMPS

	if(verifier_contact($_POST))
	{
		envoyer_contact($connexion, $_POST);
	}
	else
	{
		formulaire_contact($connexion, $_POST);
	}
}

// FORMULAIRE

function formulaire_contact($connexion, $_POST)
{
	// ON DEFINIT LES VALEURS PAR DEFAUT

	if(!($_POST))
	{
		$nom = 'Prénom et nom';
		$adresse = 'Adresse';
		$lieu = 'Code postal et lieu';
		$email = '@';
		$sujet = 'Sujet';
		$texte = 'Texte';
		$copie = 'on';
	}
	else
	{
		$nom = $_POST['nom'];
		$adresse = $_POST['adresse'];
		$lieu = $_POST['lieu'];
		$email = $_POST['email'];
		$sujet = $_POST['sujet'];
		$texte = $_POST['texte'];
		$texte = $_POST['copie'];
	}

	// FORMULAIRE

	echo"<h2>Formulaire</h2>\n";

	echo"<form action=\"contact.html\" method=\"post\">\n";

	echo"<p><label for=\"contact\">Contact *</label><br />\n";

	//CONTACTS

	echo"<select name=\"contact\" id=\"contact\" title=\"Contact\" tabindex=\"1\">\n";
	echo"<option selected=\"selected\">Webmaster</option>\n";

	// AUTRES DESTINATAIRES VOIRE REQUETES MYSQL POUR SELECTIONNER DES GROUPES ETC.

	echo"</select></p>\n";

	// PRENOM ET NOM

	echo"<p><label for=\"nom\">Prénom et nom *</label><br />\n";
	echo"<input type=\"text\" name=\"nom\" id=\"nom\" value=\"".$nom."\" title=\"Prénom et nom\" tabindex=\"2\" onfocus=\"this.select();\" /></p>\n";

	// ADRESSE

	echo"<p><label for=\"adresse\">Adresse</label><br />\n";
	echo"<input type=\"text\" name=\"adresse\" id=\"adresse\" value=\"".$adresse."\" title=\"Adresse\" tabindex=\"3\" onfocus=\"this.select();\" /></p>\n";

	// CODE POSTAL ET LIEU

	echo"<p><label for=\"lieu\">Code postal et lieu *</label><br />\n";
	echo"<input type=\"text\" name=\"lieu\" id=\"lieu\" value=\"".$lieu."\" title=\"Lieu\" tabindex=\"4\" onfocus=\"this.select();\" /></p>\n";

	// Email

	echo"<p><label for=\"email\">Email *</label><br />\n";
	echo"<input type=\"text\" name=\"email\" id=\"email\" value=\"".$email."\" title=\"Email\" tabindex=\"5\" onfocus=\"this.select();\" /></p>\n";

	// SUJET

	echo"<p><label for=\"sujet\">Sujet *</label><br />\n";
	echo"<input type=\"text\" name=\"sujet\" id=\"sujet\" value=\"".$sujet."\" title=\"Sujet\" tabindex=\"6\" onfocus=\"this.select();\" /></p>\n";

	// TEXTE

	echo"<p><label for=\"texte\">Texte *</label><br />\n";

	echo"<textarea name=\"texte\" id=\"texte\" cols=\"100\" rows=\"5\" title=\"Texte\" tabindex=\"7\" onfocus=\"this.select();\">".$texte."</textarea></p>\n";

	// COPIE

	echo"<p><input checked=\"checked\" type=\"checkbox\" name=\"copie\" id=\"copie\" value=\"".$copie."\" title=\"Recevoir une copie de l'email\" tabindex=\"8\" onfocus=\"this.select();\" /> <label for=\"copie\">Recevoir une copie de l'email</label></p>\n";

	// CHAMPS OBLIGATOIRES

	echo"<p>* Champs obligatoires</p>\n";

	// ENVOYER/ANNULER

	echo"<p><input type=\"submit\" value=\"Envoyer\" title=\"Envoyer\" tabindex=\"9\" /> <input type=\"reset\" value=\"Annuler\" title=\"Annuler\" tabindex=\"10\" /></p>\n";

	echo"</form>\n";
}

// VERIFIER

function verifier_contact($_POST)
{
	// VERIFICATION DES CHAINES DE CARACTERES

	function verifier_chaines($chaine)
	{
		$mauvaises_chaines = array('content-type:', 'mime-version:', 'content-transfer-encoding:', 'bcc:', 'cc:');

		foreach($mauvaises_chaines as $caracteres_inautorises)
		{
			if(strpos($chaine, $caracteres_inautorises) !== false)
			{
				return false;
			}
		}
		return true;
	}

	// ON VERIFIE LES CHAMPS

	// PRENOM ET NOM

	if(!($_POST['nom']) || $_POST['nom'] == 'Prénom et nom' ||!verifier_chaines($_POST['nom']))
	{
		$erreur = '"Prénom et nom"';
	}

	// ADRESSE

	if(!verifier_chaines($_POST['adresse']))
	{
		if(($erreur))
		{
			$erreur = ''.$erreur.', "Adresse"';
		}
		else
		{
			$erreur = ''.$erreur.'"Adresse"';
		}
	}

	// LIEU

	if(!($_POST['lieu']) || $_POST['lieu'] == 'Code postal et lieu' ||!verifier_chaines($_POST['lieu']))
	{
		if(($erreur))
		{
			$erreur = ''.$erreur.', "Code postal et lieu"';
		}
		else
		{
			$erreur = ''.$erreur.'"Code postal et lieu"';
		}
	}

	// EMAIL

	if(!($_POST['email']) || $_POST['email'] == '@' || !preg_match('/^[A-z0-9][\w\.\-]*@[A-z0-9][\w\.\-]+\.[A-z0-9]{2,6}$/', $_POST['email']) ||!verifier_chaines($_POST['email']))
	{
		if(($erreur))
		{
			$erreur = ''.$erreur.', "Email"';
		}
		else
		{
			$erreur = ''.$erreur.'"Email"';
		}
	}

	// SUJET

	if(!($_POST['sujet']) ||!verifier_chaines($_POST['sujet']))
	{
		if(($erreur))
		{
			$erreur = ''.$erreur.', "Sujet"';
		}
		else
		{
			$erreur = ''.$erreur.'"Sujet"';
		}
	}

	// TEXTE

	if(!($_POST['texte']) || $_POST['texte'] == 'Texte' ||!verifier_chaines($_POST['texte']))
	{
		if(($erreur))
		{
			$erreur = ''.$erreur.', "Texte"';
		}
		else
		{
			$erreur = ''.$erreur.'"Texte"';
		}
	}

	// SI DES CHOSES NE SONT PAS CORRECTES, ON AFFICHE UN MESSAGE D'ERREUR ET ON RETOURNE "FALSE"

	if(($erreur))
	{
		// POUR UN CHAMP INVALIDE

		if(!strrpos($erreur, ','))
		{
			echo"<p>Le champ ".$erreur." est invalide.</p>\n";
		}

		// POUR PLUSIEURS CHAMPS INVALIDES

		else
		{
			// ON REMPLACE LA DERNIERE VIRGULE PAR ET

			$nouvelle_erreur = substr_replace($erreur, ' et', strrpos($erreur,','), '1');

			// ON RETOURNE LA NOUVELLE ERREUR

			echo"<p>Les champs ".$nouvelle_erreur." sont invalides.</p>\n";
		}

		// ON RETOURNE L'ERREUR
		
		return false;
	}

	// ON ENVOIE LE MAIL

	return true;
}

// ENVOYER

function envoyer_contact($connexion, $_POST)
{
	// CHOIX DU DESTINATAIRE

	if($_POST['contact'] == 'Webmaster')
	{
		$dest = 'webmaster@tonsite.com';
	}

	else
	{
		// AUTRES DESTINATAIRES VOIRE REQUETES MYSQL POUR SELECTIONNER DES GROUPES ETC.
		
	}

	// ON PREPARE L'ENTETE

	// AVEC COPIE

	if(($_POST['copie']))
	{
		$entete = "bcc: ".$_POST['email']."\r\n";
		$entete .= "from: Ton site - ".$_POST['nom']." <".$_POST['email'].">\r\n";
	}

	// SANS COPIE

	elseif(!($_POST['copie']))
	{
		$entete = "from: Ton site - ".$_POST['nom']." <".$_POST['email'].">\r\n";
	}

	$entete .= "reply-to: ".$_POST['nom']." <".$_POST['email'].">\r\n";
	$entete .= "return-path: Tonsite - ".$_POST['nom']." <".$_POST['email'].">\r\n";
	$entete .= "mime-version: 1.0";
	$entete .= "content-type: text/plain; charset=iso-8859-1";
	$entete .= "x-mailer: php/" . phpversion();
	$entete .= "x-sender: Ton site - ".$_POST['nom']." <".$_POST['email'].">";
	$entete .= "x-auth-smtp-user: localhost";

	// PUIS LE MESSAGE

	// NOM ET PRENOM

	$message = "Prénom et nom : ".$_POST['nom']."\n\n";

	// SI IL Y A UNE ADRESSE

	if(($_POST['adresse']) && $_POST['adresse'] != 'Adresse')
	{
		$_POST['lieu'] = "".$_POST['adresse'].", ".$_POST['lieu']."";
	}

	// LIEU

	$message .= "Lieu : ".$_POST['lieu']."\n\n";

	// MESSAGE

	$message .= "Message : \n\n".$_POST['texte']."";

	// SI TOUT VA BIEN ON ENVOIE LE MAIL

	if(mail($dest, $_POST['sujet'], $message, $entete))
	{
		// MESSAGE DE CONFIRMATION

		echo"<p>Ton message a bien été envoyé.</h2>\n";

		echo"<h3>Infos détaillées</h3>\n";

		echo"<ul />\n";
		echo"<li>Contact : ".htmlentities($_POST['contact'])."</li>\n";
		echo"<li>Prénom et nom : ".htmlentities($_POST['nom'])."</li>\n";
		echo"<li>Code postal et lieu : ".htmlentities($_POST['lieu'])."</li>\n";
		echo"<li>Email : ".$_POST['email']."</li>\n";
		echo"<li>Sujet : ".htmlentities($_POST['sujet'])."</li>\n";

		// AVEC COPIE

		if(($_POST['copie']))
		{
			echo"<li><span>Copie :</span> Oui</li>\n";
		}

		// SANS COPIE

		elseif(!($_POST['copie']))
		{
			echo"<li><span>Copie :</span> Non</li>\n";
		}

		echo"</ul>\n";

		echo"<h3>Message</h3>\n";

		echo"<p>".nl2br(htmlentities($_POST['texte']))."</p>\n";

		// RETOUR

		echo"<p><a href=\"contact.html\" title=\"Retour\">Retour</a></p>\n";
	}
}

?>

Conclusion :


Il ne vous reste plus qu'à faire un design et à créer un htacces pour l'url rewriting!!

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.