<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.12-alpha" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Imagine all the people...</title>
	<link>http://www.imagine.coianiz.it</link>
	<description>Article 19: everyone has the right to freedom of opinion and expression; this right includes freedom to hold opinions without interference and to seek, receive and impart information and ideas through any media and regardless of frontiers.</description>
	<pubDate>Sat, 17 Dec 2011 15:36:48 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.12-alpha</generator>
	<language>en</language>
			<item>
		<title>Archiviatore di &#8220;e-mail letta&#8221;</title>
		<link>http://www.imagine.coianiz.it/index.php/inutilities/archiviatore-di-mail-letta/</link>
		<comments>http://www.imagine.coianiz.it/index.php/inutilities/archiviatore-di-mail-letta/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 11:25:19 +0000</pubDate>
		<dc:creator>lcoianiz</dc:creator>
		
		<category>none</category>

		<guid isPermaLink="false">http://www.imagine.coianiz.it/index.php/inutilities/archiviatore-di-mail-letta/</guid>
		<description><![CDATA[Premessa
&#160; &#160; A parte lo spam evidente, molto del quale oramai viene filtrato direttamente dai mailserver delle mie caselle &#8220;offshore&#8221;, tendo a tenere i messaggi di posta &#8220;vecchi&#8221; per motivi storici ed affettivi: a volte, girovagando per i folder della posta, leggere un vecchi(ssim)o messaggio in cui &#8220;Tizio ti scriveva di&#8230;&#8221; è bello&#8230; fa pensare [...]]]></description>
			<content:encoded><![CDATA[<h3>Premessa</h3>
<p>&nbsp; &nbsp; A parte lo spam evidente, molto del quale oramai viene filtrato direttamente dai mailserver delle mie caselle &#8220;offshore&#8221;, tendo a tenere i messaggi di posta &#8220;vecchi&#8221; per motivi storici ed affettivi: a volte, girovagando per i folder della posta, leggere un vecchi(ssim)o messaggio in cui &#8220;<em>Tizio ti scriveva di&#8230;</em>&#8221; è bello&#8230; fa pensare al passato con piacere, fa ricordare dei corrispondenti di una volta, un pò come nei tempi andati si tenevano le vecchie lettere.</p>
<p>&nbsp; &nbsp; Ma a parte l&#8217;incipit romantico&#8230; quando la casella di posta &#8220;inbound&#8221; inizia a riempirsi, anche il client di posta inizia a rallentare, aprendola. In parole povere: arrivato a più di 13.000 messaggi decisi di &#8220;trovare un rimedio&#8221; senza però perder nulla. Nella pratica il &#8220;rimedio&#8221; è consistito nello <u>spostare le mail dalla &#8220;inbound&#8221; a folder interni</u>, in modo da alleggerire la casella d&#8217;arrivo lasciandovi dentro unicamente i messaggi <strong>non letti</strong> (e quelli che, per qualche motivo, decido di non filtrare).<br />
&nbsp; &nbsp; Quest&#8217;attività la può fare qualsiasi client di posta, a me però l&#8217;idea non piaceva: architetturalmente considero il client di posta un &#8220;lettore&#8221;, ed un lettore &#8220;legge&#8221; la posta (ok, permette anche di &#8220;rispondere&#8221;) ma <strong>non</strong> la dovrebbe &#8220;gestire&#8221; (o, in altre parole, dovrebbe essere &#8220;trasparente&#8221; rispetto alle e-mail).</p>
<p>&nbsp; &nbsp; Per gestire la posta mi pare più sensato lavorare <strong>server-side</strong>, possibilmente in modo automatico: in questo modo ci si svincola dalle particolarità dei client (in genere ognuno ha il proprio modo di &#8220;trattare la posta&#8221;, le proprie &#8220;regole&#8221;&#8230; guarda caso mai compatibili tra di loro) e, volendo, è possibile passare da un client all&#8217;altro senza pregiudicare il lavoro di archiviazione, un pò come è possibile cambiare browser web senza che i siti debbano essere modificati (almeno in teoria ;-)).</p>
<h3>Panoramica</h3>
<p>&nbsp; &nbsp; Nel mondo &#8220;degli utenti&#8221; in genere la mail viene gestita tutta &#8220;lato utente&#8221; (o client-side): il client (spesso Outlook) si occupa di ricevere i messaggi dalla(e) casella(e) dell&#8217;utente, poste sui server dei vari Provider (es. Libero.it, Tiscali.it, Tin.it, ecc.), la inserisce nella &#8220;<em>casella della posta in arrivo</em>&#8220;, gestisce i vari &#8220;flag&#8221; (letta, non letta, risposta, inoltrata, ecc.), permette di cancellare messaggi o di spostarli in altri folder&#8230; il tutto <u>manualmente</u> oppure, nel migliore dei casi, gestito da apposite &#8220;<em>regole di gestione della posta</em>&#8221; che, come dicevo, sono particolari <em>per ogni client</em>: le regole di OutLook non si possono utilizzare (direttamente) in Lotus Notes, in Thunderbird o in Pegasus.<br />
&nbsp; &nbsp; Il risultato pratico di tutto ciò è che, volendo cambiare client di posta, si deve solo sperare che quello &#8220;nuovo&#8221; abbia dei &#8220;filtri d&#8217;importazione&#8221; che permettano di importare la posta esistente dalle cartelle attuali alle nuove (perchè lasciarle stare pare sia escluso: ognuno si gestisce le proprie in modo &#8220;proprietario&#8221;), i filtri, le regole e tutte le personalizzazioni&#8230; a volte và bene ed a volte no (ed in questo caso c&#8217;è un grosso lavoro da fare, per &#8220;migrare&#8221; al nuovo sistema&#8230; a volte l&#8217;utente si scoraggia e rimane all&#8217;attuale). In genere il client più famoso fa &#8220;le sue cose&#8221; mentre quelli meno famosi hanno una serie di convertitori per permettere il passaggio, il più possibile indolore, dal più famoso a loro stessi&#8230; ma &#8220;il più possibile&#8221; non significa &#8220;totalmente indolore&#8221;.</p>
<h3>La visione client stand-alone</h3>
<p>&nbsp; &nbsp; In realtà la domanda è: visto che l&#8217;e-mail ha un formato <strong>standard</strong> (definito per la maggior parte in <a href="http://www.w3.org/Protocols/rfc822/">RFC822</a> e svariati altri) perchè il client non si limita a <strong>leggerla</strong> (ed alle altre <strong>due</strong> attività tipiche di un client: <strong>rispondere</strong>, <strong>inoltrare</strong>)? La risposta è semplice: in generale, nel mondo, esistono sistemi &#8220;monoblocco&#8221; (es. Windows) che non sono pensati come &#8220;client/server&#8221; ma piuttosto come &#8220;client stand-alone&#8221;.<br />
&nbsp; &nbsp; In generale infatti un sistema unix/linux è pensato come &#8220;multi-utente&#8221; (anche quando ha un solo utente: è la filosofia del sistema che conta) e le varie attività avvengono &#8220;come se si stesse lavorando su un host da (potenziali) n-mila utenti&#8221;: l&#8217;unica differenza è la <strong>scala</strong> delle varie azioni, non il modo.<br />
&nbsp; &nbsp; I sistemi &#8220;stand-alone&#8221; invece danno per scontato che, <em>anche qualora più utenti usino il sistema</em>, l&#8217;utilizzo avverrà sempre &#8220;uno alla volta&#8221;&#8230; in pratica sono &#8220;single-user by design&#8221;.<br />
&nbsp; &nbsp; Questo porta a tutta una serie di scelte, negli strumenti (browser web, e-mail, gestione dei file, ecc.) che non tengono conto delle logiche &#8220;lato server&#8221;: nella pratica ogni client penserà di &#8220;essere da solo&#8221; a dover fare tutto il lavoro&#8230; da qui il funzionamento di OutLook e compagnia bella.</p>
<h3>La visione lato-server</h3>
<p>&nbsp; &nbsp; Nel mondo dei server (quasi) tutte le &#8220;azioni&#8221; non son pensate per un uso interattivo bensì per la trattazione da parte di programmi, spesso messi in sequenza: in genere l&#8217;<strong>utente</strong> (a volte visto come utOnto: un &#8220;male necessario&#8221; -__-&#8221;) interviene nella catena tramite appositi &#8220;wrapper&#8221; che &#8220;si agganciano&#8221; al processo in corso il quale può benissimo funzionare senza il minimo intervento dello stesso (anzi, molti BOFH sono concordi nell&#8217;affermare che &#8220;senza gli utenti le cose funzionerebbero (molto) meglio&#8221; :-DDD).</p>
<p>&nbsp; &nbsp; Per quanto riguarda la <a href="http://it.wikipedia.org/wiki/Posta_elettronica">posta</a>, ad esempio, una delle possibilità è che un primo prodotto (ad es. FetchMail) prelevi la posta da una o più caselle remote, la passi ad un secondo prodotto (lo scanner anti-spam, ad es. SpamAssassin) che, dopo averla verificata, la passa ad un terzo (scanner antivirus) che la passa ad un quarto&#8230; e via così finchè l&#8217;ultimo della catena la posiziona in quel che viene chiamato &#8220;inbox&#8221; (inbound (e-mail) box), posto generalmente in una zona del filesystem non-user-oriented (di solito in /var/mail/ si trovano tutte le &#8220;inbox&#8221; degli utenti presenti sul sistema, un file per user, con il nome dell&#8217;utente: ad es. l&#8217;inbox dell&#8217;utente root si chiamerà &#8220;root&#8221;).</p>
<table width=100% bgcolor=#d0d0ff>
<tr>
<td><strong>/</strong></td>
<td>&nbsp;</td>
<td width=100%>(&#8221;root&#8221; directory o &#8220;radice&#8221;)</td>
</tr>
<tr>
<td>|&#8212;</td>
<td>/bin/</td>
<td>&nbsp;&#8212;.</td>
</tr>
<tr>
<td>|&#8212;</td>
<td>/boot/</td>
<td>&nbsp; &nbsp; &nbsp;\</td>
</tr>
<tr>
<td>|&#8212;</td>
<td>/dev/</td>
<td>&nbsp; &nbsp; &nbsp; &nbsp; (varie directories di sistema)</td>
</tr>
<tr>
<td>:</td>
<td>&nbsp;</td>
<td>&nbsp; &nbsp; &nbsp;/</td>
</tr>
<tr>
<td>|&#8212;</td>
<td>/etc/</td>
<td>&nbsp;&#8212;&#8217;</td>
</tr>
<tr>
<td>|&#8212;</td>
<td><strong>/home/</strong></td>
<td>&nbsp; &nbsp; &nbsp; (directory &#8220;degli utenti&#8221;, v. in seguito)</td>
</tr>
<tr>
<td>|&#8212;</td>
<td>/lib/</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>:</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>|&#8212;</td>
<td>/usr/</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&#8216;&#8212;</td>
<td><strong>/var/</strong></td>
<td>&nbsp; &nbsp; &nbsp; (directory dei file &#8220;variabili&#8221;)</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
<table width=100% bgcolor=#d0d0ff>
<tr>
<td><em>(Il filesystem di un server Linux)</em></td>
</tr>
</table>
<p>&nbsp;</p>
<table width=100% bgcolor=#d0d0ff>
<tr>
<td>:</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td width=100%>&nbsp;</td>
</tr>
<tr>
<td>/var/</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td align=right>&#8216;&#8212;</td>
<td>/mail/</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td align=right>|&#8212;</td>
<td>mario</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td align=right>|&#8212;</td>
<td>luigi</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>:</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td align=right>&#8216;&#8212;</td>
<td>root</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>:</td>
</tr>
</table>
<table width=100% bgcolor=#d0d0ff>
<tr>
<td><em>(La directory in cui la posta &#8220;arriva&#8221;: inbox)</em></td>
</tr>
</table>
<p>&nbsp; &nbsp; Ogni utente &#8220;gestisce&#8221; poi la sua posta tramite un set di folders posti, generalmente, nella subdirectory <em>Mail</em> della sua &#8220;home directory&#8221;.<br />
&nbsp; &nbsp; Nella pratica, il server ha una directory (<strong>/home/</strong>) in cui si trovano tutte le directory particolari dei singoli utenti, quindi <em>/home/<strong>mario</strong>/</em> contiene &#8220;<em>tutti i file di <strong>Mario</strong></em>&#8220;, come <em>/home/<strong>luigi</strong>/</em> conterrà quelli di <strong>Luigi</strong>: fogli di calcolo, documenti di testo, memo, immagini&#8230; diciamo che &#8220;<em>tutto quello che non riguarda &#8216;<strong>tutto il server</strong>&#8216; o &#8216;<strong>tutti gli utenti</strong>&#8216; generalmente viene inserito nelle &#8216;home&#8217; degli utenti singoli</em>&#8220;: questo porta molta pulizia, nel sistema, distinguendo tra &#8220;quel che è server&#8221; da &#8220;quel che non lo è&#8221; (per le utilities di gestione del sistema, fare questa distinzione è spesso importante).<br />
&nbsp; &nbsp; In ogni home, per gli utenti che hanno e-mail sul sistema, viene quindi creata una directory <strong>Mail</strong> (o anche <strong>mail</strong> o <strong>maildir</strong>, a seconda del sistema) ove viene raggruppata &#8220;<em>tutta la posta dell&#8217;utente</em>&#8220;.</p>
<table width=100% bgcolor=#d0d0ff>
<tr>
<td>:</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td width=100%>&nbsp;</td>
</tr>
<tr>
<td>/home/</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td align=right>|&#8212;</td>
<td>/mario/</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td align=right>|&#8212;</td>
<td>/Mail/</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>|&#8212;</td>
<td>/vacanze/</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>|&#8212;</td>
<td>mare</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>&#8216;&#8212;</td>
<td>montagna</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>&#8216;&#8212;</td>
<td>/fatture/</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>|&#8212;</td>
<td>acqua-gas</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>&#8216;&#8212;</td>
<td>luce</td>
</tr>
<tr>
<td align=right>&#8216;&#8212;</td>
<td>/luigi/</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td align=right>|&#8212;</td>
<td>/Mail/</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>|&#8212;</td>
<td>/lavoro/</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>|&#8212;</td>
<td>riunioni</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>&#8216;&#8212;</td>
<td>progetti</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>&#8216;&#8212;</td>
<td>/sport/</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>|&#8212;</td>
<td>sci</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align=right>&#8216;&#8212;</td>
<td>nuoto</td>
</tr>
<tr>
<td>:</td>
</tr>
</table>
<table width=100% bgcolor=#d0d0ff>
<tr>
<td><em>(Le directory degli utenti, home, e la posta, Mail)</em></td>
</tr>
</table>
<h3>Gestione dell&#8217;e-mail</h3>
<p>&nbsp; &nbsp; Come già accennavo, per gestire la posta i sistemi Linux usano (tra i tanti) <a href="http://it.wikipedia.org/wiki/Mail_Delivery_Agent">ProcMail</a> che, leggendo le sue &#8220;regole di gestione&#8221; da vari file (non solo /etc/procmail.conf), &#8220;filtra&#8221; la posta in arrivo adottando dei &#8220;comportamenti&#8221;: ad es. &#8220;<em>butta via il messaggio</em>&#8220;, oppure &#8220;<em>inoltra il messaggio su <strong>$tal_argomento</strong> all&#8217;utente <strong>$utente_interessato</strong></em>&#8220;, o ancora &#8220;<em>lancia <strong>$programma</strong> per gestire <strong>$messaggio</strong></em>&#8221; e tanto, tanto altro.</p>
<p>&nbsp; &nbsp; Sfruttando le meccaniche server-side possiamo quindi, fra le altre cose, automatizzare l&#8217;archiviazione delle mail &#8220;lette&#8221; per tutti gli utenti del server.<br />
&nbsp; &nbsp; Nella pratica agiremo come segue&#8230;</p>
<h3>L&#8217;archiviazione</h3>
<p>&nbsp; &nbsp; Per archiviare le mail presenti nell&#8217;inbox basta utilizzare:</p>
<li>uno <strong>script</strong> bash (<em>readmailarch</em>), che farà da &#8220;collante&#8221; per le varie azioni</li>
<li><strong>ProcMail</strong> con un <em>file di configurazione custom</em></li>
<li>una <strong>entry in crontab</strong>, per il lancio temporizzato del processo d&#8217;archiviazione</li>
<li>le utilities standard del sistema operativo: <strong>mv</strong>, <strong>rm</strong>, <strong>chown</strong>, <strong>chmod</strong>, <strong>touch</strong>, <strong>formail</strong>, <em>logger</em>, <em>from</em>, <em>wc</em> (alcune di queste sono opzionali)</li>
<h3>L&#8217;archiviazione: 1 - lo <u>script</u> bash</h3>
<p>&nbsp; &nbsp; Questo script, dopo la definizione di un paio di funzioni di utility (debugmsg e debugenter), svolge un primo step di verifica dei prerequisiti controllando:<br />
&nbsp; &nbsp; a) se è stato passato uno &#8220;username&#8221; (necessario per sapere a <strong>quale utente</strong> dev&#8217;essere archiviata la posta)<br />
&nbsp; &nbsp; b) se sono presenti le utilities di sistema fondamentali (richieste: formail, procmail) e se sono presenti il file di configurazione di procmail (i filtri per l&#8217;archiviazione) e la casella inbox dell&#8217;utente (in /var/mail/)<br />
&nbsp; &nbsp; c) se son presenti le utilities opzionali: logger, from e wc, in caso di assenza non si ferma il processo ma verrà meno la funzionalità di &#8220;logging&#8221;. In pratica, se tutte le utilities son presenti, l&#8217;archiviatore lascerà nel log di sistema una traccia del proprio lavoro fornendo il numero delle mail trovate in inbox prima e dopo l&#8217;archiviazione: siccome non è una funzionalità vitale, in caso di assenza di una delle utilities opzionali l&#8217;archiviatore lavora ugualmente ma non esegue alcun report.</p>
<p>&nbsp; &nbsp; Se i controlli hanno esito positivo, verrà innanzi a tutto &#8220;<em>messa offline</em>&#8221; la inbox dell&#8217;utente, per evitare che il processo di archiviazione interferisca con quello (sempre temporizzato) di ricezione della mail: in pratica si &#8220;sposta&#8221; la inbox su un file temporaneo e la si ricrea ex novo, con gli stessi permessi, per la ricezione della mail che <em>può avvenire</em> durante il processo di analisi della inbox temporanea (e che potrebbe anche esser lungo, a seconda del sistema hardware impiegato).</p>
<p>&nbsp; &nbsp; A questo punto parte l&#8217;analisi/archiviazione vera e propria: tramite <strong>formail</strong> viene passata a <strong>procmail</strong> tutta la inbox temporanea. Procmail userà, per l&#8217;analisi, il file custom di regole presente nella home dell&#8217;utente (e <u>di proprietà di root</u>, dato che altrimenti Procmail si &#8220;insospettisce&#8221;, venendo eseguito come root su file/directories non-di-root)</p>
<p>&nbsp; &nbsp; Il file di regole di procmail ha una struttura &#8220;particolare&#8221;, adatta al task di archiviazione (per dire che non è il &#8220;solito&#8221; file procmail.conf che si trova in /etc/ nè il file .forward che si trova nella home dell&#8217;utente), ma lo vedremo in dettaglio dopo aver finito d&#8217;analizzare lo script (v. sotto). Basti sapere, per il momento, che verificando il flag &#8220;<strong>R</strong>&#8221; (come riportato dall&#8217;<a href="http://www.rfc-editor.org/rfc/rfc2076.txt">RFC2076</a>) Procmail è in grado di controllare se una mail è stata <strong>letta</strong> o meno: tramite il file di filtro otteniamo che ogni mail &#8220;non letta&#8221; venga inserita in un file <strong>$userid.new</strong> nelle directory dove si trova la inbox (da qui la necessità di eseguire procmail da root).</p>
<p>&nbsp; &nbsp; In seguito all&#8217;analisi (ed archiviazione delle mail nei folder &#8220;interni&#8221; al Mail dell&#8217;utente) si tratta di &#8220;ricompattare&#8221; la inbox unendo alle (possibili) nuove mail arrivate quelle &#8220;non lette&#8221; (presenti nel file $userid.new) e quelle &#8220;non filtrate&#8221; (presenti nel file $userid.other): in pratica spostiamo (temporaneamente) rapidamente la inbox in inbox.new2, quindi creiamo una &#8220;nuova&#8221; inbox copiandoci dentro per prime le mail non lette (da $userid.new), aggiungendo la nuova mail (da $userid.new2) ed infine inserendovi le mail non archiviate (da $userid.other).</p>
<p>&nbsp; &nbsp; Creata la nuova inbox è il momento di far pulizia dei file &#8220;nuovi&#8221; ($userid.new, $userid.new2 e $userid.other) e della inbox pre-archiviazione ($userid.tmp).</p>
<p>&nbsp; &nbsp; Avendo quindi registrato le mail presenti prima e quelle attuali, se le utilities opzionali sono presenti si potrà scrivere nel log di sistema l&#8217;esito del lavoro svolto: <em>archiving process results: NNN initial, MMM current, AAA archived</em>.</p>
<p>&nbsp; &nbsp; Il codice dello script si trova <a href="http://www.coianiz.it/my.blogimages/readmailarch">QUI</a>.</p>
<p><em>(nota: è possibile che il giro inbox -> inbox.new2, inbox.new + inbox.new2 + inbox.other -> inbox sia eccessivamente contorto: è probabile che basti copiare nella &#8220;nuova inbox&#8221; i file inbox.new ed inbox.other ottimizzando lievemente la parte finale del processo)</em></p>
<h3>L&#8217;archiviazione: 2 - il file di configurazione <u>procmailrc</u></h3>
<p>&nbsp; &nbsp; Come scrivevo poc&#8217;anzi, dovendo spostare, copiare e rimuovere file, è necessario agire tramite uno script: per questo motivo non possiamo usare, per far girare procmail, i file standard /etc/procmail.conf (system-wide) o /home/$userid/.forward (user-wide) perchè mancherebbe l&#8217;azione dello script sulle inbox, inoltre l&#8217;archiviazione agirebbe ogni volta che viene richiamato procmail, e questo non lo si vuole.<br />
<em>(nota: tramite procmail <strong>è possibile</strong> eseguire script, per l&#8217;automazione di cui sopra, ma mi pare una strada più complessa di quella, tutto sommato semplice e lineare, che ho adottato tramite il &#8220;task di archiviazione&#8221;, tutto qui, oltre al fatto che stiamo agendo su una (o più) inbox &#8220;offline&#8221; in modo batch)</em></p>
<p>&nbsp; &nbsp; Ogni utente del sistema che vorrà fruire del processo di archiviazione automatica dovrà avere, nella sua home directory, un file <strong>procmailrc</strong> contenente le seguenti direttive/filtro:</p>
<p>&nbsp; &nbsp; <strong>1)</strong> la prima direttiva (che segue le definizioni di ambiente per procmail) definisce la creazione di un file <strong>$userid.new</strong> in cui verranno poste tutte le mail <u>non lette</u>.</p>
<p>&nbsp; &nbsp; <strong>2)</strong> nella seconda sezione si trovano i filtri per l&#8217;<strong>archiviazione</strong> vera e propria: prima quelli per gli <em>alias</em> (se ne usate) e poi quelli per l&#8217;<em>account principale</em>: tutti i messaggi che corrispondono ai criteri di selezione verranno copiati nei folder definiti dai filtri e presenti nella directory Mail dell&#8217;utente: se un file non dovesse esser presente procmail lo crea al momento (nota: siccome il task gira come root, è preferibile che i file in Mail siano <strong>già presenti</strong>, altrimenti verranno creati <u>con le permission di root</u> e l&#8217;utente non li potrà leggere: quando create/modificate i filtri fate attenzione a questo particolare).</p>
<p>&nbsp; &nbsp; <strong>3)</strong> l&#8217;ultima sezione del file è fondamentale per evitare di perdere le mail che, anche se già lette, non corrispondono ad alcun criterio di filtro: queste verranno copiate in un file <strong>$userid.other</strong> il cui contenuto, tramite lo script, verrà poi reinserito in coda all&#8217;inbox.</p>
<p>&nbsp; &nbsp; Un sample del file procmailrc (da configurare ed inserire in /home/$userid/) si trova <a href="http://www.coianiz.it/my.blogimages/procmailrc">QUI</a>.</p>
<h3>L&#8217;archiviazione: 3 - la entry in <u>crontab</u></h3>
<p>&nbsp; &nbsp; Perchè tutto il processo avvenga in modo automatico si sfrutta Cron: inserendo una apposita entry nel suo file di configurazione (/etc/crontab) si chiede a Cron di eseguire, ad una data ora (o con la periodicità voluta), lo script di archiviazione.</p>
<p>&nbsp; &nbsp; Tenuto conto del tipo di lavoro da eseguire e della mole di dati da archiviare (poche mail al giorno, a volte nessuna) ho deciso di far lanciare l&#8217;archiviazione una sola volta al giorno, di mattina alle 7:30, quando (in teoria) gli utenti sono a dormire e/o difficilmente stanno guardando la propria mail.</p>
<p>&nbsp; &nbsp; Basta inserire in crontab:<br />
<code><br />
# 20090307=LC archive user's mail everyday at 07:30<br />
30 7    * * *   root    /usr/local/sbin/readmailarch lcoianiz<br />
</code></p>
<p>&nbsp; &nbsp; La prima riga è un commento e non viene letta da Cron, la seconda è il comando.</p>
<p>&nbsp; &nbsp; Si può notare come, in questo momento, io faccia eseguire l&#8217;archiviazione unicamente per un utente: avendo più utenti (realmente) attivi sul sistema è possibile (1) inserire ulteriori entries in crontab, per avere un&#8217;esecuzione parallela dei task di archiviazione (nessun file conflitta: i task possono girare in concorrenza) oppure (2) modificare il (singolo) task di archiviazione per effettuare la sua azione &#8220;per tutti gli utenti che hanno inbox presenti in /var/mail/&#8221; (e che hanno file procmailrc in /home/$userid/).</p>
<p>&nbsp; &nbsp; Dovendo scegliere, preferirei la prima alternativa: oltre ad aver un maggior controllo sugli utenti sui quali avviene l&#8217;archiviazione, si agisce anche in parallelo (e, cosa da non disprezzare, lo script di archiviazione va già bene com&#8217;è ;-)).</p>
<h3>L&#8217;archiviazione: 4 - le utilities del sistema operativo</h3>
<p>&nbsp; &nbsp; Di base, il task di archiviazione richiede la presenza almeno di:</p>
<li>procmail</li>
<li>formail</li>
<li>cp, rm, mv, bash (o altra shell compatibile)</li>
<p>&nbsp; se queste non vengono trovate il task si ferma e, se eseguito manualmente, segnala l&#8217;errore.</p>
<p>&nbsp; &nbsp; In aggiunta è raccomandato installare:</p>
<li>logger (per scrivere in syslog gli esiti)</li>
<li>from (per avere l&#8217;elenco delle mail presenti in inbox)</li>
<li>wc (per contare le mail in elenco senza listarle)</li>
<p>&nbsp; &nbsp; In linea di principio l&#8217;archiviazione può esser lanciata in qualsiasi momento, per questo motivo, prima di inserire la configurazione in crontab sarebbe meglio effettuare qualche prova lanciando readmailarch da root e vedendone gli esiti.<br />
&nbsp; &nbsp; In fase di test è altresì consigliato abilitare le funzionalità di debug che, oltre a visualizzare i messaggi relativi alle attività effettuate, EVITANO di cancellare automaticamente il file $userid.tmp (la inbox originale) alla fine del processo: per sicurezza è meglio che, constatato il buon funzionamento del task, la cancellazione avvenga manualmente.<br />
&nbsp; (si dà comunque per scontato che, dato il tipo di dati trattati, <strong>venga eseguito un backup</strong> sia della <strong>inbox</strong> che della propria directory <strong>Mail</strong> <u>prima</u> di iniziare qualsiasi test).</p>
<p>&nbsp; &nbsp; Qualsiasi feedback su eventuali problemi, consigli o altro (magari gli improperi teneteli per voi :-P) sarà il benvenuto: luca_AT_coianiz.it</p>
<p>&nbsp; &nbsp; Buona archiviazione ;-)
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.imagine.coianiz.it/index.php/inutilities/archiviatore-di-mail-letta/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

