Newsgroup: it.comp.os.linux.iniziare
Titolo: estrarre indirizzo da un'email salvata su un file

$ cat test.eml
To: 
i...@mail.it
 
From: 
t...@mail.it
 
Subject: blabla
 
Testo dell'email...
 
 
Vorrei, ad esempio, estrarre l'indirizzo del mittente (From) che 
corrisponde a 
t...@mail.it
 
Come posso fare?
 
Suppongo qualcosa tipo
 
$ cat test.eml | sed ...
 
oppure
 
$ cat test.eml | awk ...
 
Boh, come fare?
 
PS
 
Naturalmente con lo stesso sistema vorrei poi estrarre anche To e Subject.

Il 21/11/18 09:40, alex ha scritto:
 > $ cat test.eml
 > To: 
i...@mail.it
 
 > From: 
t...@mail.it
 
 > Subject: blabla
 >
 > Testo dell'email...
 >
 >
 > Vorrei, ad esempio, estrarre l'indirizzo del mittente (From) che
 > corrisponde a 
t...@mail.it
 
 > Come posso fare?
...
 
Una delle possibilita':
 
FILE="test.eml"
FROM=`grep -m 1 "From:" $FILE | cut -c 6-`
TO=`grep -m 1 "To:" $FILE | cut -c 4-`
SUBJECT=`grep -m 1 "Subject:" $FILE | cut -c 9-`
 
angelo

Il 21/11/18 10:14, angelo ha scritto:

Innanzitutto non vorrei spazi iniziali: ' 
t...@mail.it
'
 
Inoltre preferirei qualcosa di flessibile:
 
grep -m 1 "$HEADER_NAME:" $FILE | cut -c $HEADER_NAME_LEN-
 
La lunghezza come me la calcolo?


HEADER=From:
sed -n "0,/^$HEADER/s/^$HEADER\s//p" test.eml
 
 
In pratica cerca dalla prima riga del file "test.eml" fino alla
prima ricorrenza del pattern indicato nella variabile $HEADER.
Per ogni riga che incontra in questo intervallo sostituisce al-
l'header il suo "seguito".
Nell'esempio all'header "From:" sostituisce l'indirizzo che sta
dopo lo spazio seguente i due punti, in pratica butta via il
pezzo di riga che va dal primo carattere allo spazio seguente i
due punti, cioè butta via l'header "From: " e tiene l'indirizzo.
 
L'opzione "-n" di sed, combinata con il comando "p" (ovvero print,)
vedi in fondo prima delle virgolette...) fa in modo che non stampi
tutte le altre righe che non iniziano per "From:". Cioè prima si
sopprime tutto l'output con -n, ma poi si stampa le righe sulle quali
si è operato. Insomma alla fine salta fuori solo l'indirizzo del
mittente.
 
Ovviamente poi puoi estendere il ragionamento all'header che vuoi,
basta che cambi la variabile HEADER...
 
Es.
script chiamato headers.sh ma ovviamente il nome è a scelta  ;)
------------
#!/bin/bash
 
MSG=$1
 
# Esempio 1
# estraggo e stampo a video gli header che i interessano
 
for HEADER in To: From: Subject:; do
          echo $HEADER $(sed -n "0,/^$HEADER/s/^$HEADER\s//p" $MSG)
done
 
 
 
# Esempio 2
# estraggo un header e lo assegno ad una variabile
 
var_header() {
  VAR=$1
  HEADER=$2
  export "$VAR"=$(sed -n "0,/^$HEADER/s/^$HEADER\s//p" $MSG)
}
 
var_header T To:
var_header F From:
var_header S Subject:
 
# adesso posso riutilizzare le variabili, nell'esempio
# le stampo a video una sotto l'altra
 
echo -e "$T\n$F\n$S"
--------------------
 
Utilizzo:
  ./headers.sh test.eml
 
Ovviamente prima dagli gli attributi di esecuzione
chmod +x headers.sh
 
Ecco cosa ottengo se lo faccio girare:
----
$ ./headers.sh test.eml
To: 
i...@mail.it
 
From: 
t...@mail.it
 
Subject: blabla
i...@mail.it
 
t...@mail.it
 
blabla
 
Nell'esempio 2, praticamente assegno alla variabile "T" il
contenuto dell'header To:, alla variabile F il contenuto del
From:, ecc.
Mi pare tutto auto-esplicativo l'unica cosa un po' particolare
è l'export nella funzione che permette un uso "dinamico" del
nome delle variabili, tanto per capirci:
 
la funzione richiamata con
 
var_header T To:
 
vuole assegnare alla variabile "T" il contenuto dell'header To:
che nell'esempio era "
i...@mail.it
".
Si poteva fare in modo banale:
 
T=$(sed -n "0,/^To:/s/^To:\s//p" $MSG)
 
La funzione però consente un'assegnazione "generica", cioè che
vale anche per altre variabili e altri headers, ecco allora che
si devono usare variabili "locali" interne alla funzione e quindi
generiche che ho chamato VAR e HEADER, con molta fantasia.
Bene, per ottenere l'assegnazione sopraindicata
 
T=$(eccecc To:)
 
devo specificare che
 
VAR è T
HEADER è To:
 
e poi che "al contenuto di VAR", cioè alla variabile T voglio
assegnare il parse dell'header To: nel mesaggio di input.
Uno pensa: semplice...
 
$VAR=$(eccecc $HEADER)
 
Però a bash non piace l'uso di "$VAR =".
E per farlo a quanto pare serve "export".
 
export $VAR=(eccecc $HEADER)
 
Altri esempi se ne potrebbero fare, ma piuttosto meglio che
applichi la cosa allo scopo preciso che ti eri prefisso.

Il 21/11/18 13:53, Joe ha scritto:

Ottime spiegazioni.

Ma l'esportazione è proprio necessaria?
L'esempio 2 non l'ho capito bene.

 sed -n "0,/^$HEADER/s/^$HEADER\s//p" test.eml
 
Purtroppo però l`RFC non viene rispettata completamente
https://tools.ietf.org/html/rfc2616#section-4.2
 


In che senso?
Cioè, per assegnare ad una variabile precisa
l'output dell'estrazione fatta con sed, allora
non è necessario.
In pratica la faccenda dell'export non c'entra
con la tua domanda iniziale, salta fuori nel mio
esempio 2, dal momento che ho buttato lì una
funzione comoda da richiamare quando vuoi estrarre
gli header.
Mi spiego meglio, se io dovessi fare uno script
che estrae diversi headers, può avere un senso
definire una funzione capace di estrarre un header
generico e nel seguito dello script richiamarla
ogni volta che devo estrarre questo o quell'header.
 
Nel mio esempio ho fatto proprio questo:
 
var_header pippo pluto
 
non fa altro che estrarre l'header "pluto" e salvarne
il contenuto nella variabile "pippo".
Alla funzione var_header devono ovviamente essere
passati degli argomenti "precisi", come ad esempio
la variabile "pippo" e l'header "pluto". Ma nella
sua definizione (cioè tra le parentesi graffe { })
devi lavorare con varibili generiche, che poi
quando richiami la funzione assumeranno il "valore"
degli argomenti ok, ma nella definizione devono
restare generiche.
Quindi salta fuori la seguente definizione:
 
var_header() {
  VAR=$1
  HEADER=$2
  $VAR=$(sed -n "0,/^$HEADER/s/^$HEADER\s//p" $MSG)
}
 
Il problema è che scritta così dà errore:
probabilmente in bash non si può assegnare
così facilmente un valore "al contenuto" di
una variabile (prova un po' a togliere
l'export e vedrai che dà errore...).
E noi vogliamo fare proprio questo: vogliamo
assegnare "al contenuto" di "VAR" l'header
estratto.
Il contenuto di VAR in questo caso è "pippo",
cioè la nostra variabile usata nel corpo
principale dello script...
 
Il punto che non capisci forse è qui: non
stiamo assegnado un valore ad una variabile,
stiamo assegnando un "valore" "al contenuto"
di una variabile. 
Quel contenuto (cioè pippo nell'esempio) è a
sua volta una variabile. Alla fine otteniamo
che:
 
pippo = $(sed -n ....)
 
La necessità dell'export nasce unicamente per
questo scopo: assegnare un valore, non ad una
variabile, ma al contenuto di una variabile,
contenuto che a sua volta è una variabile
anch'esso.
Come accennavo, può essere che al posto di export
ci siano anche altri modi per eseguire questa
assegnazione, ma sinceramente non saprei:
ho provato con export e funziona, molto
banalmente.  :D
 
Ad ogni modo qui spiegano modi forse più canonici
del mio export improvvisato:
 
https://stackoverflow.com/questions/9714902/how-to-use-a-variables-value-as-another-variables-name-in-bash
 
https://stackoverflow.com/questions/16553089/dynamic-variable-names-in-bash
 
http://www.tldp.org/LDP/abs/html/ivr.html
 
 
In sintesi troverai esempi di assegnazione
indiretta, o dinamica, con "declare" e con
"eval", che probabilmente sono due strade
migliori per lo scopo...

 ...
 
OK, valuterò i tuoi suggerimenti.
Ad ogni modo hai letto l'altro post sull'RFC?


Qual è il problema?
Spiegati meglio...
E tieni conto che chi ti legge non ha idea di
quello che vuoi fare. Le risposte che ti hai
ricevuto qui sono inerenti l'oggetto del topic
ovvero "estrarre header da mail salvata su file".

 ovvero "estrarre header da mail salvata su file".
 
Appena posso ti spiego meglio, ora non ho tempo, intanto grazie per la 
collaborazione :)

Il 22/11/18 15:12, alex ha scritto:

Mi sembra vada bene questa soluzione
 
echo "$mail" | sed -n -e "s/^X-Safe://pi" | sed "s/^[ \t]*//"
 
Non è case-sensitive e trimma eventuali spazi prima del valore dell'header.
Quindi sembra rispettare l'RFC.
Che ne dite?


echo mail
 
Direi che è errato, forse intendevi: cat mail.
 
 
Per quanto riguarda il case-sensitive, se intendi
che intercetta sia "X-Safe:" che "x-safe:", allora
sbagli, il secondo non viene intercettato, poi
fai la prova per vederlo tu stesso...
Al posto di "i" devi mettere "I":
 
"s/blbalbl//pI"
 
 
Infine mi pare che potevi fare tutto con un sed
senza pipe:
 
sed -n -e "s/^x-safe:[ \t]*//pI"
 
Ma domanda, cosa succede se disgraziatamente
nel resto del messaggioo ci fosse una riga
che non è un header ma inizia per "X-Safe:"?
 
Succede che verrà trattata e estratto il contenuto.
Invece tu vuoi solo l'header che dovrebbe essere
solo la prima riga in cui si trova il pattern.
Ecco perchè avevo proposto la soluzione che intercettava
solo la prima ricorrenza del pattern:
 
prova a scrivere un messaggio ipotetico del tipo
 
------------
From: pippo
X-Safe: paperino
 
blablblabla
blbllblblb
x-safe:pluto
blabla
abcd
.
------------
 
E prova a darlo in pasto al tuo esempio, se vuoi intercettare
l'header X-Safe dovresti ottenere solo "paperino", e invece?
 
Quando ti sei dato una risposta prova:
 
sed -n -e "0,/^x-safe/Is/^x-safe:[ \t]*//pI" "$mail"
 
dovresti ottenere solo "paperino".
Cioè "solo la prima ricorrenza del pattern" che dovrebbe essere
una riga dell'intestazione del mesaggio e non altre righe più
sotto.
Testa anche la tab "\t", non l'ho provata... 

Il 23/11/18 17:27, Joe ha scritto:

Forse hai ragione, lunedi ti faccio sapere

 Forse hai ragione, lunedi ti faccio sapere
 
+ cat test.eml
To:i...@mail.it
 
from2:   
t...@mail.it
 
Subject: blabla
 
from: Testo dell'email...
 
+ sed -n -e '0,/^From:/Is/^From:[ \t]*//pI' test.eml
Testo dell'email...
 
Un po' imbarazzante :D
Il testo dell'email dovrebbe essere escluso, credo.


Ma scusa eh...
Sei sicuro che il formato del file test.eml
sia aderente allo standard di un messaggio
email?
 
Quello strano header "from2:" in reltà non
mi sembra per nulla un header aderente allo
standard...
 
In soldoni se vuoi estrarre un header da un
messaggio email "vero", la stringa di sed
dovrebbe funzionare. Il file di esempio
invece non mi sembra rappresentativo del
messaggio email standard che segue le RFC.
Ti dico la verità: non ne sono sicurissi-
missimo, ma ti consiglio di verificare la
RFC e vedere se si può verificare un caso
come quello nell'esempio.
Se l'esempio è sbagliato... non è detto che
la regola di estrazione header sia ceffata
anch'essa.

 
 
Come sospettavo, forse non hai afferrato il concetto.
Quello che volevo era estrarre un determinato valore da un header.
Ma se l'email non è conforme deve essere almeno lanciato un errore. Però 
  mai e poi mai fornire dati fasulli.
Se non si adotta un approccio di tipo safety, inevitabilmente poi si 
innescherà anche una bella catena di problemi.

 catena di problemi.
 
Ovvio che non ho afferrato il concetto...
Il concetto lo devi spiegare tu: se non spieghi
qual è lo scopo e lo spieghi in modo chiaro ed
esauriente, non ti possono che arrivare risposte
incomplete o non aderenti al tuo intento.
 
Ricordo anni fà una introduzione sintetica alla
collaborazione tra l'informatico e il tecnico
che gli commissiona "qualcosa", la prima cosa
che deve fare l'informatico è informarsi sulle
esigenze del tecnico e confrontarsi con lui sui
particolari aspetti tecnici.
 
Ora tu dici di voler estrarre un header da un
messaggio email.
Il messaggio email per arrivare al destinatario
che puoi essere tu, o un tuo eventuale server su
cui vuoi implementare ad esempio un filtro, deve
essere aderente alle regole previste dai vari
protocolli, quindi serve un set di headers obbli-
gatori che sono fatti come si deve.
Se il messaggio nel set di headers contiene un
"from2:", semplicemnte non parte... e non arriva
neanche al tuo filtro.
Sto andando per ipotesi perchè, ripeto, solo tu
sai cosa devi fare di preciso e per il momento
non l'hai esplicitato in modo completo.

 incomplete o non aderenti al tuo intento.
 
Voglio verificare che un'email (ricevuta dal mio demone salvata su file 
apposito), abbia l'header X-Save-As.
Se c'è l'ha deve essere duplicata in un altro file (ma qui me la vedo 
io). In caso contrario deve essere generato un apposito errore.
Naturalmente X-Save-As deve essere una vera header: se dovesse per 
qualche motivo far parte del body non deve essere considerata un'header.
 
Ora non dirmi che senza l'header X-Save-As l'email non può essere inviata :D


Te la faccio ancora più semplice.
Voglio solo e soltanto verificare che l'email contenuta nel file
/tmp/abc.eml abbia (*REALMENTE*) l'header X-Save-As.
Naturalmente l'header può anche aver questo formato
 
x-save-as:/tmp/xyz.eml
 
oppure
 
X-SAVe-aA:     /tmp/xyz.eml
 
eccetera.
 
Sono formati ugualmente accettati (almeno secondo l'RFC).

 Sono formati ugualmente accettati (almeno secondo l'RFC).
 
Non so come sia successo ma (per fare un test) ho impostato il nick di 
Flavix.
Scusa Flavix.

 Scusa Flavix.
 
Ma che test fai????? :D


Lasciamo stare :D


Il problema mi pare banale, e non ti serve neanche sed,
perchè a te interessa SE l'header in questione è presente
e non ti serve estrarlo come invece chiedevi nel tuo post
precedente.
 
Visto che sai l'header preciso che ti interessa:
 
X-Save-As:
 
E visto che gli headers in un messaggio vengono prima
del body, ovvero le intesatazioni, guarda caso, stanno
"in testa" al messaggio, mentre il corpo del testo viene
in seguito, ti conviene osservare come è fatto un messaggio
email.
 
La RFC dice:
A message consists of header fields (collectively called "the header
section of the message") followed, optionally, by a body.  The header
section is a sequence of lines of characters with special syntax as
defined in this specification.  The body is simply a sequence of
characters that follows the header section and is separated from the
header section by an empty line (i.e., a line with nothing preceding
the CRLF).
 
 
Per cui un modo abbastanza sicuro di procedere è:
1- separiamo il corpo del testo dal resto del messaggio
   e teniamoci solo gli headers. Siccome il corpo testo
   viene dopo la prima riga vuota che si trova nel
   messaggio, ecco che possiamo eliminare tutte le
   righe dalla prima riga vuota troavata fino alla
   fine del messaggio:
 
sed '/^$/,$d'
 
E si può fare in modo più efficiente anche così:
 
sed -n '/^$/q;p'
 
in prtica chiude sed appena trova la prima linea
vuota e stampa le linee fin li analizzate.
 
Ora che hai solo gli headers del messaggio, basta
che analizzi quelli: è presente l'header X-Save-As???
 
In questo caso basta il grep in pipe al precendente
comando:
 
sed -n '/^$/q;p' | grep -q 'X-Save-As:'
 
E valuti l'errore ad esempio con "$?": grep dà
zero se trova l'header, mentre dà diverso da zero
in caso contrario.
 
Mettendo tutto insieme e testando un attimo
velocemente:
 
 
$ cat test2.eml
From: pippo
To: pluto
Date: 12:00 Tue 27 Nov 2018
X-Save-As: headerichiesto!!!
 
Qua inizia il corpo del messaggio
blablblabla
blbllblblb
x-safe:pluto
blabla
abcd
.
 
 
 
cat test3.eml 
From: pippo
To: pluto
Date: 12:00 Tue 27 Nov 2018
 
Qua inizia il corpo del messaggio
blablblabla
blbllblblb
x-safe:pluto
blabla
abcd
.
 
 
 
$ cat headers2.sh 
#!/bin/bash
 
HDR=X-Save-As
MSG=$1
 
if sed -n '/^$/q;p' $MSG | grep -q "^$HDR:\s.*$" ; then
       echo "Header richiesto $HDR             TROVATO"
else
       echo "Header richiesto $HDR             ASSENTE"
fi
 
 
 
$ ./headers2.sh test2.eml
Header richiesto X-Save-As             TROVATO
 
 
 
$ ./headers2.sh test3.eml
Header richiesto X-Save-As             ASSENTE
 
-------
 
Ok, al posto di farti stampare se ha trovato o no
l'header, potrai eseguire le operazioni che sai tu
quando l'header viene copiato e quando no.


La quesione case insensitive la introduci aggiungendo
l'opzione -i a grep:
 
$ ./headers2.sh test2.eml
Header richiesto X-Save-As             TROVATO
 
 
$ cat test2.eml
From: pippo
To: pluto
Date: 12:00 Tue 27 Nov 2018
x-sAvE-aS: headerichiesto!!!
 
Qua inizia il corpo del messaggio
blablblabla
blbllblblb
x-safe:pluto
blabla
abcd
.
 
 
 
$ cat headers2.sh
#!/bin/bash
 
HDR=X-Save-As
MSG=$1
 
if sed -n '/^$/q;p' $MSG | grep -iq "^$HDR:\s.*$" ; then


 sotto.
 
Ma in caso di headers omonime, deve essere considerata solo la prima 
(sei sicuro?) o l'ultima?
Nelle RFC non sono riuscito a trovare questi dettagli.

 Non mi sembra.
 
Adesso funziona, chiedo scusa, ho dimenticato i ':'


 sed -n '/^$/q;p'
 
Differenza?

 neanche al tuo filtro.
 
  Si, parte.  Probabilmente.
  Se le intestazioni obbligatorie ci sono tutte e sono formattate
correttamente, quelle non previste o sconosciute sono ignorate.  E il
messaggio parte.
  Lo stesso non si dovrebbe fare una cosa simile, per le estensioni
locali si dovrebbe usare il prefisso X-, altrimenti si corre il rischio
che le proprie personalizzazioni ed estensioni non standard entrino in
collisioni con estensioni future del protocollo o altre
personalizzazioni effettuate in altri server/filtri di posta elettronica
fuori del proprio controllo.
 
 
Alessandro
 
 

Il 28/11/18 13:49, Alessandro Selli ha scritto:

Esatto.

 Nelle RFC non sono riuscito a trovare questi dettagli.
 
Ma vedi, il punto è proprio questo.
Detto brutalmente: sai quello che vuoi fare oppure
no?
Mi chiedo perchè mai dovrebbero esserci due headers
identici, che senso ha?
Da dove ti arrivano quei messaggi, cosa è che li
genera... ecco forse dovresti porti queste domande.
 
Invece di chiedere come "estrarre indirizzo da una mail"
dovevi spiegare  cosa hai in mente di fare e quali dubbi
hai in merito. Il "come farlo" sarà nella risposta, quella
che ti daranno gli altri.
 
Da come hai scritto ieri, se non hai cambiato idea,
vuoi creare uno script che ti dica se un certo header
è presente. Ieri pareva bastarti questo. Dico bene?
Se è presente l'header "X-Save-As" in particolare.
 
Ora, se tra le intestazioni ci fosse anche X-Save-As
almeno una volta, in quel caso l'esempio che ti ho
mostrato ieri fa il suo compito.
Se invece il problema che avevi in mente era diverso
allora conviene che ci rifletti meglio prima di
chiedere, e descriverlo chiaramente, ti pare?


Il primo analizza tutte le righe cancellando
quelle dalla prima riga vuota fino all'ultima riga
del file.
 
Il secondo analizza, stampandole, le righe dalla
prima fino a che non trova una riga vuota, quando
la trova esce.
 
Il risultato è identico: in entrambi i casi
viene stampata solo l'intestazione del messaggio
ovvero gli headers.
Però se avessi un messaggio molto lungo la
seconda versione è migliore... coi pc moderni
non dovresti vedere differenza su normali messaggi
di posta.

> Adesso funziona, chiedo scusa, ho dimenticato i ':'
 
Opsss ho fatto casino con la quotatura... capito.

Il 28/11/18 17:47, Joe ha scritto:

GRAZIE!!!

 chiedere, e descriverlo chiaramente, ti pare?
 
Una volta accertata l'esistenza di quell'header, voglio estrarre il 
valore, e fare alcune cose.
Ho già messo in pratica il tutto e sembra funzionare.
Grazie ancora per la collaborazione.


Ok, bene! :)

 Nelle RFC non sono riuscito a trovare questi dettagli.
 
Vedi RFC 5322, par. 3.6, "The following table indicates limits on
the number of times each field may occur in the header section of a
message ...".
 
Sempre l'RFC 5322 dà l'esatta sintassi per i messaggi con headers in
puro ASCII.  Per la sintassi in formato EBNF, forse più leggibile,
vedi mia pagina 
http://www.icosaedro.it/bnf_chk/index.html
 --> on-line
tests --> Code samples --> E-mail.
 
Per i messaggi con header in formato MIME, vedi RFC 2047.
 
Per i messaggi con header UTF-8, vedi RFC 6532.
 
Gli RFC e il loro stato: 
http://www.rfc-editor.org/info/rfcNNNN
 
 
Per un tool che estrae e decodifica gli header (e anche i body) delle
singole email nonché mailbox (vari formati) vedi la mia libreria PHP
disponibile in 
http://www.icosaedro.it/phplint/
 --> Composing, sending
and parsing e-mails. Esempio di codice che estrae gli headers da un file
eml usando quella libreria:
 
use it\icosaedro\email\EmlParser;
use it\icosaedro\email\Field;
use it\icosaedro\email\Header;
use it\icosaedro\email\MIMEAbstractPart;
use it\icosaedro\email\MIMEPartMemory;
use it\icosaedro\email\MIMEMultiPart;
 
$email = EmlParser::parseFile("c:\\mail.eml");
echo "Subject: ", $email->header->getSubject(), "\n";
$from = $email->header->getFieldValue("From");
if( $from !== NULL ){
	$addresses = Field::parseAddresses($from);
	foreach($addresses as $a)
		echo "From: address=", $a[0], ", name=", $a[1], "\n";
}
$to = $email->header->getFieldValue("To");
if( $to !== NULL ){
	$addresses = Field::parseAddresses($to);
	foreach($addresses as $a)
		echo "To: address=", $a[0], ", name=", $a[1], "\n";
}
....
 
 
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it
 
 

 identici, che senso ha?
 
Spam.
Frequente che in messaggi di spam ci siano 2 From.
Il primo farlocco, ed il secondo "apparenemente" valido.
Ne ricevo spesso di questo tipo.
Come pure il Received che è spesso ripetuto più volte.
 
Nello script che uso (in python) per svuotare la casella di spam (imap), faccio
il controllo su entrambi i from.
 
-- 
Se alla tavoletta del cesso ci attacchi una mela, mica diventa un MacBook!
Pero' se al MacBook togli la mela, diventa una tavoletta del cesso  :P

 Come pure il Received che è spesso ripetuto più volte.
 
Beh questo è normale.

 eml usando quella libreria:
 
grazie potrebbe essere utile

 Cioè?
 
Tipo   utente@dominio.
L'utente è info, ok, bab, sun.... tante cose simili.
In questo momento non ho mail in spam con doppio from.
Ma ne ho filtrate un decina nell'ultimo mese, solo in un account.
Sono poche, ma danno fastidio lo stesso.
 
Inizialmente non capivo perchè non riuscissi ad eliminarle con lo script
automatico, poi mi sono accorto del doppio from...
 
-- 
The future is wonderful, the future is terrifying.
The future? But will we still be there?