Test validité plusieurs adresse mails [Résolu]

Messages postés
505
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
20 mars 2012
- - Dernière réponse : cs_janhsh
Messages postés
32
Date d'inscription
lundi 6 novembre 2000
Dernière intervention
24 janvier 2015
- 23 mars 2009 à 22:08
Bonjour,

Je veux envoyer des emails à plusieurs utilisateurs avec verification d'adresses mails ...

J'ai ce script qui verifie la validite d'une adresse mail
PHP:
function test_email($email)
{
if( eregi ("^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$", $email))
//if( eregi("^[_\.0-9a-z-]+@([0-9a-z-]+\.)+[a-z]{2,4}$",$email) )
{

// L'adresse email est valide
return true;
}
else
{
// L'adresse email n'est pas valide
return false;
}
}

mais le probleme si j'ajoute des adresses mails : younes@doamine.ma, younes1@domaine.ma

il m affiche erreur, je dois pas passer par la fonction si je veux que l'envoie passe ...

Vous avez une idée ?

Merci
Afficher la suite 

Votre réponse

14 réponses

Messages postés
505
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
20 mars 2012
0
Merci
Merci BCP pour ta réponse,

ça marche très très bien (merci une autre fois),

il me reste juste un petit souci si vous pouvez m'aider.

avec ce que j'ai mnt et ce que tu m'a donné seule la syntaxe suivante est correcte :
younes@domaine.com,younes@domaine.com (c est a dire les adresses doivent être attachées avec les virgules).

Merci
Commenter la réponse de younes371
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Dernière intervention
21 avril 2009
0
Merci
De rien ;)

si tu veux enlever les espaces:

$email = str_replace (' ', '', $email);

voila :)
Commenter la réponse de codefalse
Messages postés
505
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
20 mars 2012
0
Merci
Merci pour ta reponse,

Mais je pense qu'il y aura un souci en utilisant ce syntaxe
ou cette fonction meme, car si klk un fais cette adresse :

adre sse@domaine.com ...

tu me comprends ?

c pour ça je veux utiliser "preg_split" mais je sais pas comme la faire avec mon code ...

MErci
Commenter la réponse de younes371
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Dernière intervention
21 avril 2009
0
Merci
Une adresse email avec un espace n'existe pas, ce n'est pas possible.
Donc s'il met un espace, son adresse email est invalide !

Donc tu peux utiliser str_replace
Commenter la réponse de codefalse
Messages postés
505
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
20 mars 2012
0
Merci
Mais l'utilisateur tape une adresse invalide (avec espace) et
on la transforme en adresse valide ...

c bon ça ou pas ?
Commenter la réponse de younes371
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Dernière intervention
21 avril 2009
0
Merci
alors tu peux faire
$email = str_replace (', ', ',', $email);

mais apres forcément si l'utilisateur entre
'mon, email@domain.tld'; ca fera monemail@domain.tld
Commenter la réponse de codefalse
Messages postés
505
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
20 mars 2012
0
Merci
Merci pour les réponses,

D'accord Monsieur,

mais c pas pratique ... car si l'utilisateur entre des adresses
comme :
monemail@domaine.com,monemail1@domaine.com ou
monemail@domaine.com, monemail1@domaine.com

....
tu me comprend, mais c bon en tout cas, car je ferme les yeux si l'utilisateur fs un espace en ecrivant son adresse email ...

Merci
Commenter la réponse de younes371
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Dernière intervention
21 avril 2009
0
Merci
Non à vrai dire je ne comprends pas :p

Tu ne veux pas d'espace entre la virgule et l'email suivant. Donc ton premier cas est correct, et dans ton deuxieme cas, tu fait un str_replace (', ', '', $email) et c'est bon :p

Enfin moi je le vois comme ca :)

Si toutefois c'est pas ca, explique moi, je t'aiderai volontier :)
Commenter la réponse de codefalse
Messages postés
505
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
20 mars 2012
0
Merci
Non ça va Merci,

je vais laisser le script comme tu me l'as donné la première fois,

ça marchait chez moi et je vais pas chercher entre midi é 14heure ...

De toute façon les utilisateur ne sont pas bêtes pour taper
des espaces dans les adresses mails et s'ils le font on va supprimer ces espaces avec ce script ...

Je te remercie infiniment pour ton aide ...
Commenter la réponse de younes371
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Dernière intervention
21 avril 2009
0
Merci
Mais de rien ;) :)
Commenter la réponse de codefalse
Messages postés
32
Date d'inscription
lundi 6 novembre 2000
Dernière intervention
24 janvier 2015
0
Merci
Pour vérifier une adresse mail, il faut vérifier les points suivants
1. La syntaxe de l'adresse
Les adresses suivantes sont valide:  prenom.nom@server1.ulg.ac.be

le nom de domaine peut être remplacé par une adresse IP fixe et l'adresse suivante est valide vfvqdfvjqsd@125.136.123.133
La norme qui défini la syntaxe des adresses mail est la RFC822.

2. Vérifier si il existe au moins un registre MX dans le DNS du serveur.
S'il n'y a pas de registre MX, il n'y a pas de serveur de messagerie et donc l'adresse est fause

list ($user, $domaine) = split ("@", $MailAdresse,2);

if (checkdnsrr ($domaine, "MX"))

            {

3. Ensuite pour chaque serveur contenu dans le registre MX, vérifier si l'adresse existe

if ( getmxrr ($domaine, $ListHosts,$ListPoids))

                {

                $ListMXhosts=array();

                for($HostId=0;$HostId<count($ListHosts);$HostId++)

                    $ListMXhosts[$ListPoids[$HostId]]=$ListHosts[$HostId];

                ksort($ListMXhosts);
Reset($ListMXhosts);
while (( list(, $Host) = @each($ListMXhosts) )
{

Le test de vérification se fait en envoyant au serveur une entête de mail comme ceci:
$fp=@fsockopen($Host, 25, $errno, $errstr, 15)

$Result=fgets ($fp,4096); 

$result doit etre une chaine commancant par 220  --> tester la validité de la réponse avec  ereg ( "^220", $Result )
fputs ($fp, "HELO {$MyServer}\n" );

$Result =fgets ($fp,4096); 


La réponse doit commencé par 250
Si echec, recommancer avec EHLO 
HELO= Code de début de protocol SMTP
EHLO= Code de début de protocol Extended-SMTP
fputs ($fp, "MAIL FROM: \r\n");

$Result=fgets ($fp,4096); 



La réponse doit commencé par 250
fputs ($fp, "RCPT TO:<".$MailAdresse.">\r\n");

$Result=fgets ($fp,4096); 

La réponse doit commencé par 250

fputs ($fp, "RSET\r\n");

fputs ($fp, "QUIT\r\n");


Ces deux dernières commande annule la transaction (si tout est OK)

Si au cour de la procédure le code retourné par le serveur n'est pas correcte, cela signifie que le serveur refuse de recevoir un mail en provenance de votre serveur (si premier code <> de 220), de votre mail (second test) ou pour ce destinataire (3eme test).
Dans tous les cas, vous ne pourez pas envoyer de mail à ce destinatire.

Ne pas oublier de reseter la connexion et de quitter sinon vous allez être bannis par le serveur destinataire.

Si la procédure se termine correctement, vous avez la certitude que l'adresse est valide et peut recevoir des mails.
Avec cette solution, le test est transparent, le destinataire ne reçois rien.

Ceci ne fonctionne pas avec tous les serveurs. Certains désactivent la commande RCPT. (Hotmail, MSN, Yahoo)

Dans ce cas, quand c'est possible, il reste la solution d'envoyer au destinataire un mail avec un lien de confirmation sur lequel le destinataire doit cliqué pour activer son compte

Evidement, il y  a des provider comme (comme cybernet) qui ont placé un anti-spam où c'est l'expéditeur qui reçoit un mail avec un lien que seul un humain peut valider.
Pour ces provider, la premiere solution est fonctionelle, mais pas la la seconde.

En résumé, il n'existe pas de bonne solution, le seul moyen de vérifier la validité d'une adresse mail est de faire un test adaptatif en fonction du serveur du destinataire.

JanhsH
--

¸,ø¤°`°¤ø,¸_¸,ø¤°`°¤ø,¸_¸,ø¤°°¤ø,¸_¸,ø¤°`°¤ø,¸_¸,ø¤°°¤ø,¸_¸,ø¤°°¤ø,¸_¸,ø¤°°¤ø,¸
– Union belge des Géomètres-Experts - Site des Géomètres-Experts - Site des Géomètres-Experts - Site du salon GEOeXpo - Association Liègeoise des Géomètres-Experts - Union des Géomètres Experts du Namurois - La formation continuée des Géomètres-Experts

¸,ø¤°`°¤ø,¸_¸,ø¤°`°¤ø,¸_¸,ø¤°°¤ø,¸_¸,ø¤°`°¤ø,¸_¸,ø¤°°¤ø,¸_¸,ø¤°°¤ø,¸_¸,ø¤°°¤ø,¸
Commenter la réponse de cs_janhsh
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Dernière intervention
21 avril 2009
0
Merci
Je suis presque d'accord avec toi.

Les fonctions checkdnsrr et getmxrr ne sont pas disponibles pour windows. Et comme beaucoup d'utilisateurs utilisent windows, cela peux poser problèmes.

Ensuite, le fait d'interroger le serveur en s'y connectant (fsockopen) peux ne pas aboutir et faire planter le script (jusqu'au timeout d'éxécution) si le serveur n'existe pas.

Mais sinon comme tu l'as bien dit, il n'existe pas de solutions totalement fonctionnelle.
Commenter la réponse de codefalse
Messages postés
32
Date d'inscription
lundi 6 novembre 2000
Dernière intervention
24 janvier 2015
0
Merci
En natif checkdnsrr et getmxrr  n'existe pas sur php windows, mais il existe une extension à charger qui permet ces fonctions.

Pour ce qui est du time-out, il est possible d'imposer à la fonction fsockopen un délais plus court que celui du script et capturer l'erreur.

La solution que j'utilise sur plusieurs site est assez simple (voir par exemple http://www.geoformation.be/subscribe )

On demande à l'utilisateur d'entrer son adresse mail avant son inscription, et un code captcha pour éviter la pollution par les  robot.

En phase 1: le mail est vérifié :Syntaxte et registre MX mais pas l'écriture
En phase 2: Un mail est envoyé au souscripteur

2 cas possible:
- Le destinataire reçois le mail et alors on est certain que l'adresse est correcte
- Si le destinataire ne recois pas le mail, soit que le mail est bloqué par l'anti spam, soit que l'adresse est erronnée, il devra changer d'adresse. De toute facon, s'il ne reçois pas ce mail d etest cela ne sers a rien de stocker l'adresse ele esrt d'aucune utilité.
Le destinataire clique sur un lien contenu dans le mail et peut alors commener son inscription.

Pour l'envoi du mail j'utilise la classe que vous trouverez ici : CLASSE-MESSAGERIE

JanhsH
--

?,ø?°`°?ø,?_?,ø?°`°?ø,?_?,ø?°°?ø,?_?,ø?°`°?ø,?_?,ø?°°?ø,?_?,ø?°°?ø,?_?,ø?°°?ø,?
- Union belge des Géomètres-Experts - Site des Géomètres-Experts - Site des Géomètres-Experts - Site du salon GEOeXpo - Association Liègeoise des Géomètres-Experts - Union des Géomètres Experts du Namurois - La formation continuée des Géomètres-Experts

?,ø?°`°?ø,?_?,ø?°`°?ø,?_?,ø?°°?ø,?_?,ø?°`°?ø,?_?,ø?°°?ø,?_?,ø?°°?ø
Commenter la réponse de cs_janhsh
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Dernière intervention
21 avril 2009
-2
Merci
tu fait :
$aEmails = explode (',', str_replace (' ', '', $email));

foreach ($aEmails as $mail) {
// $mail est un email, tu n'a qu'à le passer dans ta fonction et essayer
// Si elle retourne false, c'est que l'email est invalide
}

Pour l'envoi de mail, je te conseille d'utiliser une classe déjà faite plutot que de passer par la fonction mail.
Si tu n'en a pas sous la main, recherche sur phpcs, tu devrait en trouver des bonnes (regarde leur note et leur date)
Commenter la réponse de codefalse

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.