Test validité plusieurs adresse mails

Résolu
younes371 Messages postés 502 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 20 mars 2012 - 18 juil. 2008 à 12:56
cs_janhsh Messages postés 31 Date d'inscription lundi 6 novembre 2000 Statut Membre 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
A voir également:

14 réponses

younes371 Messages postés 502 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 20 mars 2012
18 juil. 2008 à 16:51
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
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
18 juil. 2008 à 17:04
De rien ;)

si tu veux enlever les espaces:

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

voila :)
0
younes371 Messages postés 502 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 20 mars 2012
18 juil. 2008 à 17:41
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
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
18 juil. 2008 à 18:50
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
younes371 Messages postés 502 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 20 mars 2012
18 juil. 2008 à 18:56
Mais l'utilisateur tape une adresse invalide (avec espace) et
on la transforme en adresse valide ...

c bon ça ou pas ?
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
18 juil. 2008 à 20:22
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
0
younes371 Messages postés 502 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 20 mars 2012
21 juil. 2008 à 09:33
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
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
21 juil. 2008 à 10:37
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 :)
0
younes371 Messages postés 502 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 20 mars 2012
22 juil. 2008 à 10:01
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 ...
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
22 juil. 2008 à 10:21
Mais de rien ;) :)
0
cs_janhsh Messages postés 31 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 24 janvier 2015
27 sept. 2008 à 13:23
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

¸,ø¤°`°¤ø,¸_¸,ø¤°`°¤ø,¸_¸,ø¤°°¤ø,¸_¸,ø¤°`°¤ø,¸_¸,ø¤°°¤ø,¸_¸,ø¤°°¤ø,¸_¸,ø¤°°¤ø,¸
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
27 sept. 2008 à 13:41
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.
0
cs_janhsh Messages postés 31 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 24 janvier 2015
23 mars 2009 à 22:08
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

?,ø?°`°?ø,?_?,ø?°`°?ø,?_?,ø?°°?ø,?_?,ø?°`°?ø,?_?,ø?°°?ø,?_?,ø?°°?ø
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
18 juil. 2008 à 16:13
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)
-2
Rejoignez-nous