{"id":180,"date":"2011-07-14T17:08:45","date_gmt":"2011-07-14T15:08:45","guid":{"rendered":"http:\/\/localhost\/blog\/?p=180"},"modified":"2013-03-07T11:57:56","modified_gmt":"2013-03-07T10:57:56","slug":"implementiamo-un-server-pop3","status":"publish","type":"post","link":"https:\/\/www.ilbytecidio.it\/?p=180","title":{"rendered":"Implementiamo un server POP3!"},"content":{"rendered":"<p>Vi siete mai chiesti come funziona esattamente il vostro programma di posta elettronica quando scaricate la posta?<br \/>\nEbbene, oggi la vostra curiosit\u00e0 potr\u00e0 essere soddisfatta.<br \/>\nNon 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.<br \/>\n<!--more--><br \/>\nNon mi dilungo sulla teoria, visto che non \u00e8 la sezione adatta, ma ai meno esperti basti sapere che l&#8217;e-mail nel complesso funziona grazie a due protocolli: POP (il 3 \u00e8 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\u00f9 server e POP consente all&#8217;utente di consultare la propria casella di posta. Per maggiori informazioni, ci son tanti siti che spiegano il meccanismo. In realt\u00e0 POP \u00e8 reso un po&#8217; superato da IMAP che offre pi\u00f9 funzionalit\u00e0, ma \u00e8 ancora utilizzato da moltissimi utenti, forse ancora dalla maggior parte.<\/p>\n<p>Il programma che vi propongo ovviamente non \u00e8 un server completo, anzi, si pu\u00f2 dire che sia un giocattolo, ma implementa tutte le funzioni richieste a un server POP3 ed \u00e8 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\u00e9 server pi\u00f9 grossi abbiano ovviamente pi\u00f9 codice per aumentarne la sicurezza (e per gestire una vera mailbox) in sostanza non sono tanto diversi! Come potete vedere lo standard POP3 \u00e8 molto semplice. Quando il client vuole impartire comandi al server invia delle brevi stringhe di testo aggiungendo eventualmente dei parametri e il server risponde &#8220;+OK&#8221; o &#8220;-ERR&#8221;, aggiungendo altri dati, a seconda dei casi. Non mi dilungo oltre. Vi rimando alle specifiche: <a href=\"http:\/\/tools.ietf.org\/html\/rfc1939\">RFC1939<\/a>, <a href=\"http:\/\/www.rfc.altervista.org\/rfctradotte\/rfc1939_tradotta.txt\">tradotta in italiano<\/a><br \/>\nIl programma lavora con dati puramente fittizi, non ha dietro una vera casella di posta. Non c&#8217;\u00e8 nessuna contromisura per i casi in cui qualcosa vada storto e gestisce solo una comunicazione per volta, dopo la quale termina. L&#8217;ho lasciato proprio base anche per renderlo comprensibile a tutti, dato che \u00e8 solo una cosetta didattica\/sperimentale.<\/p>\n<p>Per scaricarlo cliccate su:<a title=\"http:\/\/crash.altervista.org\/altri_file\/pop3.c\" href=\"http:\/\/crash.altervista.org\/altri_file\/pop3.c\"> http:\/\/www.ilbytecidio.it\/altri_file\/pop3.c<\/a><\/p>\n<p>Per chi vuole divertirsi, offro qualche spunto: si pu\u00f2 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\u00f2 essere un esercizio per chi \u00e8 interessato a questi protocolli oppure pu\u00f2 interessare a chi vuole costruire un sistema fai-da-te per le comunicazioni con amici o colleghi o ancora, pu\u00f2 diventare una buona tesina di reti per studenti!<\/p>\n<p><strong>Come provarlo:<\/strong><br \/>\nPer prima cosa incollate il codice su un file C e compilatelo. Non servono opzioni aggiuntive. Io l&#8217;ho scritto e testato su Linux, ma dovrebbe andar bene qualsiasi sistema UNIX. Su Windows probabilmente occorrer\u00e0 fare qualche modifica per adattarlo alle sue chiamate (Dai uno sguardo <a href=\"http:\/\/www.beej.us\/guide\/bgnet\/\">qui<\/a>). Dopo averlo avviato, aprite un qualsiasi client di posta elettronica e configuratelo con i seguenti dati:<br \/>\nIndirizzo del server: 127.0.0.1<br \/>\nPorta: 2590 (o eventualmente quella che avete impostato nel sorgente. Meglio non utilizzare la porta standard per ragioni di sicurezza)<br \/>\nNome utente: user<br \/>\nPassword: pass<br \/>\n<strong>Vi do le istruzioni per Thunderbird. Io l&#8217;ho provato con quello:<\/strong><br \/>\nAndare su Modifica-&gt;impostazioni account<br \/>\nFare click su Azioni Account-&gt;Aggiungi account di posta<br \/>\nA questo punto thunderbird cercher\u00e0 di fare una configurazione automatica, ma ovviamente dovremo fare a mano.<br \/>\nScrivete un indirizzo e-mail a caso, come username mettete <strong>user <\/strong>e come password <strong>pass<\/strong><br \/>\nAppariranno i dati per la configurazione. A noi interessa la prima riga, perch\u00e9 \u00e8 quella per la posta in entrata.<br \/>\nCome nome utente mettiamo user, selezioniamo POP nel primo men\u00f9 a tendina, poi come server in entrata mettiamo 127.0.0.1 e come porta 2590. Sul secondo men\u00f9 a tendina scegliamo &#8220;Nessuna&#8221;. Facciamo click poi su Impostazione manuale.<br \/>\nOra, nella lista a sinistra, cerchiamo l&#8217;indirizzo e-mail che abbiamo messo a caso prima e in sua corrispondenza clicchiamo su Impostazioni server. A destra togliamo la spunta a &#8220;Lascia messaggi sul server&#8221;<br \/>\nA questo punto il gioco \u00e8 fatto. Clicchiamo su Scarica Posta e dovremmo ricevere il messaggio con oggetto Hello World!<br \/>\nSe darete uno sguardo al terminale del server, vedrete che vi stampa tutti i comandi contrassegnando con &#8220;C:&#8221; quelli che riceve dal client e con &#8220;S:&#8221; quelli che invia lui. Noterete che Thunderbird prova altri meccanismi di autenticazione prima di USER e PASS.<\/p>\n<p><strong>Un&#8217;alternativa \u00e8 provarlo con telnet.<\/strong> Digitiamo:<\/p>\n<blockquote><p>telnet 127.0.0.1 2590<\/p><\/blockquote>\n<p>e impartiamo i seguenti comandi:<\/p>\n<blockquote><p>USER user<br \/>\nPASS pass<br \/>\nSTAT<br \/>\nLIST<br \/>\nRETR 1<br \/>\nDELE 1<br \/>\nQUIT<\/p><\/blockquote>\n<p>Che sono gli stessi comandi utilizzati dal client (il sistema \u00e8 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 &#8220;grezze&#8221; inviate direttamente dal server, come suggeriscono le specifiche del protocollo.<\/p>\n<p>Per ora concludo cos\u00ec 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 <a href=\"http:\/\/www.feelinglinux.com\/articles\/usosocket.jsp\">questa pagina<\/a> per imparare a usare le API.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vi siete mai chiesti come funziona esattamente il vostro programma di posta elettronica quando scaricate la posta? Ebbene, oggi la vostra curiosit\u00e0 potr\u00e0 essere soddisfatta. Non saprei dire come mi sia venuto in mente di scrivere questo programmino. Volevo approfondire &hellip; <a href=\"https:\/\/www.ilbytecidio.it\/?p=180\">Continua a leggere<span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-180","post","type-post","status-publish","format-standard","hentry","category-programmazione-c"],"views":143,"_links":{"self":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/180","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=180"}],"version-history":[{"count":3,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/180\/revisions"}],"predecessor-version":[{"id":460,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/180\/revisions\/460"}],"wp:attachment":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=180"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=180"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}