Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Creare un email parser?

    Chi mi aiuta a creare un semplice programmino (in bash o in perl) per estrarre le email da un file di testo?

    quello che dovrebbe fare è cercare il carattere chiocciolina, a quel punto scorrere a sinistra fino a quando non trova uno spazio o un simbolo minore (<), poi scorrere a destra e fare la medesima cosa per il simbolo spazio e il simbolo maggiore (>); quello che sta nel mezzo è l'indirizzo email.

    Ho questo problema perchè ho estratto i campi from dalle email che ho salvato in thunderbird, e questi si presentano essenzialmente in due forme:

    From: fabrizio@ciacchi.it

    oppure

    From: "Fabrizio Ciacchi" <fabrizio@ciacchi.it>

    Con un parser del genere riuscirei a estrarre l'indirizzo vero e proprio.

    Chi mi da una mano? Ah, basta che il programma stampi a video il risultato, tanto poi basta usare i simboli della bash per salvare il file...



    PS: se ci fosse anche il modo di togliere i doppioni
    [Homepage] [Contattami]
    Powered by: Ubuntu - Debian - Gentoo
    Developing: Java - C++ - PHP

    [supersaibal]"Perchè tanto Debian è meglio"
    [/supersaibal]

  2. #2
    vuoi una mano a capire come fare o vuoi che qualcuno ti scriva lo script?
    Se cerchi nel topic "artigianato del forum" ne trovi uno gia' fatto che, se ben ricordo, è praticamente uguale.
    PyGTK GUI programming
    un impegno concreto: eliminare la k dalle tastiere italiane

  3. #3
    l'ho fatto in java...



    funziona quasi perfettamente...

    Codice PHP:
    // Classi di IMPORT
    import java.io.*;
    import java.net.*;
    import java.util.*;

    class 
    ParserEmail 
    // Classe parserEmail OPEN

        
    public static void main(String[] argsthrows Exception 
            
    // Metodo main() OPEN

            // Specifica il nome del file da processare
            
    String nomeFile args[0];

            
    // Stampo a video le informazioni sullo script
            
    System.out.println("**************");
            
    System.out.println(" Email Parser ");
            
    System.out.println("**************");
            
    System.out.println("");

            
    // incapsula in BufferedReader un file aperto in lettura 
            
    BufferedReader filebuf = new BufferedReader(new FileReader(nomeFile));
            
            
    /* equivale alla coppia di istruzioni:
             *
             * FileReader filein = new FileReader("copyread.txt");
             * BufferedReader filebuf = new BufferedReader(filein);
             */

             
    String nextStr;
             
    String emailStr;
             
    nextStr filebuf.readLine();     // legge una riga del file 
             
             
    String[] emailArray= new String[6000];
             
             
    int inizio = -1;
             
    int fine = -1;
             
    int counter 0;
             
             
    int daAggiungere 0;
             
             while (
    nextStr != null){
                 
                 try {
                     
    inizio nextStr.indexOf("<");
                     
    fine nextStr.lastIndexOf(">");
                 
                     if (
    inizio != -&& fine != -1){
                         
    emailStr nextStr.substring(inizio+1,fine);
                     } else {
                         
    inizio nextStr.indexOf(" ");
                         
    emailStr nextStr.substring(inizio+1nextStr.length());
                     }
                     
                     for (
    int i 0counteri++){
                         if (
    emailArray[i].equalsIgnoreCase(emailStr)){
                             
    daAggiungere 0;
                             break;
                         } else{
                             
    daAggiungere 1;
                         }
                     }
                     
                     if (
    daAggiungere == || counter == 0){
                         
    emailArray[counter] = emailStr;
                         
    counter += 1;
                     }
                     
                     
    nextStr filebuf.readLine(); // legge la prossima riga 
                 
    } catch (Exception e){
                     
    nextStr filebuf.readLine(); // legge la prossima riga 
                 
    }
             }

             
             for (
    int i 0counteri++){
                 
    System.out.println(emailArray[i]);
             }

             
    filebuf.close();  // chiude il file 

        
    // Metodo main() CLOSE

    // Classe ParserEmail CLOSE 
    [Homepage] [Contattami]
    Powered by: Ubuntu - Debian - Gentoo
    Developing: Java - C++ - PHP

    [supersaibal]"Perchè tanto Debian è meglio"
    [/supersaibal]

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894
    Basta usare sed...

  5. #5
    Originariamente inviato da l.golinelli
    Basta usare sed...
    spiego la procedura che ho seguito di cui il programm in java è una parte, spero in futuro di riuscire a fare tutto il programma in java.


    Prima mi porto nella cartella di thunderbird e catturo i campi "From:" e "To:" delle email inviate.

    cd .thunderbird/default.lpr/Mail/Localhost
    cat Inbox | grep From: > mailFrom01.txt
    cat Sent | grep To: > mailTo01.txt

    a scanso di errori, faccio una cernita relativa a quelli che contengono solo la chiocciolina

    cat mailFrom01.txt | grep @ > mailFrom02.txt
    cat mailTo01.txt | grep @ > mailTo02.txt

    Poi unisco i due file

    cat mailFrom02.txt mailTo02 > mail03.txt

    a questo punto eseguo il programma in JAVA di cui ho postato il codice per estrarre gli indirizzi email e togliere i doppioni

    gedit ParserEmail.java
    - copiare il codice JAVA -
    javac ParserEmail.java
    java ParserEmail mail03.txt

    ripuliamo sempre cercando il simbolo chiocciolina

    cat mail03.txt | grep @ > mail04.txt

    apriamo il file OpenOffice Writer, poi apriamo OpenOffice Calc e copiamo/incolliamo il testo da OOW a OOC, in questo modo ogni email viene copiata in una cella...
    Selezioniamo qualcosa tipo "Strumenti->Ordina" ed ordiniamo in ordine alfabetico gli elementi.
    Con un po' di pazienza eliminiamo gli indirizzi non utili.

    Risalviamo in formato testo! adesso abbiamo un file con tutti gli indirizzi email di chi ci ha scritto e a cui abbiamo scritto; ovviamente nel mucchio ci sono molti indirizzi inutili (tipo forum o maling list), ma non sono moltissimi e con un po' di lavoro si possono togliere...

    In tutta l'operazione abbiamo volta volta scremato la quantità di indirizzi, quindi direi che il risultato ottuneto è quantomeno accettabile.

    Io da circa 7000 email ho ricavato più di mille indirizzi...
    [Homepage] [Contattami]
    Powered by: Ubuntu - Debian - Gentoo
    Developing: Java - C++ - PHP

    [supersaibal]"Perchè tanto Debian è meglio"
    [/supersaibal]

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Originariamente inviato da l.golinelli
    Basta usare sed...
    Confermo. Mi è bastato dare 3 sed, ma forse si può fare di meglio.
    Slack? Smack!

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Versione migliorata.
    Utilizzo un grep ed un sort.
    La versatilità è merito della espressione regolare che descrive un modello di indirizzo di posta comune.
    grep si occupa di selezionare esclusivamente cio' che corrisponde al patterne della regexp, mentre sort elimina i duplicati.

    Il test è stato effettuato nel seguente modo:
    codice:
    $ cat /path/to/mozilla/mail/file | grep -oe "[a-zA-Z0-9\.-]\+@[a-zA-Z0-9\.-]\+" | sort -u
    Mi risulta soddisfacente in quanto il risultato è un estratto
    di ogni indirizzo di posta elettronico valido (in base alla regexp )

    Il tempo necessario per effettuare l'operazione di redirezione verso un file mi pare più che accettabile.
    codice:
    sergio@winnie:~$ v .mozilla/default/0osuboy4.slt/Mail/mail.freehtml.it/Inbox
    -rw-r--r--  1 sergio users 32M 2004-12-04 21:56 .mozilla/default/0osuboy4.slt/Mail/mail.freehtml.it/Inbox
    sergio@winnie:~$ time cat .mozilla/default/0osuboy4.slt/Mail/mail.freehtml.it/Inbox > list-address 
    
    real    0m0.207s
    user    0m0.000s
    sys     0m0.200s
    Fatemi sapere che ne pensate.

    Slack? Smack!

  8. #8
    Originariamente inviato da Sergio Pedone
    codice:
    $ cat /path/to/mozilla/mail/file | grep -oe "[a-zA-Z0-9\.-]\+@[a-zA-Z0-9\.-]\+" | sort -u
    L'opzione -o mi ha aperto un mondo, grazie

    [edit]
    PS: per la serie "pelo nell'uovo": il cat e` inutile
    [/edit]
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Originariamente inviato da Ikitt
    PS: per la serie "pelo nell'uovo": il cat e` inutile
    Più che giusto! Il fatto è che ho utilizzato cat per rendere la riga "più leggibile".

    Tra l'altro riporto la riga di test corretta, perchè la precedente non prevedeva un passaggio effettuato in precedenza. Infatti anche i tempi sono più ragionevoli.
    codice:
    sergio@winnie:~$ time cat .mozilla/default/0osuboy4.slt/Mail/mail.freehtml.it/Inbox | \
                     grep -oe "[a-zA-Z0-9\.-]\+@[a-zA-Z0-9\.-]\+" | sort -u > list-address
    
    real    0m1.388s
    user    0m0.080s
    sys     0m0.150s
    Grazie per le osservazioni Ikitt.
    Slack? Smack!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.