Formulaire de récupération d'emails

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

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.