Un semplice antispam per la casella e-mail

Sarà capitato a tutti almeno una volta di riceve un messaggio-spazzatura via e-mail. A me capita sin troppo spesso, con una frequenza nell’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à di aprire la casella di posta con la webmail (per esempio dal PC di lavoro) e devono selezionare questi messaggi uno ad uno.

La mia unica fortuna è che le e-mail SPAM che mi arrivano sono in gruppi che hanno parte del campo mittente simile. Da qui l’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.

Il programma
Pubblico qui il risultato del mio lavoro, sia come programma eseguibile che come sorgente, sperando che possa avere una qualche utilità anche per qualcun altro.
Link: altri_file/antispam.zip

Istruzioni per l’uso
Gli eseguibili si trovano nella sottodirectory bin.
Il programma è diviso in due parti, il programma vero e proprio (“antispam”) e un altro programmino che permette di configurare gli account (“antispamcfg”). Di seguito le istruzioni per provarlo su Windows e su Linux.

La prima cosa da fare è copiare i due file antispam e antispamcfg in una cartella facile da raggiungere (dato che è a riga di comando), per esempio C:\antispam su Windows o /home/HOME_UTENTE/antispam su Linux.
Su questa cartella dobbiamo creare uno dei due o entrambi i file address_blacklist.txt e subject_blacklist.txt. Il primo è la lista nera per i mittenti e il secondo la lista nera per i destinatari. Una lista nera è composta da una o più righe, ciascuna che indica una stringa da cercare rispettivamente nell’indirizzo dei mittente e nell’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.
ATTENZIONE a come impostate le blacklist: i messaggi vengono cancellati senza alcuna pietà, quindi assicuratevi di non inserire parti di indirizzi o di oggetti di e-mail che vi serviranno!
Poi su Windows apriamo il prompt dei comandi. Basta dare il comando cmd da “Esegui” o dal campo di ricerca su Start. Su Linux invece apriamo un terminale.
Diamo i comandi

c:
cd \antispam
antispamcfg

per Windows e

cd /home/HOME_UTENTE/antispam
./antispamcfg

per Linux
Ci vengono illustrati i comandi supportati. Quello che interessa a noi per il momento è
Codice: Seleziona tutto
antispamcfg add SERVER PORT USERNAME PASSWORD [LIMIT]
I parametri in maiuscolo corrispondono a quelli di configurazione del nostro account di posta, ad eccezione di LIMIT che è opzionale e serve a limitare il numero di messaggi da controllare.
Una volta configurati gli account desiderati possiamo lanciare

antispam

per Windows e

./antispam

per Linux
A 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

Uno sguardo da vicino
Il programma è 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é adatterà il Makefile al vostro sistema. Comunque se siete capaci, potete arrangiarvi anche diversamente. Purtroppo, anche usando l’IDE che vi consiglio, probabilmente dovrete aggiustare a mano i path delle dipendenze (sulle opzioni del progetto). Non ho ancora capito se c’è modo di impostare percorsi relativi.
I file principali sono i seguenti:

1)antispam.c: il programma principale
2)antispam_thread.c: parte del programma principale che fa il lavoro vero e proprio
3)antispam_thread.h: header per il file precedente
4)functions.c: funzioni di lettura e scrittura degli account da e su file
5)email_data.h: header con la struttura che definisce un account e rende visibili le funzioni di functions.c che possono servire all’esterno
6)antispamcfg.c: il programma di configurazione degli account
7)Makefile: il makefile per l’intero software per sistemi Unix
8)Makefile-antispam.win: il makefile per il programma principale per sistemi Windows, creato da WxDev-C++
9)Makefile-antispamcfg.win: il makefile per il programma di configurazione per sistemi Windows, creato da WxDev-C++

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.
Ci sono in più i vari file .dev, .layout, ecc creati da WxDev-C++.
Nella cartella “util stuff” 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 quest’indirizzo trovate l’intera libreria, sia a 32 che a 64 bit (quest’ultimo caso non l’ho provato), se dovesse servire. La versione DLL che vi fornisco è coerente con l’header che è presente nel DevPack.

Diamo un rapido sguardo ai sorgenti. La funzione main del programma è in antispam.c, che legge i dati degli account dal file accounts 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ù 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’ di peso in più 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.
Il codice eseguito dai vari thread è in antispam_thread.c, che invia i vari comandi al server per la connessione, la lettura e l’eventuale cancellazione delle e-mail, dopo il confronto dei campi “From” e “Subject” 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’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ì che si appianano con questi semplici trucchi. Tuttavia essendo così poche viene da chiedersi perché la Microsoft non abbia voluto seguire più fedelmente l’esempio delle librerie già esistenti, sarebbe stato tutto molto più semplice.
Non dovrebbero occorrere molte altre spiegazioni: il programma è per lo più un banale scambio di messaggi con server e gestione di stringhe per la verifica delle risposte. Per provare questo programma mi è stato utile quel piccolo server POP3/giocattolo che ho scritto per un precedente tutorial: non potevo certo inondare di messaggi il mio provider di posta elettronica per le prime prove!

Commenti vari
Questo programma non è il re degli antispam, né vuole esserlo: dovrebbe essere chiaro che al contrario mi serviva qualcosa di molto più semplice rispetto a ciò 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’avvio ogni 30 minuti sul PC dell’ufficio, visto che lo spam arriva con un’alta frequenza e nonvoglio trovarmelo fra i piedi ogni volta che apro la webmail.
Penso che in futuro arriverà qualche miglioramento per renderlo più efficiente ed affidabile. Un’idea sarebbe quella di usare il comando UIDL delle specifiche POP3 e creare un file di messaggi già 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’altro miglioramento sarebbe dividere ulteriormente il lavoro in più thread, utile per grandi numeri di messaggi da controllare: l’intera operazione sulla singola mail è completamente indipendente dalle altre, quindi è un candidato perfetto per l’esecuzione parallela. Farò queste modifiche se ne sentirò il bisogno. Per il momento sulla mia casella è perfetto così!
A seconda della libreria C che userete potrete avere qualche noia con la procedura strcasecmp, che è l’equivalente case-insensitive di strcmp. In tal caso potrete sostituirla con ciò che la vostra libreria offre, per esempio strcmpi o stricmp. Purtroppo non c’è 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.
ATTENZIONE: la sicurezza di questo programma non è 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!
Qualche antivirus lo riconoscerà come malware.
Contattatemi se avete bisogno di una mano!

Changelog
21/08/2012: Alcune migliorie dettate dal queste due settimane di utilizzo intensivo: bugfix, confronto case-insensitive con le blacklist, ma soprattutto un uso più intelligente dell’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ì era molto difficile impostare un limite davvero efficiente, considerato che di solito lo spam è 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à del limite stesso. Se per esempio il limite è 20 e la n.19 è un’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’esecuzione molto più veloce e al contempo continuo ad avere la casella libera.

Lascia un commento

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