Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1924 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  comment parser une adresse mail

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

comment parser une adresse mail

n°877878
freed102
Arayashiki
Posté le 20-10-2004 à 13:21:26  profilanswer
 

voila j'ai besoin de parser un fichier texte et en extraire les adresses mail, trier, enregistrer dans la base uniquement ceux qui n'existent pas... comment je pourrai proceder ?  
 
j'imagine qu'il faut "parser" le fichier et controler les adresses mails.... mais je sais pas comment faire

mood
Publicité
Posté le 20-10-2004 à 13:21:26  profilanswer
 

n°877894
freed102
Arayashiki
Posté le 20-10-2004 à 13:37:28  profilanswer
 

freed102 a écrit :

voila j'ai besoin de parser un fichier texte et en extraire les adresses mail, trier, enregistrer dans la base uniquement ceux qui n'existent pas... comment je pourrai proceder ?  
 
j'imagine qu'il faut "parser" le fichier et controler les adresses mails.... mais je sais pas comment faire


 
je fais un fread...
 
puis un truc genre  (vite fait)
 
 

Code :
  1. if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email))
  2.  {
  3.         $sql="insert into clients";
  4. $sql.=values email=$email";
  5. mysql_query($sql);
  6.  }


 
 :??:

n°877900
Xav_
The only one...
Posté le 20-10-2004 à 13:42:34  profilanswer
 

je verrai une syntaxe plus proche de ça:

Code :
  1. $sql="insert into clients(email)";
  2. $sql.="values '".$email."'";


 


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°877903
Xav_
The only one...
Posté le 20-10-2004 à 13:44:19  profilanswer
 

et puis tu veux enregistrer que ceux qui n'existe pas il me semble, donc il faut tester un mail avant de l'insérer...
 
je verrai bien lire ta base une fois pour en extraire les mails, les stocker dans un tableau, ensuite avant d'insérer un mail, tu vérifie qu'il n'est pas dans le tableau.


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°877908
KangOl
Profil : pointeur
Posté le 20-10-2004 à 13:47:00  profilanswer
 

donc :  
1/ lire ta base de donnée et stocker tous les mails dans un tableau
2/ paser ton fichier texte avec une regex pour trouver les mails...
3/ comparer les mails de la base et les mail du fichier (in_array est ton ami)
4/ ajouter les mails manquant dans la base...


---------------
Nos estans firs di nosse pitite patreye...
n°877939
freed102
Arayashiki
Posté le 20-10-2004 à 14:05:59  profilanswer
 

Xav_ a écrit :

je verrai une syntaxe plus proche de ça:

Code :
  1. $sql="insert into clients(email)";
  2. $sql.="values '".$email."'";




 
oui tu as raison j'ai fait ça vite fait sans me soucier de la syntaxe exacte du insert into
thx

n°877943
freed102
Arayashiki
Posté le 20-10-2004 à 14:07:53  profilanswer
 

je viens de me rendre compte que mon fichier ressemble à un fichier csv avec des tabulations comme séparateurs... donc je suis en train d'etudier la fonction fgetcsv avec un "\t" comme argument de séparateur... j'arrive à lister la liste des emails contenus dans le fichier... c deja un bon debut ! :) (même si j'ai pas vraiment parsé le fichier)

n°877944
KangOl
Profil : pointeur
Posté le 20-10-2004 à 14:08:53  profilanswer
 

si il n'y a que des adresses email dans le fichier c'est encore plus simple, il n'y a pas besoin des regex...


---------------
Nos estans firs di nosse pitite patreye...
n°877969
freed102
Arayashiki
Posté le 20-10-2004 à 14:28:55  profilanswer
 

bah en fait c galere parcequ'il y a pas que des adresses, et par moments l'adresse n'est pas dans sa colonne respective.. alors là faut trier ! lol

n°878147
freed102
Arayashiki
Posté le 20-10-2004 à 16:30:25  profilanswer
 

Alors un autre probleme arrive...
 
voila j'ai exporté tous les emails proprement,
j'ai remplacé les champs vides par l'adresse mail elle même (genre si il manque le nom, on remplace par l'adresse car un champ nom vide est pas tres correct à mon sens)
et j'enregistre dans la base uniquement si il n'existe pas dans la base...
 
tout s'enregistre à merveille... pas de doublon possible...
 
cependant... il m'enregistre que 128 elements...(sur 3500 environs).... c sympa !!! d'ou ça vient ? on est pas limité à 128 recordsets dans une table quand même ? ou alors c ma boucle qui est trop longue ??? :??:

mood
Publicité
Posté le 20-10-2004 à 16:30:25  profilanswer
 

n°878151
KangOl
Profil : pointeur
Posté le 20-10-2004 à 16:36:43  profilanswer
 

ca, ca viens de ta table...
l'id est surement un tinyint limité a 128...
 
faut changer ca et mettre plus


---------------
Nos estans firs di nosse pitite patreye...
n°878201
freed102
Arayashiki
Posté le 20-10-2004 à 17:18:11  profilanswer
 

oui ça va mieux mais ya toujours un probleme, j'ai l'impression que ma boucle plante tant il m'enregristre pas toujours le même nombre d'enregistrements :-/


Message édité par freed102 le 20-10-2004 à 17:19:08
n°878206
KangOl
Profil : pointeur
Posté le 20-10-2004 à 17:20:26  profilanswer
 

fait des echos pour voir l'avancement...


---------------
Nos estans firs di nosse pitite patreye...
n°878209
freed102
Arayashiki
Posté le 20-10-2004 à 17:21:55  profilanswer
 

bah c ce que je fais... il plante une fois au 57e, quand je faire reload il plante au 44e, puis quand je faire reload, il plante au 75e... etc etc.. bizarre quoi !

n°878213
KangOl
Profil : pointeur
Posté le 20-10-2004 à 17:24:00  profilanswer
 

plante ? il met un message d'erreur ?


---------------
Nos estans firs di nosse pitite patreye...
n°878222
freed102
Arayashiki
Posté le 20-10-2004 à 17:31:15  profilanswer
 

KangOl a écrit :

plante ? il met un message d'erreur ?


 
non ya pas de message d'erreur mais il arrete de mouliner avant la fin et n'affiche pas la suite ;-(

n°878224
freed102
Arayashiki
Posté le 20-10-2004 à 17:31:53  profilanswer
 

ne riez pas trop mais voila mon code :
 

Code :
  1. <?php
  2. include ("./db.php" );
  3. $result=dbreq("select email from visiteurs" );
  4. $numrows=mysql_num_rows($result);
  5. for($i=1;$i<=$numrows;$i++){
  6. $databdd=mysql_fetch_array($result);
  7. $data_bdd_array[$i][email]=$databdd[email];
  8. }
  9. echo "nbr de mails enregistrés : $numrows";
  10. //print_r($data_bdd_array);
  11. //print_r($databdd);
  12. echo "<p>--------------------</p>";
  13. $row = 1;
  14. $row_mail=1;
  15. $row_nom=1;
  16. $handle = fopen("test.csv", "r" );
  17. while (($data = fgetcsv($handle, 100000, "\t" )) !== FALSE)
  18. {
  19.    echo "<p>";
  20.    echo "N° : $row<br />\n";
  21.    echo "Nom : $data[0]<br />\n";
  22.    echo "Prenom : $data[1]<br />\n";
  23.    echo "Surnom : $data[4]<br />\n";
  24.    echo "Email : $data[34]<br />\n";
  25.  
  26.      if(!in_array(strtolower($data[34]),$data_bdd_array))
  27.      {
  28.        echo " n'est pas dans la base";
  29.        echo "<br />";
  30.      
  31.        $name=strtoupper($data[0].$data[1].$data[4]);
  32.        $email=strtolower($data[34]);
  33.      
  34.        if(empty($name))
  35.        {
  36.        $name=strtoupper($email);
  37.        }
  38.        if(!empty($email))
  39.        {
  40.        $row_mail++;
  41.        $result=dbreq("INSERT INTO visiteurs (nom, email, droits) VALUES ('$name', '$email','0')" );
  42.        }
  43.        echo $email." est  enregistré !</p><hr>";
  44.      }
  45.      else
  46.      {
  47.      echo "<br/> est deja dans la base</p><hr>";
  48.      }
  49.  $result=dbreq("select email from visiteurs" );
  50.  $numrows=mysql_num_rows($result); 
  51.  for($i=1;$i<=$numrows;$i++)
  52.  {
  53.  $databdd=mysql_fetch_array($result);
  54.  $data_bdd_array[$i][email]=$databdd[email];
  55.  }
  56. $row++;
  57. }
  58. fclose($handle);
  59. echo $row_mail." mails enregistrés sur ".$row." enregistrements<br />";
  60. print_r($data_bdd_array);
  61. ?>

n°878235
Xav_
The only one...
Posté le 20-10-2004 à 17:38:05  profilanswer
 

tu aurais pas un pb à cause du temps maximum d'exécution du script (voir php.ini) ???


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°878240
freed102
Arayashiki
Posté le 20-10-2004 à 17:39:34  profilanswer
 

oui c peut etre un truc comme ça.. en fait je sais pas comment acceder à php.ini (ne riez pas !!!!! lol)
PS : l'hebergeur c'est Online.net ... peut etre c la le probleme

n°878241
KangOl
Profil : pointeur
Posté le 20-10-2004 à 17:40:19  profilanswer
 

ligne 57 : pourquoi tu refait la requete ?


---------------
Nos estans firs di nosse pitite patreye...
n°878242
KangOl
Profil : pointeur
Posté le 20-10-2004 à 17:41:36  profilanswer
 

freed102 a écrit :

oui c peut etre un truc comme ça.. en fait je sais pas comment acceder à php.ini (ne riez pas !!!!! lol)
PS : l'hebergeur c'est Online.net ... peut etre c la le probleme

http://be2.php.net/manual/fr/funct [...] -limit.php


---------------
Nos estans firs di nosse pitite patreye...
n°878243
freed102
Arayashiki
Posté le 20-10-2004 à 17:42:37  profilanswer
 

autre remarque... mon test si l'email existe dans la base marche pas :( j'ai quand même des doublons :(

n°878247
Xav_
The only one...
Posté le 20-10-2004 à 17:46:18  profilanswer
 

pkoi faire un mysql_num_rows puis un for de 0 à numrows, avec un while mysql_fetch_array ça le ferai très bien aussi...


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°878248
freed102
Arayashiki
Posté le 20-10-2004 à 17:47:00  profilanswer
 

Warning: set_time_limit, getmyuid, getmypid, dl, mail, ini_alter, ini_restore, ini_set, exec, passthru, system, popen, leak, mysql_list_dbs, listen, chown, chmod, chgrp, diskfreespace, rmdir, realpath, tmpfile, link, imap_mail() has been disabled for security reasons in testcsv.php on line 11
 
:( :( :( :cry:

n°878252
Xav_
The only one...
Posté le 20-10-2004 à 17:50:22  profilanswer
 

ton hébergeur ne te permet pas de changer cette valeur (le time-limit), donc tu l'a dans l'os :(
mais en effet avec la requete dans le while, elle va se faire 3500 fois d'après un tes posts précédent --> ça pue, faut que tu arrive avec une vérification qui marche dans le tableau, sans refaire une lecture de la BDD à chaque fois...


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°878253
Xav_
The only one...
Posté le 20-10-2004 à 17:51:28  profilanswer
 

de meme tu peux grouper tes VALUES pour ne faire qu'une seule requete d'INSERT à la fin ;)


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°878274
freed102
Arayashiki
Posté le 20-10-2004 à 18:05:30  profilanswer
 

Xav_ a écrit :

ton hébergeur ne te permet pas de changer cette valeur (le time-limit), donc tu l'a dans l'os :(
mais en effet avec la requete dans le while, elle va se faire 3500 fois d'après un tes posts précédent --> ça pue, faut que tu arrive avec une vérification qui marche dans le tableau, sans refaire une lecture de la BDD à chaque fois...


 
j'ai fait comme ça car en fait si je lis qu'une fois le contenu de la bdd... il peut pas voir si l'adresse existe dedans... donc il relis à chaque instance de la boucle... à moins de tricher en ajoutant l'adresse insérée dans le tableau ($data_bdd_array) (sans relire la bdd)... non ?

n°878280
KangOl
Profil : pointeur
Posté le 20-10-2004 à 18:10:44  profilanswer
 

bin oui...


---------------
Nos estans firs di nosse pitite patreye...
n°878652
Xav_
The only one...
Posté le 21-10-2004 à 08:12:34  profilanswer
 

freed102 a écrit :

j'ai fait comme ça car en fait si je lis qu'une fois le contenu de la bdd... il peut pas voir si l'adresse existe dedans... donc il relis à chaque instance de la boucle... à moins de tricher en ajoutant l'adresse insérée dans le tableau ($data_bdd_array) (sans relire la bdd)... non ?


 
ben c'est pas de la triche, c'est plutot la bonne méthode ;)


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°878809
freed102
Arayashiki
Posté le 21-10-2004 à 12:53:09  profilanswer
 

donc je n'insere qu'une seule fois dans la base ? c possible ?

n°879003
Xav_
The only one...
Posté le 21-10-2004 à 15:05:46  profilanswer
 

oui


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°879004
freed102
Arayashiki
Posté le 21-10-2004 à 15:06:42  profilanswer
 

avec 3500 adresses ça va pas faire une commande de 200 lignes pour MySQL ?

n°879019
Xav_
The only one...
Posté le 21-10-2004 à 15:23:19  profilanswer
 

et alors ? quand je fais un site avec une BDD, pour l'installer plus facilement en ligne, je crée un fichier sql avec la strcuture et données des tables... quand le le balance en ligne (avec PHPmyadmin), c'est pas rare qu'il exécute plusieurs centaine de ligne de requete...
il te dis juste à la fin combien d'instruction ça a fait ;)


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°879034
freed102
Arayashiki
Posté le 21-10-2004 à 15:33:40  profilanswer
 

sympa !!! on peut envoyer des requetes sql avec des tableaux? ou il faut decomposer le tableau ?
 
Je galere toujours avec mon timeout... j'ai supprimé les requetes sql successives.. j'arrive à un meilleur resultat.. Mais la boucle n'est toujours pas bouclée ! :(
 
de plus il compare pas correctement avec les mails deja existants.. il renvoie que le mail n'existe pas à chaque fois (même quand il existe... ma technique avec in_array ne doit pas etre bonne)
 

Code :
  1. <?php
  2. phpinfo();
  3. //set_time_limit(3200) ;
  4. include ("./db.php" );
  5. $result=dbreq("select email from visiteurs" );
  6. $numrows=mysql_num_rows($result);
  7. for($i=1;$i<=$numrows;$i++){
  8. $databdd=mysql_fetch_array($result);
  9. $data_bdd_array[$i][email]=$databdd[email];
  10. }
  11. echo "nbr de mails enregistrés : $numrows";
  12. //print_r($data_bdd_array);
  13. //print_r($databdd);
  14. echo "<p>--------------------</p>";
  15. $row = 1;
  16. $row_mail=1;
  17. $row_nom=1;
  18. $handle = fopen("test.csv", "r" );
  19. while (($data = fgetcsv($handle, 100000, "\t" )) !== FALSE)
  20. {
  21.    echo "<p>";
  22.    echo "N° : $row<br />\n";
  23.    echo "Nom : $data[0]<br />\n";
  24.    echo "Prenom : $data[1]<br />\n";
  25.    echo "Surnom : $data[4]<br />\n";
  26.    echo "Email : $data[34]<br />\n";
  27.  
  28.      if(!in_array(strtolower($data[34]),$data_bdd_array))
  29.      {
  30.        echo " n'est pas dans la base";
  31.        echo "<br />";
  32.      
  33.        $name=strtoupper($data[0].$data[1].$data[4]);
  34.        $email=strtolower($data[34]);
  35.      
  36.        if(empty($name))
  37.        {
  38.        $name=strtoupper($email);
  39.        }
  40.        if(!empty($email))
  41.        {
  42.        $row_mail++;
  43.        $data_bdd_array[$row][email]=$email;
  44.        $data_bdd2record=$email;
  45.       // $result=dbreq("INSERT INTO visiteurs (nom, email, droits) VALUES ('$name', '$email','0')" );
  46.        }
  47.        $data_bdd_array[$row][email]=$email;
  48.        echo $email." est  enregistré !</p><hr>";
  49.      }
  50.      else
  51.      {
  52.      echo "<br/> est deja dans la base</p><hr>";
  53.      }
  54. $row++;
  55. }
  56. fclose($handle);
  57. echo $row_mail." mails enregistrés sur ".$row." enregistrements<br />";
  58. print_r($data_bdd2record);
  59. ?>


Message édité par freed102 le 21-10-2004 à 15:36:56
n°879341
freed102
Arayashiki
Posté le 21-10-2004 à 18:42:06  profilanswer
 

bon !! bonne nouvelle j'ai resolu le probleme de "in_array"
 
.. en fait mon tableau n'etait pas "conforme" donc j'ai trouvé un moyen pour qu'il le soit (un tableau en deux dimensions et non pas un tableau de tableaux !)
 
pour cela faut squizzer le coté "array" du resultat de "mysql_fetch_array" (enfin c ce que j'ai essayé de faire)

Code :
  1. while($databdd=mysql_fetch_array($result))
  2. {
  3. $mailfound=$databdd['email'];
  4. $id=$databdd['id'];
  5. $data_bdd_array[$id]=$mailfound;
  6. $n++;
  7. }


comme ça le tableau est propre et in_array fonctionne bien
 
c deja ça !!! j'ai plus de doublons dans ma base ! :D

n°879347
freed102
Arayashiki
Posté le 21-10-2004 à 18:54:38  profilanswer
 

voila la derniere version de mon code  
 

Code :
  1. <?php
  2. include ("../db.php" );
  3. $result=dbreq("select id, email from visiteurs" );
  4. $numrows=mysql_num_rows($result);
  5. $n=1;
  6. while($databdd=mysql_fetch_array($result))
  7. {
  8. $mailfound=$databdd['email'];
  9. $id=$databdd['id'];
  10. $data_bdd_array[$id]=$mailfound;
  11. $n++;
  12. }
  13. echo "<h2>Anciens enregistrements</h2>";
  14. echo "nbr de mails enregistrés : $numrows";
  15. /*echo "<pre>";
  16. print_r($data_bdd_array);
  17. echo "</pre>";*/
  18. echo "<hr>";
  19. $row = 1;
  20. $row_mail=1;
  21. $row_nom=1;
  22. $file="emails3.txt";
  23. $handle = fopen($file, "r" );
  24. while (($data = fgetcsv($handle, 100000, "\t" )) !== FALSE)
  25. {
  26.    echo "<p>";
  27.    echo "N° : $row<br />\n";
  28.    echo "Nom : $data[0]<br />\n";
  29.    echo "Prenom : $data[1]<br />\n";
  30.    echo "Surnom : $data[4]<br />\n";
  31.    echo "Email : $data[34]<br />\n";
  32.    $mailtest=strtolower($data[34]);
  33.  
  34.      if(!in_array("$mailtest",$data_bdd_array))
  35.      {
  36.        echo " n'est pas dans la base";
  37.        echo "<br />";
  38.      
  39.        $name=strtoupper($data[0].$data[1].$data[4]);
  40.        $email=strtolower($data[34]);
  41.      
  42.        if(empty($name))
  43.        {
  44.        $name=strtoupper($email);
  45.        }
  46.        if(!empty($email))
  47.        {
  48.        $row_mail++;
  49.        //$data_bdd_array[email]=$email;
  50.        $result=dbreq("INSERT INTO visiteurs (nom, email, droits) VALUES ('$name', '$email','0')" );
  51.        $id++;
  52.        $data_bdd_array[$id]=$email;
  53.        $data_bdd_new[$id]=$email;
  54.        }
  55.      
  56.        echo "<font color=blue><b>NOM : </b>$name<br /><b>EMAIL :</b> $email est  maintenant ajouté dans la base !</font></p><hr>";
  57.      }
  58.      else
  59.      {
  60.      echo "<font color=red><br/>$data[34] est deja dans la base</font></p><hr>";
  61.      }
  62. $row++;
  63. }
  64. fclose($handle);
  65. echo "<h2>Nouveaux enregistrements</h2>";
  66. echo $row_mail." mails enregistrés sur ".$row." répertoriés<br />";
  67. echo "<pre>";
  68. print_r($data_bdd_new);
  69. echo "</pre>";
  70. ?>


Message édité par freed102 le 21-10-2004 à 18:55:05
n°879387
Xav_
The only one...
Posté le 21-10-2004 à 20:26:54  profilanswer
 

c'est marrant mais le coup du while il me semble que je l'avai abordé... et du coup je crois que ton mysql_num_rows ne sert plu à rien (tu t'en servait que dans le for), encore une instruction à virer pour réduire le tps d'execution...


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
n°879910
freed102
Arayashiki
Posté le 22-10-2004 à 12:11:44  profilanswer
 

Xav_ a écrit :

c'est marrant mais le coup du while il me semble que je l'avai abordé... et du coup je crois que ton mysql_num_rows ne sert plu à rien (tu t'en servait que dans le for), encore une instruction à virer pour réduire le tps d'execution...


 
je m'en sers uniquement pour afficher le nombre d'enregistrements "Vous avez x enregistrements"

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  comment parser une adresse mail

 

Sujets relatifs
[C] Obtenir sa propre adresse ip etcPasser un argument dans l'adresse
CC basé sur l'adresse email entrée dans le champs "de"comment envoyer un mail au format html en java?
probleme d'un débutant avec la focntion mail()java xml et parser sax
recuperer adresse de la page en coursRécupérer une adresse IP en Java
[PHP] envoyer automatiquement un mail de confirmationFonction mail : problème d'espaces dans les emails
Plus de sujets relatifs à : comment parser une adresse mail


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR