PDA

Visualizza la versione completa : Creare un email parser?


virusbye
04-12-2004, 18:03
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 :stordita:

KornShell
04-12-2004, 18:39
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.

virusbye
04-12-2004, 20:16
l'ho fatto in java...

:)

funziona quasi perfettamente...



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

class ParserEmail {
// Classe parserEmail OPEN

public static void main(String[] args) throws 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 != -1 && fine != -1){
emailStr = nextStr.substring(inizio+1,fine);
} else {
inizio = nextStr.indexOf(" ");
emailStr = nextStr.substring(inizio+1, nextStr.length());
}

for (int i = 0; i < counter; i++){
if (emailArray[i].equalsIgnoreCase(emailStr)){
daAggiungere = 0;
break;
} else{
daAggiungere = 1;
}
}

if (daAggiungere == 1 || 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 = 0; i < counter; i++){
System.out.println(emailArray[i]);
}

filebuf.close(); // chiude il file

} // Metodo main() CLOSE

} // Classe ParserEmail CLOSE

l.golinelli
04-12-2004, 21:48
Basta usare sed... :bhò:

virusbye
04-12-2004, 22:30
Originariamente inviato da l.golinelli
Basta usare sed... :bhò:

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... :)

Sergio Pedone
04-12-2004, 22:34
Originariamente inviato da l.golinelli
Basta usare sed... :bhò:
Confermo. Mi è bastato dare 3 sed, ma forse si può fare di meglio.
:D

Sergio Pedone
05-12-2004, 00:02
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:


$ 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.


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.

:ciauz:

Ikitt
05-12-2004, 00:24
Originariamente inviato da Sergio Pedone


$ 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 :ciauz:


PS: per la serie "pelo nell'uovo": il cat e` inutile :fagiano:

Sergio Pedone
05-12-2004, 11:10
Originariamente inviato da Ikitt
PS: per la serie "pelo nell'uovo": il cat e` inutile :fagiano:

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.


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.
:ciauz:

Loading