Implementiamo un server POP3!

Vi siete mai chiesti come funziona esattamente il vostro programma di posta elettronica quando scaricate la posta?
Ebbene, oggi la vostra curiosità potrà essere soddisfatta.
Non saprei dire come mi sia venuto in mente di scrivere questo programmino. Volevo approfondire un pochino la mia conoscenza dei protocolli POP3 e SMTP, allora ho deciso di simulare il primo di questi.

Non mi dilungo sulla teoria, visto che non è la sezione adatta, ma ai meno esperti basti sapere che l’e-mail nel complesso funziona grazie a due protocolli: POP (il 3 è la versione attuale) e SMTP. SMTP serve a trasferire le e-mail dal mittente alla casella del ricevente, compresi i passaggi intermedi fra due o più server e POP consente all’utente di consultare la propria casella di posta. Per maggiori informazioni, ci son tanti siti che spiegano il meccanismo. In realtà POP è reso un po’ superato da IMAP che offre più funzionalità, ma è ancora utilizzato da moltissimi utenti, forse ancora dalla maggior parte.

Il programma che vi propongo ovviamente non è un server completo, anzi, si può dire che sia un giocattolo, ma implementa tutte le funzioni richieste a un server POP3 ed è in grado di accettare la connessione da parte di un client e consentirgli di scaricare un messaggio e-mail fittizio. Sembra qualcosa di stupido a vedersi, ma benché server più grossi abbiano ovviamente più codice per aumentarne la sicurezza (e per gestire una vera mailbox) in sostanza non sono tanto diversi! Come potete vedere lo standard POP3 è molto semplice. Quando il client vuole impartire comandi al server invia delle brevi stringhe di testo aggiungendo eventualmente dei parametri e il server risponde “+OK” o “-ERR”, aggiungendo altri dati, a seconda dei casi. Non mi dilungo oltre. Vi rimando alle specifiche: RFC1939, tradotta in italiano
Il programma lavora con dati puramente fittizi, non ha dietro una vera casella di posta. Non c’è nessuna contromisura per i casi in cui qualcosa vada storto e gestisce solo una comunicazione per volta, dopo la quale termina. L’ho lasciato proprio base anche per renderlo comprensibile a tutti, dato che è solo una cosetta didattica/sperimentale.

Per scaricarlo cliccate su: http://www.ilbytecidio.it/altri_file/pop3.c

Per chi vuole divertirsi, offro qualche spunto: si può renderlo multi-processing o multi-thread per accettare tante connessioni, creare una vera casella di posta e abbinarlo a un server SMTP.. ingrandirlo insomma: può essere un esercizio per chi è interessato a questi protocolli oppure può interessare a chi vuole costruire un sistema fai-da-te per le comunicazioni con amici o colleghi o ancora, può diventare una buona tesina di reti per studenti!

Come provarlo:
Per prima cosa incollate il codice su un file C e compilatelo. Non servono opzioni aggiuntive. Io l’ho scritto e testato su Linux, ma dovrebbe andar bene qualsiasi sistema UNIX. Su Windows probabilmente occorrerà fare qualche modifica per adattarlo alle sue chiamate (Dai uno sguardo qui). Dopo averlo avviato, aprite un qualsiasi client di posta elettronica e configuratelo con i seguenti dati:
Indirizzo del server: 127.0.0.1
Porta: 2590 (o eventualmente quella che avete impostato nel sorgente. Meglio non utilizzare la porta standard per ragioni di sicurezza)
Nome utente: user
Password: pass
Vi do le istruzioni per Thunderbird. Io l’ho provato con quello:
Andare su Modifica->impostazioni account
Fare click su Azioni Account->Aggiungi account di posta
A questo punto thunderbird cercherà di fare una configurazione automatica, ma ovviamente dovremo fare a mano.
Scrivete un indirizzo e-mail a caso, come username mettete user e come password pass
Appariranno i dati per la configurazione. A noi interessa la prima riga, perché è quella per la posta in entrata.
Come nome utente mettiamo user, selezioniamo POP nel primo menù a tendina, poi come server in entrata mettiamo 127.0.0.1 e come porta 2590. Sul secondo menù a tendina scegliamo “Nessuna”. Facciamo click poi su Impostazione manuale.
Ora, nella lista a sinistra, cerchiamo l’indirizzo e-mail che abbiamo messo a caso prima e in sua corrispondenza clicchiamo su Impostazioni server. A destra togliamo la spunta a “Lascia messaggi sul server”
A questo punto il gioco è fatto. Clicchiamo su Scarica Posta e dovremmo ricevere il messaggio con oggetto Hello World!
Se darete uno sguardo al terminale del server, vedrete che vi stampa tutti i comandi contrassegnando con “C:” quelli che riceve dal client e con “S:” quelli che invia lui. Noterete che Thunderbird prova altri meccanismi di autenticazione prima di USER e PASS.

Un’alternativa è provarlo con telnet. Digitiamo:

telnet 127.0.0.1 2590

e impartiamo i seguenti comandi:

USER user
PASS pass
STAT
LIST
RETR 1
DELE 1
QUIT

Che sono gli stessi comandi utilizzati dal client (il sistema è buono anche per caselle e-mail vere, ma non tentate prima di aver capito cosa state facendo, leggete le specifiche). Ovviamente le risposte che vedrete comparire saranno quelle “grezze” inviate direttamente dal server, come suggeriscono le specifiche del protocollo.

Per ora concludo così questo piccolo viaggio nel mondo della posta elettronica! Vi auguro buon divertimento o, come si dice in questi casi, Happy Hacking! Per qualsiasi dubbio chiedete pure. Per capire meglio come funziona la trasmissione in rete vedere la teoria dei socket e questa pagina per imparare a usare le API.

Questo articolo è stato pubblicato in C da Alex . Aggiungi il permalink ai segnalibri.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *