8768 sujets

Développement web côté serveur, CMS

Pages :
EDIT par Felipe: un forumeur a attiré notre attention sur la news suivante de la CNIL: http://www.cnil.fr/index.php?id=1602&news
À vous de faire bon usage (=légal) de ce genre de script, sachant que dans le service dont il est question on a accès en plus aux infos comme "s’ils les ont transmis à d’autres personnes et depuis quel serveur de messagerie" et le point le plus important (mais IANAL) "le destinataire n’a pas le choix d’accepter ou de refuser de retourner les informations à l’abonné à « *** ». Il n’en est même pas informé. ". Ce qui se trouve ci-dessous est tout de même moins intrusif et n'empêche pas de respecter la règle de l'opt-in pour les particuliers/opt-out pour les professionnels Smiley cligne
------------------


Bonjour,

J'ai développé un script php couplé avec une bdd permettant de faire du suivi d'e-mailing. A savoir: qui a lu le mail? quand? A-t-il visité le site web indiqué dans le mail depuis le mail?

Pour cela, je mets une balise <img> dans mon mail qui pointe vers une page php. Pour les infos de click sur les liens, j'ai modifié l'index du site avec un peu de php qui récupère l'IP et qui fait +1 sur un compteur dans la base de données.

Ma table sql retour possède 5 champs:
mail=mail du destinataire
nombre=nombre de lecture
date=date de lecture
adripmail= @Ip de lecture
web=nombre de visites sur le site depuis le mail

Lors de mon envoi de mail, j'importe toutes les adresses dans la table et j'initialise tous les champs.

J'aimerai avoir votre avis sur la façon dont j'ai codé le script (c'est mon premier script) et s'il est "optimal" (pas de cas boiteux oublié):
Voici l'algo final auquel je suis parvenu:
upload/8464-algo.jpg

Voici le code associé:
<?php 
//--Récupération de l'@ IP
	if($_SERVER) 	{
			if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
					$adress = $_SERVER['HTTP_X_FORWARDED_FOR'];
				elseif(isset($_SERVER['HTTP_CLIENT_IP']))
					$adress = $_SERVER['HTTP_CLIENT_IP'];
				else
					$adress = $_SERVER['REMOTE_ADDR'];
	}
	else 		{
				if(getenv('HTTP_X_FORWARDED_FOR'))
					$adress = getenv('HTTP_X_FORWARDED_FOR');
				elseif(getenv('HTTP_CLIENT_IP'))
					$adress = getenv('HTTP_CLIENT_IP');
				else
					$adress = getenv('REMOTE_ADDR');
	}
	//Requête sur l'adresse IP
	$iptmp=mysql_query("select adripmail from retour where mail='".$mail."'");
	$adrip=mysql_fetch_assoc($iptmp);
	//@IP = valeur par défaut -> nouvelle lecture -> mise à jour de tous les champs
	if($adrip['adripmail']=="xx")
	{
		mysql_query("update retour set nombre=nombre+1, date='".$date."', adripmail='".$adress."' where mail='".$mail."'");
	}
	else		//Seconde lecture
	{
		//Si @IP actuelle est différente de celle enregistrée 
		if($adress!=$adrip['adripmail'])
		{
			//Test pour éviter les doublons
			$req=mysql_query("select * from retour where adripmail='".$adress."' and mail='".$mail."'");
			$res=mysql_num_rows($req);
			if($res=='0')
			{
				//Si non présent, on insère une nouvelle ligne dans la base
				mysql_query("insert into retour(mail,nombre,date,adripmail) values('".$mail."','1','".$date."','".$adress."')");
			}
			else
			{
				//Sinon, update du compteur de lecture
				mysql_query("update retour set nombre=nombre+1 where mail='".$mail."' and adripmail='".$adress."'");
			}
		}
		else	//Sinon update du compteur de lecture
		{
			mysql_query("update retour set nombre=nombre+1 where mail='".$mail."' and adripmail='".$adress."'");
		}
	}
	//Fermeture de la connexion sql
	mysql_close();
?>


J'ai pas tout mis car le début est pas utile, c'est la connexion au sql et la récupération du mail.
Pour ma part, je l'ai testé et il semble fournir le résultat attendu...

Merci d'avance de vous pencher dessus.
Modifié par Felipe (02 Sep 2008 - 13:26)
Je vais faire d'ici peu une campagne d'e-mailing. J'aimerai avoir un retour sur cette campagne en sachant qui a lu mon mail...

C'est l'équivalent de ce que propose le logiciel Sarbacane quand on s'abonne.

Je suis pas le seul à essayer de faire ça...
Si ton script fait bien ce qui est décrit dans le schéma alors il marchera sauf que:
-un utilisateur n'a pas forcement une ip fixe, si elle change entre la lecture du mail et la visite du site ça ne marchera pas.
-un utilisateur n'affiche pas forcement les images dans son mail par défaut (gmail par exemple) ou par souhait (option dans thunderbird par exemple).
Pour les images, les solutions pros utilisent le même genre de méthode.
Etant donné que mes mails contiendront forcément des images d'illustrations, plus de 90% des destinataires de la campagne devraient télécharger les images.

Pour l'IP, je considère que les gens ayant reçu le mail viendront sur le site depuis le mail. Vu que je récupère à chaque lecture l'@IP de la personne, c'est bon pas de risque de changement entre les deux.

Qu'en dis tu?
Modifié par rider (18 Aug 2007 - 11:04)
ah oui, petite précision

sur le site, je ne track que les visiteurs provenant d'un mail,
les autres je m'en fous pour les stats de la campagne
Salut rider Smiley cligne ,

je ne suis à priori (= à priori négatif) pas fan des systèmes de tracking qui m'évoquent surtout le marketing sauvage, le spam, etc...

Cela étant dit, pourquoi passer par l'IP qui n'est vraiment pas une donnée sûre alors que pour ce que tu veux faire il me semble qu'il suffirait d'un lien particulier avec par exemple une variable en GET pour déterminer si une visite fait suite à un emailing (lien : page.php&emailing=true) et pour ce qui est de compter le nombre de visite, l'incrémentation d'un cookie serait également beaucoup plus fiable ?

A+
je te rassure, c'est pour du mailing professionnel

a écrit :
il me semble qu'il suffirait d'un lien particulier

sauf que je veux savoir qui est ce qui a lu le mail et pas simplement combien de fois il a été lu.

a écrit :
l'incrémentation d'un cookie serait également beaucoup plus fiable


pour le cookie, il faut que le navigateur les accepte, ce qui n'est pas forcément le cas

pourquoi considère tu que l'IP c'est pas sur?

c'est le meilleur moyen de tracer les activités de quelqu'un sur le net il me semble
Modifié par rider (18 Aug 2007 - 14:56)
rider a écrit :
pourquoi considère tu que l'IP c'est pas sur?

c'est le meilleur moyen de tracer les activités de quelqu'un sur le net il me semble
Parce qu'elle change souvent ...
L'IP n'est pas fiable car la plupart du temps elle n'est pas fixe !

Concernant les cookies, le pourcentage de visiteurs qui vont l'accepter est nettement supérieur ! D'autre part pour savoir qui "se cache" derrière, il suffit d'incrémenter un n° d'identifiant dans une table et de le renseigner dans le cookie Smiley langue !
tout à fait d'accord avec le fait que l'IP change

ça m'a d'ailleurs compliqué la tache

mais si tu regardes l'algo dans le 1° post, tu verras que le changement d'IP est géré
bon ok, ça risque de faire des tables avec beaucoup d'entrées mais ces entrées ne sont pas très volumineuses donc ça va
Modifié par rider (18 Aug 2007 - 15:06)
je suppose que le lien entre l'adresse mail et l'ip lors de la première visite est fait à l'aide des variables GET Smiley murf ? Toujours est-il que pour tracer ton visiteur lorsqu'il accède directement au site je ne vois pas comment tu fais puisque ce lien (email <=> IP) n'existe plus si l'IP a changé... Smiley rolleyes

Encore une fois je pense que l'utilisation d'un cookie (qui contiendrait par exemple cette adresse mail) serait préférable...
Modifié par Heyoan (18 Aug 2007 - 15:12)
je ne veux pas tracer les visiteurs qui arrivent directement sur le site

les destinataires de la campagne de mail sont des tours opérateurs, donc je pense que 99% d'entre eux vont lire le mail et cliquer sur les liens dedans

c'est ça que je veux tracker

je vais tout de même étudier l'histoire du cookie
Euh... mais du coup, si tu ne veux tracker que les visites qui proviennent du click sur le lien du mail (genre page.php?id_email=333), à quoi te sert la gestion de l'IP ? La connaissance du mail devrait suffire, non Smiley rolleyes ?
non car je n'ai pas moyen de personnaliser les liens lors de l'envoi du mail

le seul truc que je peux faire c'est: http://monsite.fr/index.php?source=mail

et là un script php se déclenche car "source" n'est pas null

du coup je récupère l'IP de ce visiteur, interroge la table sql et incrémente son compteur
Ah... OKI DOKI !

Dommage car ça aurait été bien plus simple de générer le lien directement avec l'identifiant correspondant au prospect Smiley lol !

Bon ben bonne continuation alors !
comme tu dis, sauf que le script d'envoi n'est pas de moi
sinon c'est sur que j'aurai fait comme ça

et niveau code, y a pas de grosses boulettes de débutant?
Re',

En jetant un oeil à ton script il y a encore 2 ou 3 trucs que je ne comprends pas Smiley hein ...

Dans ton post plus haut j'ai cru comprendre que tu ne pouvais pas personnaliser le lien et que du coup tu étais obligé de faire un lien http://monsite.fr/index.php?source=mail dans lequel "mail" était un mot en dur que tu testais (genre : if $_GET['source'] == 'mail' ...) pour savoir si le visiteur venait depuis un emailing...

Or dans ton script ta première requête contient ... where mail='".$mail."'". Alors d'où provient cette variable $mail Smiley ohwell ?

Et si dans le lien http://monsite.fr/index.php?source=mail tu renseignes effectivement la valeur (genre : ...?source=bidule@machin.fr) j'en reviens à ma première question : pourquoi ne pas utiliser la variable $mail comme identifiant unique et laisser tomber complètement l'IP ???
ça c'est pour le lien de tracking de lecture du mail
là je peux le faire car le lien est dans une balise <img src="http://monsite.fr/retour.php?email=mail_du_destinataire" alt="" >

là mail_du_destinataire est rentré par le script d'envoi lors de la boucle sur les adresses mails

vu que l'image n'affiche rien, je l'ai mise à la fin du message après le lien de désabonnement

je ne peux pas personnaliser les liens présents dans le message du mail

en espérant être clair
Ben excuses-moi d'être lourd ou obtus Smiley biggol , mais si tu récupères l'email du visiteur je ne comprends toujours pas à quoi te sert de gérer l'IP puisque l'adresse email est un identifiant unique...

Du coup je pense qu'il te suffit de 3 champs dans ta table retour : mail, date_envoi et nombre (+ éventuellement un champ date_derniere_visite). Si un email est présent dans l'URL on teste que ce dernier existe bien dans la table et si oui on la met à jour... sinon on ne fait rien puisque tous les emails ont déjà été initialisés...

Ce qui donne :
<?php 
// Si un email est renseigné dans l'URL
if (!empty($_GET['email'])) {
	$mail = $_GET['email'];
	// Ouverture de la connexion SQL
	// ...
	//Requête sur l'adresse mail
	$req=mysql_query("select nombre from retour where mail='".$mail."'");
	$res=mysql_num_rows($req);
	if($res > 0) { //Si l'email est connu...
		mysql_query("update retour set nombre=nombre+1, date_derniere_visite=now() where mail='".$mail."'");
	}
	//Fermeture de la connexion sql
	mysql_close();
}
?>

A+
Pages :