Comment tester la validité d'une adresse électronique ?

Présentation
Pour tester la validité d'une adresse électronique, inutile de s'acharner à trouver la bonne expression régulière. Il existe des modules perl le faisant pour nous proprement.

Voici un exemple de codes utilisant des modules différents Email::Valid et Mail::CheckUser.
Téléchargement
Compatibilité
Linux Mac Windows
0  0 
Téléchargé 3 fois Voir les 8 commentaires
Détails
Catégories : Divers
Avatar de djibril
Responsable Perl et Outils
Voir tous les téléchargements de l'auteur
Licence : Freeware
Date de mise en ligne : 31 mai 2011




Avatar de Jasmine80 Jasmine80 - Membre émérite https://www.developpez.com
le 28/06/2011 à 9:59
Coucou,

La fonction 'recherche avancée' m'a une fois de plus bien servie.

Quand il s'agit de récupérer des milliers d'adresses électroniques noyées dans un fichier texte, une regexp est-il utile? Elles sont valides, il ne faut pas le vérifier, simplement les extraire.

style
Code : Sélectionner tout
if($line =~ m/([a-z_\-.0-9]+@[a-z_\-.0-9]+)/i)
ou en plus court

Code : Sélectionner tout
if($line =~ m/([\w\-\.]+@[\w\-\.]+)/)

petite curiosité trouvée au hasard sur le net :

le regexp d'un mail est assez compliquer, pour valider si le mail est bon ca donne ca :
Code : Sélectionner tout
1
2
3
4
/^((\\\"[^\\\"\\f\\n\\r\\t\\b]+\\\" )|([A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\
\+\\-\\~\\/\\^\\`\\|\\{\\}]+(\\.[A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\
~\\/\\^\\`\\|\\{\\}]*)*))@((\\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0
-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-
4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0
-9])))\\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(
2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9
]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9
])(([A-Za-z0-9\\-])*([A-Za-z0-9]))?(\\.(?=[A-Za-z0-9]))?)+[A-Za-z\\-]*))
$/D
... je suppose que c'est à ce code barbare, que je ne comprends d'ailleurs pas, que tu fais allusion en disant 'Pour tester la validité d'une adresse électronique, inutile de s'acharner à trouver la bonne expression régulière.'

Merci
Avatar de djibril djibril - Responsable Perl et Outils https://www.developpez.com
le 28/06/2011 à 10:53
Citation Envoyé par Jasmine80 Voir le message

petite curiosité trouvée au hasard sur le net :

Code : Sélectionner tout
1
2
3
4
/^((\\\"[^\\\"\\f\\n\\r\\t\\b]+\\\" )|([A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\
\+\\-\\~\\/\\^\\`\\|\\{\\}]+(\\.[A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\
~\\/\\^\\`\\|\\{\\}]*)*))@((\\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0
-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-
4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0
-9])))\\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(
2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9
]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9
])(([A-Za-z0-9\\-])*([A-Za-z0-9]))?(\\.(?=[A-Za-z0-9]))?)+[A-Za-z\\-]*))
$/D
... je suppose que c'est à ce code barbare, que je ne comprends d'ailleurs pas, que tu fais allusion en disant 'Pour tester la validité d'une adresse électronique, inutile de s'acharner à trouver la bonne expression régulière.'

Merci
Tout à fait .

Pour ton code où tu ne souhaites qu'extraire les adresses emails, il y a surement un module nous permettant d'avoir le bon pattern pour la regex, il faut juste chercher sur le CPAN. Si je le retrouve, je te le mentionne ici et on pourrait le rajouter dans les sources.
Avatar de Jasmine80 Jasmine80 - Membre émérite https://www.developpez.com
le 28/06/2011 à 11:04
Voici mon code terminé qui fonctionne parfaitement (jusqu'à preuve du contraire) :

Code : Sélectionner tout
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
#!/usr/local/bin/perl


use strict;
use warnings;

use List::Compare;


# chemin vers les fichiers
my $file_path1 = 'P:/Theorie/Driss/adresses_mail/New_Yeast_2011.txt';
my $file_path2 = 'P:/Theorie/Driss/adresses_mail/retour_yeast_email_format.txt';


# récupérér l'entiereté du premier fichier dans une variable $file_content1
open my($file1), '<', $file_path1
  or die "Can't open $file_path1 : $!\n";
my $file_content1 = do { local $/; <$file1> };
close $file1;

# récupérér l'entiereté du second fichier dans une variable $file_content2
open my($file2), '<', $file_path2
  or die "Can't open $file_path2 : $!\n";
my $file_content2 = do { local $/; <$file2> };
close $file2;

# récupération des adresses électroniques dans deux listes @mail_list1 et @mail_list2
my @mail_list1 = $file_content1 =~ m/([\w\-\.]+@[\w\-\.]+)/g;
my @mail_list2 = $file_content2 =~ m/([\w\-\.]+@[\w\-\.]+)/g;

# suppression des adresses électroniques doubles
@mail_list1 = &supprime_doublon(\@mail_list1 );
@mail_list2 = &supprime_doublon(\@mail_list2 );

# affichage du nombre d'adresses uniques pour chaque liste
print "mail_list1 : ".@mail_list1."\n";
print "mail_list2 : ".@mail_list2."\n";

# création d'une comparaison de listes avec le module List::Compare
my $lc = List::Compare->new(\@mail_list1 , \@mail_list2);

# recherche des adresses n'apparaissant que dans la première liste
my @Lonly = $lc->get_unique;

print "adresses de New Yeast 2011.xls sans celles de Retour yeast email.txt  : ".@Lonly."\n";

print (join "\n", @Lonly);
print "'\n\n";





sub supprime_doublon{
        my $self=shift;
        my %saw;
        my @result = @$self;	   #deréférence le tableau, donc on le récupère et le copie dans @result
  			           #pour eviter de travailler sur le tableau d'origine et le modifier.
        undef %saw;
        @saw{@result} = ();	   #chaque case de @result est mis en clef dans %saw avec une valeur nulle. et comme un
        @result = sort keys %saw;  #hash n'a pas deux clefs identiques, redondances supprimées.
        return(@result);
}

... je ne dis pas qu'il est optimal au niveau temps d'exécution mais ça me suffit largement.

Citation Envoyé par Djibril
il y a surement un module nous permettant d'avoir le bon pattern pour la regex, il faut juste chercher sur le CPAN
Pourquoi faire simple si il y a compliqué ... heuh non, l'inverse

N'est-ce pas amplement suffisant :
Code : Sélectionner tout
my @mail_list1 = $file_content1 =~ m/([\w\-\.]+@[\w\-\.]+)/g;

nb : le sous-programme supprime_doublon, je le dois à Jedaï ... merci encore à lui, ça me sert tout le temps.

EDIT ; un grand merci à Djibril pour son sous-programme supprime_doublon
Avatar de djibril djibril - Responsable Perl et Outils https://www.developpez.com
le 28/06/2011 à 12:01
supprime_doublon c'est ma procédure mais de toute façon, jedai aurait été capable de la faire également . Quant à ta regex, si elle te suffit, pas besoin de se compliquer la vie .
Avatar de Jasmine80 Jasmine80 - Membre émérite https://www.developpez.com
le 28/06/2011 à 12:23
Citation Envoyé par djibril Voir le message
supprime_doublon c'est ma procédure

désolée pour cette méprise bisous pour te consoler
Avatar de djibril djibril - Responsable Perl et Outils https://www.developpez.com
le 30/06/2011 à 14:37
Le module est Email::Find.
Avatar de Jasmine80 Jasmine80 - Membre émérite https://www.developpez.com
le 30/06/2011 à 14:54
Citation Envoyé par djibril Voir le message
Le module est Email::Find.
C'est tout à fait cela, merci.
Avatar de djibril djibril - Responsable Perl et Outils https://www.developpez.com
le 30/06/2011 à 14:58
Je vais rajouter un programme dans nos sources à télécharger.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.