Formulaire de récupération d'emails

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 741 fois - Téléchargée 15 fois

Contenu du snippet

Voilà temps que je suis à la recherche d'un script qui me permette d'ajouter un formulaire sur mon site afin que les lecteurs puisse s'abonner à la newsletter du site sans problèmes. J'ai donc crée un formulaire, qui, traité en php, permet de récupérer l'adresse email, vérifier qu'elle est dans le bon format ( xxx@xxx.xx ), vérifier également qu'elle n'est pas déjà présente dans la base de donnée, et ensuite l'inscrit dans celle-ci. Ajouté à cela, un fichier envoi.php qui lance une fonction mail() qui passe les filtres anti-spam hotmail gmail (code fonctionnel et récupéré sur codesources); malheuresement, il faudra une éxecution de ce script par tache cron au niveau du serveur: un simple php -f envoi.php devrait suffire à chaque échéance d'envoi. Et enfin, une fonction de désinscription sous la forme d'un lien comme sur la majorité des sites.

Pour une meilleure organisation, le script opte pour un relais de toutes les actions au function.php.

Source / Exemple :

functions.php 

<?php

//fonctions relatives à la BDD

	//Connexion à la BDD
	function my_co()
	{
		mysql_connect ('localhost', 'root', '');
		mysql_select_db ("pomme-poire");
	}


	
	

	
	
	
	
// Fonctions relatives à l'outil newsletter

	


	//Fonction de vérification d'une inscription préalable
	function verif_email_exists($mail)
	{
		// On compte le nombre de fois où apparait le dit mail dans la base
		$verif_presence = mysql_query ("SELECT mail FROM newsletter WHERE mail = '$mail'"); 
		$verif_presence1 = mysql_fetch_array ($verif_presence);
		// Si le mail apparait; on renvoit la valeur true
		if ($verif_presence1 != NULL)
		{
			return true;
		}
		// Sinon, elle n'apparait pas, on renvoit la valeur false
		elseif ($verif_presence1 == NULL)
		{
			return false;
		}
	}

	
	
	
	//Fonction de vérification de format de l'email
	 function verif_email($mail)
	{
		// On établit l'archétype d'une adresse mail en expressions régulières et on l'insère dans la variable syntaxe 
		$syntaxe = '#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$#' ;
		$domain = explode('@', $email);
		// On compare l'adresse donnée en argument avec l'archétype; si elle correspond, on valide, sinon on renvoit la valeur false
		if (preg_match($syntaxe, $mail))
 		{
 			if (checkdnsrr($domain[1]))
 			{
 				return true;
 			}
 			else
 			{
 				return false;
 			}
		}	
	}
	
	
	
	// Fonction d'inscription à la newsletter
	function insc_news($mail)
	{
		// Si la syntaxe d'une adresse mail est bien respectée
		if (verif_email($mail) == true)
		{
			// Si le test de présence de l'adresse dans la base nous renvoit false
			if (verif_email_exists($mail) == false)
			{
				// On conserve la date, puis on envoi l'adresse mail et la date d'inscription à la base
				$date_inscription = date("d/m/y");
				mysql_query ("INSERT INTO newsletter VALUES('','$mail','$date_inscription') ") or die ("impossible de transmettre ces valeurs");
        		echo "vous voilà inscrit, vous recevrez donc les derniers articles de pomme poire abricot chaque semaine sous la forme d'un journal pdf";
			}
			// Sinon c'est que l'adresse est déjà présente dans la BDD
			else
			{
				echo "vous êtes déjà inscrit à cette newsletter, en cas de problème veuillez contactez le webmaster";
			}
		}
		// Sinon, c'est que le format d'adresse n'est pas valide
		else
		{
			echo "le format de votre adresse email ne semble pas être valide, veuillez réessayer";
		}
		
	}
	
	
	
	
	//Fonction de désinscription de la newsletter
	function desinsc_news($mail)
	{
		// Si la syntaxe d'une adresse mail est bien respectée
		if (verif_email($mail) == true)
		{
			// Et si le test de présence de l'adresse dans la base nous confirme qu'elle y est inscrite
			if (verif_email_exists($mail) == true)
			{
				// Alors on demande à la base de retirer l'occurence correspondant au mail
				mysql_query("DELETE FROM `newsletter` WHERE `newsletter`.`mail` = '$mail' LIMIT 1");
				echo "merci d'avoir été fidèle à Pomme Poire Abricot, en espérant vous retrouver bientôt parmi nos lecteurs";
			}
			// Sinon si l'adresse n'est pas présente dans la BDD
			elseif (verif_email_exists($mail) == false) 
			{
				echo "Vous n'êtes actuelement pas inscrit à la newsletter";
			}
		}
		// Sinon, c'est que le format d'adresse n'est pas valide
		else 
		{
			echo "Ceci n'est pas un format d'email valide";
		}
	}
	
	
	

	
	
	
	
	
//Fonctions relatives à l'envoi d'emails	
	



	//Fonction relative à l'envoi de mail (passe les filtres hotmail/gmail)
	function email($destinataire, $sujet , $messtxt, $messhtml,$mailfrom="newsletter@pomme-poire.fr",$namefrom="http://pomme-poire.fr") 
	{ 

	$boundary = "_".md5 (uniqid (rand()));
	$entete = "MIME-Version: 1.0\n";

	$entete .= "X-Sender: <www.pomme-poire.fr>\n"; // Votre site 
	$entete .= "X-Mailer: PHP\n";	
	$entete .= "X-auth-smtp-user: oleiade@pomme-poire.fr \n"; // Votre adresse mail
	$entete .= "X-abuse-contact: newsletter@pomme-poire.fr \n"; // L'adresse mail utilisée pour la newsletter

	$entete .= "Reply-to: $namefrom <$mailfrom>\n";
	$entete .= "From:$namefrom <www-data@planet-work.com>\n";
	
	$entete .= "Content-Type: multipart/alternative; boundary=\"$boundary\" "; 

	$message = "--" . $boundary . "\n"; 
	$message.= "This is a multi-part message in MIME format.\n\n"; 

	$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n"; 
	$message .= "Content-Transfer-Encoding: quoted-printable\n\n"; 
	$message .= $messtxt; 
	$message .= "\n\n"; 
	$message .= "--" . $boundary . "\n"; 
	$message .= "Content-Type: text/html; charset=\"iso-8859-1\"\n"; 
	$message .= "Content-Transfer-Encoding: quoted-printable\n\n"; 
	$message .= str_replace("=","=3D",$messhtml); 
	$message .= "\n\n"; 


	return @mail($destinataire, $sujet, $message, $entete); 
	}

	
	
	
	//Fonction pour envoi de la newsletter
	function mail_newsletter()
	{
	my_co();
	$adresses = mysql_query("SELECT mail FROM newsletter");
	while ($adresses1 = mysql_fetch_row ($adresses))
	{
		foreach ($adresses1 as $cle=>$valeur)
		{
			email($mail,votre sujet,votre message,votre en-tete,"","");
		}
	}
	
	echo "votre mail a correctement été envoyé";
	}
	mysql_close();

?>




inscription.php

<html>
<body>
	<div class="newsletter">
		<div id="inscription">
		<form action="inscription.php" method="post">
		<input type="text" name="adresse"/>
		<input type="submit" value="Tenez=vous au courant" name="inscription"/>
		</form>
		</div>
			<div id="desinscription">
			<a href="/mail-test/desinscription.php"> se désinscrire </a>
			</div>
	</div>
</body>
</html>



<?php
	include ("functions.php");
	//Connexion à la BDD
	my_co();
	
	// On vérifie que le champs existe
	if ( isset($_POST['adresse']) )
	{
		// Et on vérifie que le champs est remplit
		if ( $_POST['adresse'] != NULL) 
		{
		// On transmet la valeur du champs dans une variable
		$mail = $_POST['adresse']; 
		// Et on l'inscrit dans la BDD via la fonction: 
		insc_news($mail);
		// On referme la connexion à la BDD
		mysql_close();
		}
		else 
		{
			echo "Veuillez entrer une adresse email";
		}
	}
	
?>




desinscription.php


<html>
<body>	
<form action="desinscription.php" method="post">
<input type="text" name="adresse"/>
<input type="submit" value="désinscrivez-moi">
</form>
</body>
</html>


<?php
include ("functions.php");
my_co();
	// Si le champs existe
	if (isset ($_POST['adresse']))
	{
		// Et s'il est remplit
		if ($_POST != NULL)
		{
			// On récupère son contenu dans une variable
			$mail = $_POST['adresse'];
			// Et on la désinscrit de la BDD via la fonction:
			desinsc_news($mail);
		}
		// Sinon, c'est que le champs a été laissé vide
		else
		{
			echo "veuillez entrez une adresse email svp";
		}
	}
mysql_close();
?>




mail.newsletter.php

<?php
include ("functions.php");
	mail_newsletter();
?>




envoi.php:

<?php
include ("functions.php");
	mail_newsletter();
?>

Conclusion :

Un code à optimiser sans doute, mais qui je l'espère facilitera la vie de ceux qui veulent implémenter simplement sur leur site un systeme de récupération et d'envoi des emails à des fins de newsletter. P.S: les noms de tables et de champs dans la BDD sont là à titre d'exemple. Et je pense que certaines choses sont encore à revoir où à améliorer, telle l'implémentation d'une couche AJAX peut-etre, ou la vérification que les mails sont parvenus, avec notification à l'admin au cas ou ceci n'aurait pas fonctionné.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
dimanche 3 août 2008
Statut
Membre
Dernière intervention
3 février 2010

Bonjour,

Merci pour ce code. Je suis un vrai débutant et je n'arrive pas à créer une bdd dans phpadmin qui corresponde à tous les champs auxquels ton code fait appel. Pourrais-tu la mettre à disposition ta BDD ?

Merci d'avance
Messages postés
427
Date d'inscription
dimanche 6 juillet 2008
Statut
Membre
Dernière intervention
4 mai 2009

oleiade ben corrige le code avec les guillemets autour de la variable et dis moi si c'est bien wamp qui faut utiliser pour lire ta source stp

merci de me répondre
Messages postés
8
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
26 mars 2009

J'ai réfléchis à ton cas. Et en fin de compte, c'est beaucoup plus simple que ce que je pensais... en fait, il semblerait que j'ai oublié de mettre les guillemets autour de la variable relative au paramètre de la fonction mail, à la ligne 186; tente ta chance et donne moi ton retour.
Messages postés
427
Date d'inscription
dimanche 6 juillet 2008
Statut
Membre
Dernière intervention
4 mai 2009

oleiade, j'utilise wamp sous windows vista, pour avoir la fonction mail sous wamp ? faut installer PHP 5.2 ?

où trouver ton ce php 5.2 ? donne moi le lien pour le télécharger merci d'avance ;)
Messages postés
8
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
26 mars 2009

Désolé pour le temps de réponse, j'ai pas mal de boulot ces temps-ci... :) Alors, pour griffondor, je suis désolé de te décevoir, mais ce script est à adapter à chacun des cas particuliers... je n'ai fournit qu'une colone vertébrale. Maintenant, je constate que tu as un environnement windows, assure-toi d'avoir correctement installé toutes les libraires de PHP(5.2 si je ne m'abuse). Ensuite, l'erreur que tu pointes touches à l'envoi des mails; je ne l'ai aps annoté, mais il s'agit d'un script indépendant qu'il s'agit d'activer avec une tache cron sur le serveur. Maintenant je tourne exclusivement sur des plateformes UNIX, et donc avec Apache, donc je ne sais pas comment ca marche de ton côté. Envoi moi tes spécifications que je prospecte :)

Je me penche en ce moment meme sur le javascript pour ouvrir le formulaire d'inscription dans une nouvelle fenetre, afin d'éviter les soucis avec la gestion de l'intégration wordpress; je ferai évoluer le script en conséquence :)
Merci à tous de vos retours. Je prospecte, je prospecte...
Afficher les 18 commentaires

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.