IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Mail] Vérifier l'existence d'une adresse e-mail


Sujet :

Langage PHP

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut [Mail] Vérifier l'existence d'une adresse e-mail
    Bonsoir, j'ai retrouvé sur mon premier pc (le pauvre qui date de 10ans ) un vieux script php qui permet de vérifier d'une par la synthaxe de l'adresse mail mais également l'existence de l'adresse mail.
    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    <?php 
    // On déclare d'abord les fonctions:
     
    // Si la fonction getmxrr n'existe pas (serveur windows),
    // On la créé à l'aide de la commande DOS <nslookup>
    if(!function_exists('getmxrr'))
    {
    	function getmxrr($hostname,&$mxhosts)
    	{
    		if(!is_array($mxhosts))
    			$mxhosts = array();
    		if( !empty( $hostname ) )
    		{
    			@exec( "nslookup -type=MX $hostname", $output, $ret );
    			while( list( $k, $line ) = each( $output ) )
    			{
    				// On recherche la présence de d'entrées MX:
    				if( ereg( "^{$hostname}\tMX preference = ([0-9]+), mail exchanger = (.*)$", $line, $parts ) )
    				{
    					$mxhosts[ $parts[1] ] = $parts[2];
    				}
    			}
    			if( count( $mxhosts ) )
    			{
    				// S'il y a plusieurs enregistrements MX, on les classe par ordre de priorité
    				reset( $mxhosts );
    				ksort( $mxhosts );
    				$i = 0;
    				while( list( $pref, $host ) = each( $mxhosts ) )
    				{	
    					$mxhosts2[$i] = $host;
    					$i++;
    				}
    				$mxhosts = $mxhosts2;
    				return true;
    			}else{
    			 	return false;
    			}
    		}
    	}
    }
     
    function mailCheck($Email)
    {
    	// L'adresse email doit être correctement formattée
    	if(!eregi("^[[:alpha:]]{1}[[:alnum:]]*((\.|_|-)[[:alnum:]]+)*@[[:alpha:]]{1}[[:alnum:]]*((\.|-)[[:alnum:]]+)*(\.[[:alpha:]]{2,})$", $Email))
    		exit('L\'adresse '.$Email.' est mal formatée');
    	// On récupère le domaine
    	list(,$domain ) = split('@',$Email); 
    	// On cherche des enregistrements MX dans les DNS
    	if (getmxrr($domain, $MXHost)) 
    		$ConnectAddress = $MXHost[0];
    	else
    		$ConnectAddress = $domain;
    	// On créé la connexion sur le port smtp (25)
    	$Connect = @fsockopen($ConnectAddress,25,&$errno,&$errstr); 
    	if($Connect)
    	{
    		if(ereg("^220", $Out = fgets($Connect, 1024)))
    		{
    			fputs ($Connect, "HELO {$_SERVER['HTTP_HOST']}\r\n");
    			$Out = fgets ( $Connect, 1024 );
    			fputs ($Connect, "MAIL FROM: <{$Email}>\r\n");
    			$From = fgets ( $Connect, 1024 );
    			fputs ($Connect, "RCPT TO: <{$Email}>\r\n");
    			$To = fgets ($Connect, 1024);
    			fputs ($Connect, "QUIT\r\n");
    			fclose($Connect);
    			// Si le code renvoyé par la commande RCPT TO est 250 ou 251 (cf: RFC)
    			// Alors l'adresse existe
    			if (!ereg ("^250", $To) && !ereg ( "^251", $To ))
    				// Adresse rejetée par le serveur
    				return false;
    			else
    				// Adresse acceptée par le serveur
    				return true;
    		}else{
    			// Le serveur n'a pas répondu
    			return false;
    		}
    	}else{
    		// Connexion au serveur de messagerie impossible
    		// vous pouvez afficher le message d'erreur en décommentant la ligne suivante:
    		// echo $errno."-".$errstr;
    		return false;
     
    	}
    }
     
    // Définissez ici l'adresse à vérifier
    $mail = adresse mail;
     
     
    if(mailCheck($mail))
    	echo 'L\'adresse existe';
    else
    	echo 'L\'adresse n\'existe pas ou une erreur est survenue';
    ?>
    Le problème c'est que quand je teste avec une de mes adresses mails liés à mon nom de domaine, l'adresse est valide, par contre quand je tape une adresse n'existant pas, le code me renvoie le message, l'adresse existe alors que ce n'est pas le cas. Dites moi si il y a des erreurs dans ce script et si oui, ou sont-elles? Merci d'avance pour tous ceux qui m'aiderons.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Hm c'est cool sa !

    Tu l'exécutes en cli, ou via une page web ?

    Car en faits si comme moi tu l'executesen cli, tu auras une erreur à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fputs ($Connect, "HELO {$_SERVER['HTTP_HOST']}\r\n");
    En effet en cli, cette variable n'est pas définie.

    Ajoutes ceci en début de ton script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error_reporting(E_ALL);
    Tu pourras voir les erreurs.


    Pour le reste je l'ai testé sur un serveur correctement configuré et cela fonctionne, via une page web.
    Il faudrait simplement configurer cette variable ($_SERVER['HTTP_HOST']) en dur, ou en optionnelle dans le script.
    D'ailleurs je pense que tu dois pouvoir coller le smtp de ton fai.

    a plus

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    Bon j'explique sa future utilisation. Je veux vérifier lors d'une prise de contact par un visiteur sur la future version 3 de mon site, que l'adresse mail est bien formé (regex) et en meme temps verifie que ce n'est pas une adresse bidon, surtout chez hotmail ou live .... Donc mon idée était de l'utiliser sur une page web.
    Après comment fonctionne l'exécution en cli et dans quel cas utilise ton le mode cli, je connais pas la prog en cli.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    cli, c'est en ligne de commande.

    En faits ton script ne fonctionne pas car il essai de communiquer avec le serveur mail associé au domaine de la machine.
    En claire, si tu l'exécutes sur le serveur www.carrefour.com, ton script va tenter de communiquer avec le serveur de mail de carrefour.com par résolution dns.
    a cause de $_SERVER['HTTP_HOST'].

    Là ton problème, c'est que ton serveur oueb ne doit pas avoir de serveur de mail associé à son domaine.
    D'où l'erreur.

    Et donc je te proposait de définir cette variable ci
    $_SERVER['HTTP_HOST']
    en dur dans le code. de manière à pouvori interroger un serveur de mail existant.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    Je suis actuellement chez ovh et je souhaiterais vérifier l'existence d'une adresse mail, y a t-il un moyen de faire ceci ou non? Je précise que je suis encore sur un serveur mutualisé mais que je risque durant l'été 2009 ou avant peut être de transferer mon site sur un serveur dedier ou rps.
    Est ce possible de vérifier l'existence de l'adresse mail ou pas?

    Merci, je connaissais que de nom le mode cli. Je préfère faire du dévelloppement sur des pages web mais c'est bien d'avoir un peu de connaissance sur ce qui ce fait en ligne de commande, je vais faire quelques recherches sur ce mode. Merci encore.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Aucun problème quand tu seras en dédiés.
    Même en rps je pense., je n'ai jamais eu a administrer de telles machines.

    En mutualisé, cela doit être possible, mais il faut que tu configures le bon nom de domaine en lieu de place de la variable citée plus haut...

  7. #7
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    Bonjour, je voudrais savoir ce que je devais modifier pour que mon script fonctionne aussi bien sur un serveur mutualisé que sur un serveur dédier. Je ne vois pas trop comment ce script fonctionne.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il y a pas mal de regexps qui circulent sur le web pour valider une adresse email mais attention elles sont incomplètes.
    Par exemple celle du post répond que toto+titi@gmail.com est syntaxiquement invalide alors que c'est tout à fait valide. Certains fournisseurs utilisent cette syntaxe d'adresse pour auto-classer les messages, gmail en est un exemple.
    Un autre problème est qu'elle interdit les emails commençant par un chiffre alors que c'est valide aussi.

    D'autre part la technique d'envoyer un début de mail au serveur en espérant un retour 250 ne marchera pas avec les serveurs qui font du greylisting, et qui renverront un 450 que l'adresse existe ou non.

    Hélas la seule technique vraiment fiable pour valider une adresse est d'envoyer un mail et que l'utilisateur y réponde ou clique dans un lien du mail.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Il y a pas mal de regexps qui circulent sur le web pour valider une adresse email mais attention elles sont incomplètes.
    Par exemple celle du post répond que toto+titi@gmail.com est syntaxiquement invalide alors que c'est tout à fait valide. Certains fournisseurs utilisent cette syntaxe d'adresse pour auto-classer les messages, gmail en est un exemple.
    Un autre problème est qu'elle interdit les emails commençant par un chiffre alors que c'est valide aussi.

    D'autre part la technique d'envoyer un début de mail au serveur en espérant un retour 250 ne marchera pas avec les serveurs qui font du greylisting, et qui renverront un 450 que l'adresse existe ou non.

    Hélas la seule technique vraiment fiable pour valider une adresse est d'envoyer un mail et que l'utilisateur y réponde ou clique dans un lien du mail.
    pour la précision.
    Cela rend le script terriblement moins attrayant, mais cela permettra déjà d'avoir une qualification partielle de mes bases de mails...

    a plus

  10. #10
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    Hélas la seule technique vraiment fiable pour valider une adresse est d'envoyer un mail et que l'utilisateur y réponde ou clique dans un lien du mail.
    Je connais cette technique mais je voulais une méthode plus rapide, plus automatique.

  11. #11
    Modérateur
    Avatar de blueice
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2003
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 487
    Points : 5 134
    Points
    5 134
    Par défaut
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    function verifie_email($email) {
    list($compte, $domaine) = split("@", $email, 2);
    // Ne fonctionne que sous Unix / Linux
    if(!checkdnsrr($domaine, "MX") &&
    !checkdnsrr($domaine, "A")) {
    	return "Ce domaine n'accepte pas les e-mails";
    	}
    	return $email;
     
    }
    ?>

  12. #12
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    merci pour ce code mais il verifie si seulement si le nom de domaine accepte les adresses mails mais pas si l'adresse mail existe bien.
    exemple l'adresse popo ( at ) popo.fr existe mais jesuisleplusgrandcodeurdumonde ( at ) popo.fr n'existe pas. Si je passe cette seconde adresse dans la fonction, il m'enverra ok alors quelle n'hésite pas.

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/03/2015, 18h04
  2. [Javamail] Vérifier l'existence d'une adresse
    Par sovo dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 25/05/2012, 13h13
  3. Réponses: 2
    Dernier message: 17/10/2007, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo