Read mail using Pop3


Home Page | Comments | Articles | Faq | Documents | Search | Archive | Tales from the Machine Room | Contribute | Login/Register

La lettura della posta e' una delle operazioni quotidiane che ogni utente di Internet esegue senza nemmeno pensarci. I programmi di accesso ai server di posta elettronica sono distrubuiti e conosciuti da tutti.

Di tanto in tanto pero', si ha la necessita' di svolgere qualche attivita' "strana" o di sviluppare un qualche tools o programmino che consenta l'accesso alla posta elettronica in modo automatico.

Supponiamo di avere una applicazione che deve essere "telecomandata" attraverso la rete senza pero' avere una vera interfaccia tramite network: cosa e' piu' semplice di fare in modo che l'applicazione continui a monitorare una casella di posta elettronica e che interpreti opportuni comandi inviati tramite la stessa casella di posta?

Le caselle di posta elettronica non costano praticamente nulla, e molti server forniscono l'accesso tramite vari protocolli, uno di questi, forse uno dei piu' usati per leggere la posta in arrivo, e' il POP3.

Il POP3 e' definito come protocollo di accesso alla posta con il principio della "casella postale". La posta rimane in "giacenza" all'interno di uno spazio riservato per l'utente finche' l'utente o chi ha i necessari privilegi (amministratore), rimuove le mail giacenti.

Il protocollo e' definito dallo standard RFC 1725, che e' oggi aggiornato con la RFC 1939 (ed altre), i dettagli li potete trovare qui.

POP3 e' un protocollo definito per la LETTURA della posta, non ha comandi particolari che consentono di INVIARE posta. Il Server che fornisce/implementa tale protocollo e' in ascolto sulla porta 110, che e' riservata a questo protocollo.

Quando un client accede alla porta 110, il server invia un "messaggio di benvenuto", solitamente una cosa del tipo:


+OK POP3 server ready  server definition

La parte server definition non e' obbligatoria, ma molti server inviano la propria designazione ed altre informazioni. Per esempio, se il server supporta la criptatura delle password possono essere inviate informazioni relative al tipo di crittografia supportato.

Solo la parte +OK e' significativa comunque, se esiste questa parte il server e' pronto ad ascoltarci. A questo punto siamo nella fase di "riconoscimento" (AUTORIZATION STATE) dell'utente, dobbiamo dire al server chi siamo prima di poter fare qualche cosa di utile.

Per poterci riconoscere dobbiamo inviare al server due comandi:
USER username ci permette di inviare il nome/identificativo dell'utente di cui vogliamo consultare la casella postale.

PASS password ci permette di inviare la password relativa.

Da notare che prima della password dobbiamo inviare il nome utente, inoltre il server deve "rispondere" al nostro invio indicando un altro +OK ad intendere che ha ricevuto il nome utente ed e' pronto a controllare la nostra password.

La password in questo caso e' inviata in chiaro, cosa che non e' molto bella, per inviare la password in modo crittografato occorre utilizzare il comando UIDL, solo che non tutti i server POP supportano la crittografia, quindi al momento non ce ne occuperemo.

Una volta che il server ci ha "riconosciuto", ci inviera' un messaggio del tipo:


+OK mailbox username@server ready

Questo ci indica che il server e' pronto ad accettare i nostri comandi, siamo usciti dalla fase di AUTORIZATION e siamo entrati in quella di TRANSACTION, o fase operativa.

In questa fase possiamo inviare una serie di comandi, ad ogni comando correttamente ricevuto ed eseguito il server rispondera' con un messaggio di tipo +OK, in caso di problemi il server inviera' un messaggio -ERR specificando il tipo di errore, sara' nostra cura controllare la "risposta" del server e gestirla di conseguenza:

Ogni comando deve essere inviato su una linea separata, quindi terminato da un bel ritorno a capo (cr o cr+lf).

POP3 e' un protocollo relativamente semplice, possiamo fare un test del protocollo usando il semplice TELNET: proviamo ad aprire una sessione di TELNET inviando il nostro server di posta POP e specificando la porta 110 come accesso.

Il server rispondera' con +OK, a questo punto inviamo USER nomeutente, sostituendo a nomeutente il nostro identificativo di utente ovviamente, il server rispondera' con +OK password required for user nomeutente, a questo punto inviamo la nostra password con PASS password, il server rispondera' +OK mailbox user@server ready. A questo punto inviamo STAT, il server rispondera' con +OK 0 0 ad indicare che non ci sono mail disponibili nella nostra casella postale, se ci fossero mail la risposta sarebbe +OK n m octets ad indicare che ci sono 'n' mail che occupano complessivamente 'm' bytes. Qui' viene usato il termine octets ad intendere sequenze di 8 bit (bytes).

Per concludere la sessione inviamo QUIT.

Per utilizzare un server POP ci basta un semplice client di posta che svolga le operazioni su indicate, e magari recuperi anche i vari messaggi che sono presenti sul server.

Il programmino seguente esegue tutte le operazioni necessarie a leggere le mail presenti su un server pop ed a scaricarle e salvarle in 'n' files di testo (ASCII).

Per comodita', i singoli file sono denominati nomeutente1, nomeutente2 etc. etc.

Questo 'client' e' ben lungi dall'essere pronto per la vendita come "ammazza-outlook", in particolare non supporta il salvataggio degli allegati. Consideratelo quindi un esercizio di comprensione per il funzionamento del protocollo.

Il codice completo del programma.

Il programma e' stato provato sia con Visual C++ sia con Borland C++, si compila con alcuni Warning, soprattutto relativi al fatto che io verifico il codice di ritorno di alcune funzioni che in Windows sono Unsigned con un valore signed.

Il programma e' relativamente semplice, dopo aver aperto il Socket e connesso la porta 110 (il numero della porta e' definito all'inizio del codice, il programma tenta la connect con il server, se riceve un errore il tutto si ferma. In caso di successo, viene letto il messaggio di benvenuto e questo messaggio viene controllato mediante la funzione checkreply. Solo la parte +OK viene controllata, niente altro.

A questo punto il programma utilizza sendmessage per inviare in sequenza USER e PASS e farsi riconoscere, dopo ogni comandi il risultato viene verificato all'interno della stessa sendmessage, quando abbiamo superato con successo l'autenticazione, viene inviata una STAT, quindi viene recuperato il numero di mail presenti nella casella. Se questo e' maggiore di zero, il ciclo for...next provvede a richiamare la RETR per ogni messaggio ed a salvare lo stesso messaggio in un file creato per l'occasione.

Al termine dello scaricamento, viene inviato un comando DELE che marca il record per la cancellazione.

Dopo che sono stati scaricati tutti i record, la connessione viene chiusa inviando un QUIT, questo ha l'effetto di cancellare fisicamente i messaggi dalla mailbox.

La compilazione del programma non e' un grosso problema, se state lavorando sotto Windows tuttavia, dovrete definire la variabile _WIN_, in modo che le parti relative a Windows vengano compilate e le #include inserite correttamente.

Sotto Borland C++ utilizzate -D_WIN_, sotto Visual C++ usate le proprieta' di compilazione nel menu' Progetto.

Sotto Linux/Unix il programma si compila senza problemi usando gcc o cc.

Una volta compilato potete provare il tutto semplicemente richiando


pop hostname user password
Dove hostname e' il vostro server di posta POP, user e' il vostro nome utente e password la vostra password. L'Hostname puo' essere indicato sia come indirizzo IP che come host.domain.

Se tutto e' OK vi troverete una serie di file nella directory contenenti le vostre mail.


Comments are added when and more important if I have the time to review them and after removing Spam, Crap, Phishing and the like. So don't hold your breath. And if your comment doesn't appear, is probably becuase it wasn't worth it.

3 messages post new
David PaleinoDavid Paleino By David Paleino - posted 18/08/2008 08:55 - reply
Ciao Davide,

gli #include non si vedono perché considerati tag HTML. Dovresti codificare '<' e '>' come < e >.


Ciao,

David


non solo quello non si vedeva... corretto


GiupOGiupO By GiupO - posted 06/12/2008 08:56 - reply

Non funziona piu' il link al codice. Non potresti implementare un qualcosa per la segnalazione degli errori, come hai fatto per i commenti ? E' scomodo il mailto sad


Il file e' MIA dall'esplosione del server di maggio. Ho girato il link verso il file dell'archivio (zip)


AndreaGrazie! By Andrea - posted 31/03/2010 14:31 - reply

Chiapperi questa mi serviva proprio!

--
Andrea


Previous Next

Davide Bianchi, works as Unix/Linux administrator for a "network security" company of Haarlem. Contacts: mail: davide AT onlyforfun.net , Jabber: davideyeahsure AT gmail.com,

Do you want to contribute? read how.  
 


This site is made by me with blood, sweat and gunpowder, if you want to republish or redistribute any part of it, please drop me (or the author of the article if is not me) a mail.


This site was composed with VIM, now is composed with VIM and the (in)famous CMS FdT.

This site isn't optimized for vision with any specific browser, nor it requires special fonts or resolution.
You're free to see it as you wish.

Web Interoperability Pleadge Support This Project
Powered By Gort