{"id":202,"date":"2012-08-07T19:09:10","date_gmt":"2012-08-07T17:09:10","guid":{"rendered":"http:\/\/localhost\/blog\/?p=202"},"modified":"2013-03-07T11:53:53","modified_gmt":"2013-03-07T10:53:53","slug":"202","status":"publish","type":"post","link":"https:\/\/www.ilbytecidio.it\/?p=202","title":{"rendered":"Un semplice antispam per la casella e-mail"},"content":{"rendered":"<p>Sar\u00e0 capitato a tutti almeno una volta di riceve un messaggio-spazzatura via e-mail. A me capita sin troppo spesso, con una frequenza nell&#8217;ordine delle centinaia giornaliere. Programmi come Thunderbird fanno un eccellente lavoro nel riconoscere lo spam e separarlo dalle e-mail utili, ma resta sempre a noi il gravoso compito di controllarle per assicurarci che non sia finita anche della posta utile insieme a esse e di cancellarle. Per giunta, alcuni come me non sempre usano un client ma talvolta hanno necessit\u00e0 di aprire la casella di posta con la webmail (per esempio dal PC di lavoro) e devono selezionare questi messaggi uno ad uno.<\/p>\n<p>La mia unica fortuna \u00e8 che le e-mail SPAM che mi arrivano sono in gruppi che hanno parte del campo mittente simile. Da qui l&#8217;idea di scrivere un programmino che si connettesse alla mia casella di posta elettronica, controllasse i messaggi ed eliminasse quelli riconosciuti come spazzatura in base a una lista nera.<!--more--><\/p>\n<p><strong>Il programma<\/strong><br \/>\nPubblico qui il risultato del mio lavoro, sia come programma eseguibile che come sorgente, sperando che possa avere una qualche utilit\u00e0 anche per qualcun altro.<br \/>\nLink: <a href=\"http:\/\/www.ilbytecidio.it\/altri_file\/antispam.zip\">altri_file\/antispam.zip<\/a><\/p>\n<p><strong>Istruzioni per l&#8217;uso<\/strong><br \/>\nGli eseguibili si trovano nella sottodirectory <em>bin<\/em>.<br \/>\nIl programma \u00e8 diviso in due parti, il programma vero e proprio (&#8220;antispam&#8221;) e un altro programmino che permette di configurare gli account (&#8220;antispamcfg&#8221;). Di seguito le istruzioni per provarlo su Windows e su Linux.<\/p>\n<p>La prima cosa da fare \u00e8 copiare i due file antispam e antispamcfg in una cartella facile da raggiungere (dato che \u00e8 a riga di comando), per esempio C:\\antispam su Windows o \/home\/HOME_UTENTE\/antispam su Linux.<br \/>\nSu questa cartella dobbiamo creare uno dei due o entrambi i file address_blacklist.txt e subject_blacklist.txt. Il primo \u00e8 la lista nera per i mittenti e il secondo la lista nera per i destinatari. Una lista nera \u00e8 composta da una o pi\u00f9 righe, ciascuna che indica una stringa da cercare rispettivamente nell&#8217;indirizzo dei mittente e nell&#8217;oggetto dei messaggi. Se il campo o parte di esso corrisponde a un elemento della lista nera il messaggio viene cancellato dal server. Il confronto non fa differenza fra maiuscole e minuscole.<br \/>\n<strong>ATTENZIONE<\/strong> a come impostate le blacklist: i messaggi vengono cancellati senza alcuna piet\u00e0, quindi assicuratevi di non inserire parti di indirizzi o di oggetti di e-mail che vi serviranno!<br \/>\nPoi su Windows apriamo il prompt dei comandi. Basta dare il comando cmd da &#8220;Esegui&#8221; o dal campo di ricerca su Start. Su Linux invece apriamo un terminale.<br \/>\nDiamo i comandi<\/p>\n<blockquote><p>c:<br \/>\ncd \\antispam<br \/>\nantispamcfg<\/p><\/blockquote>\n<p>per Windows e<\/p>\n<blockquote><p>cd \/home\/HOME_UTENTE\/antispam<br \/>\n.\/antispamcfg<\/p><\/blockquote>\n<p>per Linux<br \/>\nCi vengono illustrati i comandi supportati. Quello che interessa a noi per il momento \u00e8<br \/>\nCodice: Seleziona tutto<br \/>\nantispamcfg add SERVER PORT USERNAME PASSWORD [LIMIT]<br \/>\nI parametri in maiuscolo corrispondono a quelli di configurazione del nostro account di posta, ad eccezione di LIMIT che \u00e8 opzionale e serve a limitare il numero di messaggi da controllare.<br \/>\nUna volta configurati gli account desiderati possiamo lanciare<\/p>\n<blockquote><p>antispam<\/p><\/blockquote>\n<p>per Windows e<\/p>\n<blockquote><p>.\/antispam<\/p><\/blockquote>\n<p>per Linux<br \/>\nA questo punto dovreste vedere i messaggi del programma e avete configurato gli account correttamente vi informeranno del lavoro svolto sulla casella. Se su Windows un messaggio vi avvisa che manca il file pthreadGC2.dll, potete prelevarlo dalla cartella util stuff e copiarla in C:\\Windows\\System32<\/p>\n<p><strong>Uno sguardo da vicino<\/strong><br \/>\nIl programma \u00e8 reso compatibile con qualche trucco con Windows e sistemi Unix (Linux in particolare) a livello di sorgente. Su Windows ho usato come sempre WxDev-C++ come ambiente. Ve lo consiglio se volete compilare il programma perch\u00e9 adatter\u00e0 il Makefile al vostro sistema. Comunque se siete capaci, potete arrangiarvi anche diversamente. Purtroppo, anche usando l&#8217;IDE che vi consiglio, probabilmente dovrete aggiustare a mano i path delle dipendenze (sulle opzioni del progetto). Non ho ancora capito se c&#8217;\u00e8 modo di impostare percorsi relativi.<br \/>\nI file principali sono i seguenti:<\/p>\n<p>1)antispam.c: il programma principale<br \/>\n2)antispam_thread.c: parte del programma principale che fa il lavoro vero e proprio<br \/>\n3)antispam_thread.h: header per il file precedente<br \/>\n4)functions.c: funzioni di lettura e scrittura degli account da e su file<br \/>\n5)email_data.h: header con la struttura che definisce un account e rende visibili le funzioni di functions.c che possono servire all&#8217;esterno<br \/>\n6)antispamcfg.c: il programma di configurazione degli account<br \/>\n7)Makefile: il makefile per l&#8217;intero software per sistemi Unix<br \/>\n8)Makefile-antispam.win: il makefile per il programma principale per sistemi Windows, creato da WxDev-C++<br \/>\n9)Makefile-antispamcfg.win: il makefile per il programma di configurazione per sistemi Windows, creato da WxDev-C++<\/p>\n<p>Ho incluso gli ultimi due file per chi volesse compilare a mano (o con un altro ambiente) il programma. WxDev-C++ infatti crea automaticamente un file Makefile.win che viene sovrascritto a ogni compilazione.<br \/>\nCi sono in pi\u00f9 i vari file .dev, .layout, ecc creati da WxDev-C++.<br \/>\nNella cartella &#8220;util stuff&#8221; trovate il DevPack per aggiungere a WxDev-C++ il supporto per la libreria POSIX Thread (pthread) e la libreria DLL vera e propria, da copiare in WINDOWS\\System32 se il programma lo richiede. A <a href=\"http:\/\/sources.redhat.com\/pthreads-win32\">quest&#8217;indirizzo<\/a> trovate l&#8217;intera libreria, sia a 32 che a 64 bit (quest&#8217;ultimo caso non l&#8217;ho provato), se dovesse servire. La versione DLL che vi fornisco \u00e8 coerente con l&#8217;header che \u00e8 presente nel DevPack.<\/p>\n<p>Diamo un rapido sguardo ai sorgenti. La funzione main del programma \u00e8 in antispam.c, che legge i dati degli account dal file <em>accounts<\/em> creato da antispamcfg e crea un thread separato per ogni account, in modo che il lavoro su ciascuno venga fatto parallelamente. In caso contrario, con pi\u00f9 di un account il lavoro rischierebbe di essere lungo. Se questi thread vengano creati a livello kernel o utente dipende dalla specifica implementazione della libreria. Per quanto riguarda pthread-win32 a occhio e croce si direbbe che faccia uso dei thread a livello kernel di Windows, quindi si dovrebbe trarre vantaggio da una CPU multicore a fronte di un po&#8217; di peso in pi\u00f9 per la creazione. Lo stesso dovrebbe valere per Linux, a meno che non utilizziate una libreria che implementa i pthread in user-mode come GNU Portable Thread. La GNU C Library comunque dovrebbe usare NPTL su Linux. A ogni thread viene passata la struttura con i dati dello specifico account e un puntatore a ciascuna delle due liste nere, una per il campo Oggetto e una per il mittente dei messaggi.<br \/>\nIl codice eseguito dai vari thread \u00e8 in antispam_thread.c, che invia i vari comandi al server per la connessione, la lettura e l&#8217;eventuale cancellazione delle e-mail, dopo il confronto dei campi &#8220;From&#8221; e &#8220;Subject&#8221; e le liste nere. In entrambi i file ci sono parti che vengono compilate a seconda che ci si trovi su Windows o no. Questo avviene grazie alla ricerca della macro __WINNT__, presente se ci si trova su Windows NT o successivi (fra cui XP, Vista e 7). In antispam.c viene fatta l&#8217;eventuale inizializzazione della libreria Winsock e in antispam_thread.c vengono definite alcune macro per consentire la compilazione dello stesso sorgente su entrambe le piattaforme. Magari analizzeremo meglio tutto questo in un altro articolo. Fortunatamente, per quelle poche funzioni di rete che servivano per questo programma, le differenze fra la libreria POSIX e quella di Windows le differenze non sono tantissime, cos\u00ec che si appianano con questi semplici trucchi. Tuttavia essendo cos\u00ec poche viene da chiedersi perch\u00e9 la Microsoft non abbia voluto seguire pi\u00f9 fedelmente l&#8217;esempio delle librerie gi\u00e0 esistenti, sarebbe stato tutto molto pi\u00f9 semplice.<br \/>\nNon dovrebbero occorrere molte altre spiegazioni: il programma \u00e8 per lo pi\u00f9 un banale scambio di messaggi con server e gestione di stringhe per la verifica delle risposte. Per provare questo programma mi \u00e8 stato utile quel piccolo server POP3\/giocattolo che ho scritto per <a title=\"Implementiamo un server POP3!\" href=\"http:\/\/www.ilbytecidio.it\/?p=180\">un precedente tutorial<\/a>: non potevo certo inondare di messaggi il mio provider di posta elettronica per le prime prove!<\/p>\n<p><strong>Commenti vari<\/strong><br \/>\nQuesto programma non \u00e8 il re degli antispam, n\u00e9 vuole esserlo: dovrebbe essere chiaro che al contrario mi serviva qualcosa di molto pi\u00f9 semplice rispetto a ci\u00f2 che viene comunemente offerto dai software di produzione. Lo sto usando da qualche giorno sulla mia casella e-mail e ne sono soddisfatto. Ho anche pianificato l&#8217;avvio ogni 30 minuti sul PC dell&#8217;ufficio, visto che lo spam arriva con un&#8217;alta frequenza e nonvoglio trovarmelo fra i piedi ogni volta che apro la webmail.<br \/>\nPenso che in futuro arriver\u00e0 qualche miglioramento per renderlo pi\u00f9 efficiente ed affidabile. Un&#8217;idea sarebbe quella di usare il comando UIDL delle specifiche POP3 e creare un file di messaggi gi\u00e0 controllati, per evitare di ripetere il controllo. Questo sarebbe utile se lo spam si trovasse in ordine sparso su una casella con molte e-mail, problema che per ora non ho. Un&#8217;altro miglioramento sarebbe dividere ulteriormente il lavoro in pi\u00f9 thread, utile per grandi numeri di messaggi da controllare: l&#8217;intera operazione sulla singola mail \u00e8 completamente indipendente dalle altre, quindi \u00e8 un candidato perfetto per l&#8217;esecuzione parallela. Far\u00f2 queste modifiche se ne sentir\u00f2 il bisogno. Per il momento sulla mia casella \u00e8 perfetto cos\u00ec!<br \/>\nA seconda della libreria C che userete potrete avere qualche noia con la procedura strcasecmp, che \u00e8 l&#8217;equivalente case-insensitive di strcmp. In tal caso potrete sostituirla con ci\u00f2 che la vostra libreria offre, per esempio strcmpi o stricmp. Purtroppo non c&#8217;\u00e8 ancora uno standard per questa chiamata, quindi bisogna arrangiarsi! Comunque quella utilizzata dovrebbe andar bene almeno per Linux, Windows con MinGW e la libreria C di BSD.<br \/>\n<strong>ATTENZIONE:<\/strong> la sicurezza di questo programma non \u00e8 alta. I dati degli account sono a malapena offuscati, ma non crittografati con un algoritmo serio, solo per evitare che il file accounts sia letto dal primo sprovveduto che passa ed inoltre non si utilizza alcun protocollo sicuro ed i dati di accesso sono inviati in chiaro attraverso la rete (questo comunque accade molto spesso, anche con lo stesso HTML). Usatelo a vostro rischio!<br \/>\nQualche antivirus lo riconoscer\u00e0 come malware.<br \/>\nContattatemi se avete bisogno di una mano!<\/p>\n<p><strong>Changelog<\/strong><br \/>\n<strong>21\/08\/2012<\/strong>: Alcune migliorie dettate dal queste due settimane di utilizzo intensivo: bugfix, confronto case-insensitive con le blacklist, ma soprattutto un uso pi\u00f9 intelligente dell&#8217;opzione LIMIT per gli account. Prima il limite era secco, dopo quel numero di messaggi controllati, fossero spam o no, il programma si fermava, ma cos\u00ec era molto difficile impostare un limite davvero efficiente, considerato che di solito lo spam \u00e8 in testa alla casella. Ora il programma controlla il numero di messaggi impostato, ma se cancella delle e-mail entro quel limite fa in modo di controllarne almeno un altro numero pari alla met\u00e0 del limite stesso. Se per esempio il limite \u00e8 20 e la n.19 \u00e8 un&#8217;e-mail spam, il limite viene impostato a 29. Nel mio caso con un limite di 10 (su una casella che al momento contiene 40-50 messaggi buoni) ho un&#8217;esecuzione molto pi\u00f9 veloce e al contempo continuo ad avere la casella libera.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sar\u00e0 capitato a tutti almeno una volta di riceve un messaggio-spazzatura via e-mail. A me capita sin troppo spesso, con una frequenza nell&#8217;ordine delle centinaia giornaliere. Programmi come Thunderbird fanno un eccellente lavoro nel riconoscere lo spam e separarlo dalle &hellip; <a href=\"https:\/\/www.ilbytecidio.it\/?p=202\">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,26],"tags":[],"class_list":["post-202","post","type-post","status-publish","format-standard","hentry","category-programmazione-c","category-miei-software"],"views":151,"_links":{"self":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/202","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=202"}],"version-history":[{"count":7,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/202\/revisions"}],"predecessor-version":[{"id":452,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/202\/revisions\/452"}],"wp:attachment":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=202"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=202"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}