tester la validité d'une adresse email

Mammouth du PHP | 843 Messages

24 mai 2007, 22:23

salut à tous :)

je voulai savoir si il y avait une methode simple pour verifier que l'email fournis sur un formulaire est bien existante.

un truc du genre, on envoi un email sur cette adresse et on s'assure que ce mail est bien arriver en interpretant une possible variable de retour du server de messagerie

est ce possible?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

24 mai 2007, 23:25

La façon de tester absolue est de mettre un lien à cliquer dans un mail que tu envoies à l'adresse email spécifiée.
Si tu souhaites spécifier le format, tu as les expressions régulières et l'extension Filter (depuis PHP 5.2.0) et si tu souhaites vérifier le domaine (après le @) tu as les fonctions de vérifications de DNS.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Mammouth du PHP | 843 Messages

25 mai 2007, 09:55

ok :)
mais n'y a t'il pas un moyen de controler que le mail à bien été reçu par le server email de l'adresse specifier (genre on recupere une info de retour du server destinataire disant que le mail est bien arriver :?)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

ViPHP
ViPHP | 3607 Messages

25 mai 2007, 17:49

La façon de tester absolue est de mettre un lien à cliquer dans un mail que tu envoies à l'adresse email spécifiée.
voilà le moyen!

Mammouth du PHP | 843 Messages

25 mai 2007, 23:13

le truc c'est que c'est deja ce que je fait ;)

le probleme c'est que moi j'ai fait un formulaire dans lequelle je force le visiteur à balancer sont adresse email en premiere etape. si le email est valide (regexp), on envoi un email de test afin de voir si ce dernier reçoi le message (au cas où, je propose l'ajout de l'adresse d'envoi dans les contacts du dit membre. AOL & co oblige). si ce dernier reçoi le email, il continue l'inscription. sinon il peut rebalance le email de test. ensuite à la fin il reçoi un email de validation du compte ouvert avec lien pour activation sur le dit email.

le truc c'est que j'aimerai simplifier la procedure d'inscription en verifiant par moi même, coté server, que le email de test est bien reçu...

est il possible de tracker le email de test envoyer, afin de verifier si il est bien reçu pour l'email soumis ?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Mammouth du PHP | 19672 Messages

26 mai 2007, 08:01

Je ne connais pas les détails techniques, mais je sais qu'il est possible avec certains serveurs de savoir si une adresse existe, mais, de mémoire, je crois que beaucoup de serveurs refusent de retourner l'information. Enfin grosso-modo, il me semble que c'est quelque chose dans ce goût là. Tu peux vérifier un domaine, mais pour une adresse, c'est beaucoup plus compliqué.

Je dirais que la procédure du courriel de confirmation est plus sûre. Je comprends ton souhait de simplification, mais si tu ajoutes un message pour l'internaute en lui expliquant de façon courte et simple qu'il s'agit de protéger tout le monde des robots qui polluent le Net, ce sera d'autant mieux accepté.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

26 mai 2007, 14:16

Tester qu'une adresse existe n'a de toute façon aucun intérêt : tu pourras avoir la preuve que l'adresse existe bien, tu n'auras jamais la preuve que c'est bien celle de l'utilisateur.

Seule la méthode de mother-T est valable ;)

ViPHP
ViPHP | 4674 Messages

30 mai 2007, 15:51

Bonjour.

J'espère ne pas faire du hors-sujet, mais si je comprends une partie du problème, tu veux savoir si une adresse email existe.
Bon, alors on sait faire, c'est pas ultra compliqué, faut connaître.

J'ai fais une classe comme ça (bientôt le site avec _toutes_ les publications, ça arrive :roll:), voici ce qu'elle fait.
Elle valide une adresse email selon différents niveaux :
  • 1. isWellFormed : on test tout simplement la syntaxe ;
    2. isMxRecord : est-ce qu'un enregistrement MX correspond à notre adresse ;
    3. isSMTP : est-ce que le domaine fournit est bien un SMTP ;
    4. isVerified : on regarde sur le server SMTP que l'adresse existe bien.
Comment on procède ?

Préambule :

On a les variables $this->address et $this->domain qui contiennent l'adresse et le domaine de l'email. On a également la variable $this->timeout pour les sockets.

1. isWellFormed :

On fait un test (à l'aide de preg_match par exemple) sur ta variable $mail.. On test l'expression suivante :

Code : Tout sélectionner

#^([a-z0-9_\-\.]+)@([a-z0-9_\-\.]+)\.([a-z]{2,6})$#i
Pourquoi une extension de 2 à 6 caractères ? Les .museum existe ;-)

2. isMxRecord :

On a deux solutions.
Soit on utilise la fonction getmxrr() et on exploite le résultat, soit la fonction n'existe pas et on tente alors une commande. La fonction existe sur tous les systèmes Unix sauf sous Windows (d'où la commande MS-DOS).

Tu devrais avoir quelque chose qui ressemble à ça pour exploiter le getmxrr :
if(function_exists('getmxrr')) {

	if(!getmxrr($this->domain, $name, $weight))
		return Fw::raiseError('getmxrr(); return false.', 1);

	foreach($name as $key => $value) {
		if(!isset($w)) {
			$w = $weight[$i];
			$mx = $name;
		}
		elseif($weight < $w) {
			$w = $weight[$i];
			$mx = $name;
		}
	}
}
Sinon on lance la commande `nslookup -type=MX $esad 2>nul` pour Windows :
else {

	$esad = escapeshellarg($this->domain);
	$ns   = `nslookup -type=MX $esad 2>nul`;

	if(preg_match_all("#^(.*)\tMX preference = (\d+), mail exchanger = (.*)$#im",
					   $ns, $lines, PREG_SET_ORDER) === FALSE)
		return Fw::raiseError('Cannot preg_match_all `nslookup`', 2);

	foreach($lines as $line) {
		if($line[1] != $this->domain)
			continue;
		$name = $line[3];
		$weight = intval($line[2]);

		if(!isset($w)) {
			$w = $weight;
			$mx = $name;
		}
		elseif($weight < $w) {
			$w = $weight;
			$mx = $name;
		}
	}
}
Au final, si la variable $mx est vide, alors on retourne faux, sinon on retourne vrai.

3. isSMTP :

Rien de compliqué, on regarde juste si le server existe bien.
$fsop = fsockopen('tcp://'.$this->mx, 25, $this->errno, $this->errstr, $this->timeout);

if($this->timeout)
	stream_set_timeout($fsop, $this->timeout);

if(Fw::isError($this))
	return FALSE;

fclose($fsop);
$this->mx correspond au $mx trouvé précédement (comme c'est par niveau, le niveau précédement est forcément exécuté).

4. isVerified :

On ouvre encore la connexion vers tcp://... comme vu en 3, mais on va exécuter des requêtes SMTP.

On va faire :

Code : Tout sélectionner

EHLO SweetYety VRFY $this->address // on récupère le code QUIT
On analyse le code, si le code appartient à l'intervalle [200; 300[ (soit [200; 299]) alors on n'a pas d'erreur, sinon l'adresse n'est pas vérifiée.


Voilà, c'est quelques petites méthodes qui pourront peut être t'être utiles :P
Je suis pas trop rentré dans les détails, j'ai juste expliqué en partie mon code, mais t'as déjà des astuces à exploiter.

Avec tout ça tu peux vérifier la validité d'une adresse email.
Si ton adresse email est valide, le courier a déjà plus de chance d'arriver.
Comme en général, les 99.99% des adresses emails données par les robots sont fausses, c'est déjà un bon moyen de les contourner. Si à ça, tu ajoutes un "anti-spam au niveau de l'écriture" (on encode les adresses et autres), tu as très peu de chance de te faire spammer.

Voilà, j'espère ne pas avoir fait de hors-sujet ^^ (sinon c'est pas perdu, ça peut toujours servir à quelqu'un d'autre :D)

Bonne journée.


Edit : Je me suis rendu compte que mon exploitation de getmxrr est complètement fausse lol ^^ J'ai écris comme ça, je l'ai pas testé ; j'étais partis sur autre chose et en modifiant j'ai pas fais gaffe. Mais là jdois partir, donc j'ai pas le temps de refaire un petit bout de code. Fait un print_r de $name et tu verras comment l'exploiter. Le but est de prendre le MX avec la référence la plus petite (il faut voir le résultat pour le comprendre :)) Je te conseille de regarder dans ton MS-DOS (si sous Win) pour mieux comprendre.
Désolé, re-bonne journée.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

30 mai 2007, 19:51

Tu n'es pas HS, mais disons que toutes ces vérifications au final ça apporte quoi ? Être sûr que l'adresse existe ne garantit pas que c'est celle de l'utilisateur actuel.
Donc tout ça ne dispensera pas de passer par l'activation via lien dans le mail, donc à ce compte là autant ne pas faire toutes ces vérifications ;)

ViPHP
ViPHP | 4674 Messages

31 mai 2007, 12:27

Hmmm oui.

Bon : ça pourra toujours être utile à quelqu'un ^^

Bonne journée :)
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).