[precedente] Cross Compiler - Copertina - Tcl/Tk [successivo]

Articolo


La posta del cuore

Non avete mai pensato come sarebbe bello avere tutto il necessaire per la propria posta elettronica contenuto in un dischetto? Ovunque fosse presente una Linux Box dotata di accesso ad Internet a cui voi naturalmente possiate accedere, potreste ritrovare in un battibaleno il vostro client di posta, le vostre folder, la vostra personalissima rubrica... Proprio come se foste sempre a casa.
Messa così la cosa può sembrare una inserzione pubblicitaria di una software house che ha inventato l'ennesimo prodotto che migliorerà anche il vostro rapporto con il dentista.
Ma noi siamo persone serie (...) e quindi analizziamo puntigliosamente cosa si può fare, quali sono i pro ed i contro. Nella breve intro avrete già capito dove vogliamo arrivare. Iniziamo dai prerequisiti: si suppone che la Linux Box abbia una via d'accesso ad Internet (dial-up o LAN) e che vi si trovino i seguenti programmi: fetchmail, procmail e mutt. Rispettivamente un client POP3, un manipolatore di posta in arrivo e un client di posta. Scopo di questo articolo è anche quello di invogliare qualche newbie a digitare man fetchmail, man procmail, man procmailex e man mutt e magari scoprire che leggere la posta in modo testo è più pratico e veloce che non far partire un windows manager e un mail client sotto X... Poco fa vi avevo detto "potrete leggere la vostra posta con il vostro mail client preferito" . Vi ho imbrogliato: preferito certo, basta che sia mutt. (Come la Ford T, disponibile in tutti i colori purchè fosse il nero). Non sto dicendo che con altri mail client non è possibile: ma io uso questo. Il nostri obiettivi sono:


Prelievo della posta


Fetchmail accetta parametri, oppure può leggere la configurazione da un file che deve essere collocato nella propria home e deve chiamarsi .fetchmailrc:

    poll mio.provider.it timeout 90 
    proto pop3 
    user account pass password 
    flush fetchall
Avremo cura di cambiare i permessi del file in 600 affinchè nessuno possa leggere la nostra password. Se ora lanciamo fetchmail, vedremo che esso scarica i messaggi e li gira all'utente locale collegandosi alla porta (usualmente) tcp 25 e inoltrando il messaggio tramite il protocollo SMTP al sendmail locale che ivi alligna. Esso provvederà a salvarla nel file /var/spool/mail/USER e, se avete il famigerato biff y nel vostro .profile sarete infastiditi dalla notifica "You have mail" . A questo punto potete lanciare un mail client primitivo come "mail" , oppure pine oppure mutt. Tutti e tre vi mostreranno (in modi differenti) la lista dei messaggi permettendovi di eseguire varie operazioni. Per esempio se li leggete con "mail" questi alla fine vi dirà "saved N messages in mbox" il che significa che le mail in questione sono state rimosse da /var/spool/mail/USER per essere ricopiate pari pari nel file mbox nella vostra home.

Smistamento della posta

Se è presente un file .procmailrc nella vostra home, la lettera in arrivo non finirà nel file /var/spool/mail/USER (almeno non subito...). Essa è "nelle mani" del demone di posta (poniamo sendmail) che usualmente la accoda al file /var/spool/mail/USER. Se è presente un file .procmailrc nella vostra home sarà il demone che farà partire automaticamente procmail per processare la missiva che incombe. Voi non dovrete mai lanciare procmail manualmente. Dal nostro punto di vista, costruire un file .procmailrc non è altro che un modo per dire al demone di posta "desidero che le lettere in arrivo non siano più banalmente accodate al file /var/spool/mail/USER ma vengano processate secondo questi criteri, e vengano conseguentemente adottate le seguenti misure (azioni)." Ecco un ipotetico .procmailrc:

    :0
    * "Sender:.*pluto.*
    poz/pluto
    
    :0
    poz/new
    
    exit
    

Se una mail in arrivo contiene la parola "pluto" nell'header "Sender", verrà salvata nel file pluto nella directory poz ($HOME/poz), e verrà considerata processata. Se non soddisfa questo requisito, verrà esaminata la regola successiva che è l'ultima e non stabilisce alcun criterio: tutte le mail che soddisfano a... niente (quindi tutte quelle che non hanno soddisfatto i filtri precedenti) vengono salvate nel file poz/new, e verranno considerate processate. Notate che se non avessimo messo quest'ultimo filtro matcha-tutto la mail che sarebbe arrivata fin lì sarebbe stata infilata, come accadeva senza .procmailrc, in /var/spool/mail/USER. In questo modo nessuna mail verrà mai più salvata in /var/spool/mail/USER, ma tutte le mail verranno salvate nei rispettivi file nella directory poz, e tra questi file quello di nome new è quello in cui al limite (o per default, se preferite) finiranno le mail. Date a .procmailrc permessi 755. A questo punto è chiaro che: tramite .procmailrc organizzeremo la nostra posta (quello che era il sistema di folder e filtri integrato in Netscape Communicator, per esempio) ma sopratutto la costringiamo a finire nella directory poz nella nostra home. Avrete già capito dove vogliamo andare a parare: vogliamo mettere tutto, o quasi, nella directory poz in modo da poterla trasportare dove più ci piace.

Il file batch


C'è un particolare: fetchmail e procmail "vogliono" che .fetchmailrc e .procmailrc stiano nella home (anche se non è del tutto vero per fetchmail). Il file batch che faremo si occuperà di: Notate che se sul sistema ospite sono presenti fetchmail, procmail e mutt non dovremo far altro che digitare
fetchmail
poi
mutt
Quando avremo finito, il batch si occuperà delle operazioni inverse:

Mutt


Dei tre programmi indispensabili, questo è forse quello che non vi ritroverete installato. Io uso una slackware 3.4 e mutt non c'è nemmeno come pacchetto da installare: per una Debian o RedHat non dovrebbero esserci problemi. Ah, mutt ha un'interfaccia a caratteri "evoluta" e colorata, come quella del Midnight Commander o Minicom per intenderci. Prima di usare mutt pensavo che un buon client di posta elettronica non potesse che essere per X-Windows: ora mi sono ricreduto e passo quasi tutto il tempo con il mio Linux in modalità caratteri. Bene. Non avevo mutt e quindi mi sono recato su www.ftpsearch.com dove ho impostato la ricerca per mutt con restrizione al dominio metalab.unc.edu: il nostro eroe si trovava in ftp://metalab.unc.edu/pub/Linux/system/mail/mua/mutt-0.89.1.elf.tar.gz. Siamo diffidenti e scompattiamo il file in una directory temporanea (ci sono ancora in giro dei buontemponi che preparano pacchetti che si spiaccicano con migliaia di file nella directory corrente) e troviamo due eseguibili (mutt e urlview) che metteremo in /usr/local/bin, un file .muttrc che copieremo nella nostra home, una directory doc dove troveremo le manpage (file con suffisso .1 da copiare in /usr/man/man1) e un file manual.txt Apriamo una parentesi su come rendere leggibile questo file. Se lo aprite con un editor di testo, riconoscerete immediatamente che il formato è quello tipico da dare in pasto a groff. Rendiamo quindi il file una manpage:

groff -man -Tascii manual.txt > muttdoc.1

e spostiamolo nella directory delle manpage

cp muttdoc.1 /usr/man/man1

quindi ora potremo digitare

man muttdoc

per consultarlo. Raccomando caldamente la lettura del manuale. Scoprirete che mutt è altamente configurabile. Ora riporterò i cambiamenti dalla configurazione standard che ho operato, per assecondare i miei gusti personali e lo scopo di questo articolo. Ho riscontrato dei problemi con mutt ad operare su di un file di testo per conservarvi gli alias di posta elettronica. Questi problemi scompaiono se viene indicato lo stesso .muttrc come file dove conservarli. Quindi, modifichiamo .muttrc:

impostiamo il file degli alias

set alias"file=~/.muttrc
(dove la tilde indica la home nella sintassi di .muttrc) e decommentiamo
set autoedit
impostiamo il nostro editor di testi preferito:
set visual=joe
e, importante, la directory di default
set folder=~/poz
Quando mandiamo una mail e non specifichiamo un dominio (ad esempio vogliamo mandare una mail a giulio che è un utente locale) è possibile specificare un dominio di default che viene appiccicato automaticamente al destinatario senza dominio. In questo caso:
set hostname=dreamland.sky
la mailbox (file) che conterrà le lettere spedite
set record=~/poz/out
la mailbox di partenza; abbiamo detto che tutte le mail in arrivo non vanno più in /var/spool/mail/USER ma in $HOME/poz/new (ve le manda procmail) quindi
set spoolfile=~/poz/new
impostiamo i nostri estremi:
my_hdr From: Pironato Massimo        
my_hdr Reply-To: massimo.pironato@dreamland.sky
indichiamo il file che contiene la nostra signature:
set signature=~/poz/.signature
Ora viene la parte più personale della cosa. Non mi piaceva la programmazione dei tasti originaria. Mutt si presenta come Minicom: una barra di stato superiore ed una inferiore. Nel mezzo ci può essere di volta in volta un elenco di qualcosa (di mail, di mailbox, di alias - gli ambienti chiamati nel manuale come l'index, il pager, il composer, il message index) navigabile con i tasti [su] e [giù] ed [invio]. Quello che mi dava fastidio era che dopo aver selezionato una mail con [invio], se il testo eccedeva l'altezza dello schermo premendo il tasto [giù] ottenevo di passare alla lettera successiva e non alla pagina seguente della lettera corrente. (Per sapere quando vi trovate in un ambiente come sono impostate le combinazioni dei tasti, usate [?]. In mutt, ad un tasto è associata una funzione, o una macro che è una sequenza di tasti, quindi una sequenza di funzioni. L'help vi mostra tutte le associazioni. Questo è utile in primo luogo per scoprire cosa si può fare, in secondo luogo per capire quale tasto premere, ed in terzo luogo per reperire il nome esatto dell' "azione" da compiere quando vorrete riassociare i tasti). Il formato di una linea di binding (binding=associazione di un tasto con un compito) è:
bind ambiente        tasto   compito
dove gli ambienti sono le l'index (l'elenco delle mail) il pager (il visualizzatore di mail) il composer (il compositore di mail, da non confondere con l'editor preferito per scrivere il testo della mail...) ed il message index che è l'elenco delle mailbox. Con i bindings seguenti invece ho portato mutt ad un comportamento più "naturale" :
Voglio usare [f1] per spedire una nuova mail, anzichè [m]:
bind index f1 mail
voglio che le freccie [giù] e [su] permettano di scorrere il testo [giù] e [su], quando sto visualizzando una mail (nel pager)
bind pager down next-line
bind pager up previous-line
voglio uscire con [esc];
bind pager \e exit
e con [invio], se sto leggendo una mail (ottengo l'effetto di rimbalzare dalla lettura della mail alla lista delle mail premendo ripetutamente [invio]):
bind pager \r exit
Le impostazioni hanno granularità a livello di pager, di index,etc: devo dire anche all'index che voglio uscire con [esc]:
bind index \e quit
Voglio usare [f1] per spedire il messaggio, dopo che l'ho composto:
bind compose f1 send-message
e [f2] per modificarlo, se ci ho ripensato:
bind compose f2 edit-file
al solito nel composer voglio editare il testo della mail anche con [invio] oltre che con [f2], e voglio uscire con [esc] oltre che con [y]:
bind compose \r edit-file
bind compose \e exit
bind compose y exit

Per navigare tra le varie folder di posta (i file creati impostando .procmailrc: essi sono new e pluto nell'esempio che stiamo costruendo) posso premere [c], poi [?] ed infine selezionare una folder tra quelle presentate. Troppo macchinoso: voglio vedere la lista delle folder con un solo tasto. Voglio che questo tasto sia sempre [c]. Sposto quindi la funzionalità di [c] al tasto [z]
bind index z change-folder
e costruisco una macro (=sequenza di tasti come fosse premuta dall'operatore, questa è una macro per mutt) che associa a [c] la sequenza [z]?
macro index    "c"    "z?" 
ho bisogno di questo anche quando sto leggendo una mail:
bind pager z change-folder
macro pager      "c"   "z?" 
Ed ora un settaggio squisitamente personale, che ci fa vedere l'uso degli hook. Il mio indirizzo attuale è massimo.pironato@dreamland.sky, e mi ero iscritto alle mailing list del pluto come edika@dreamland.sky. Le mailing list del pluto non accettano mail se il mittente non ha il nome di quando si è registrato. Poichè io ora voglio apparire come massimo.pironato@dreamland.sky, voglio istruire mutt a usare il vecchio email quando spedisco alle mailing list del pluto:
send-hook pluto "my_hdr From: Pironato Massimo  <edika@dreamland.sky >"
send-hook pluto "my_hdr Reply-To: Pironato Massimo  <edika@dreamland.sky >"
Ultimo ma non ultimo (anzi è la cosa più importante) occorre indicare a mutt il modo corretto di inoltrare una mail che deve essere spedita. Mutt si aspetta che il demone di posta sia sendmail. Per chi usa qmail non so indicare le modifiche da effettuare. Indicando:
set sendmail=/usr/bin/sendmail -t -oi -oem -fmassimo.pironato@dreamland.sky
l' opzione -t indica a sendmail che la mail da spedire gli sarà inoltrata nello standard input. Mutt infilerà la mail in partenza nello standard input del programma che gli si è indicato come mda (mail delivery agent) ovvero del contenuto della variabile sendmail che stiamo esaminando. Fate attenzione: la variabile che contiene il nome del mda da usare ha lo stesso nome dello mda più diffuso (sendmail, appunto): se usaste qmail avremmo qualcosa del tipo:
set sendmail=qmail [options...]
Le opzioni -oi -oem si applicano appunto ai dati di input (vedere man sendmail) e questo sarebbe tutto secondo il manuale di mutt. Ma a me è capitata una cosa che mi ha fatto tribolare e di cui spero facciate tesoro. Il mio provider ha deciso proprio in quel periodo, presumibilmente per eliminare almeno gli spammer più stupidi, di consentire il relay delle mail solo a chi si identificava (come mittente) appartenente ad un dominio esistente in Internet. Successivamente la restrizione è stata ampliata e a tutt'oggi è possibile inoltrare una mail solo se il mittente appartiene al dominio del provider. questa operazione è trasparente a chi utilizza client di posta che si collegano tramite protocollo SMTP direttamente alla porta tcp 25 (o quella che è) del server di posta del provider. I client come Netscape Mail, KMail operano in questo modo. Quando (nell'ambito del protocollo) viene loro richiesto di identificarsi, inoltrano senza indugio la stringa che avete indicato come la vostra email. Ma Mutt affida la mail al sendmail locale, che contatterà poi il sendmail del provider. È la stessa cosa che succede se mandate una mail con il comando mail (scusate il gioco di parole). Senonchè in questo caso, il vostro sendmail si ostinerà (anche se l'header From: preparato da Mutt nel file dato in pasto a sendmail è corretto) a indicare come mittente, nella contrattazione con il sendmail del provider, qualcosa come utente@vostrodominio.casalingo. Devo ammettere che io in casa ho una rete con un DNS locale ed un mio dominio casalingo, e che voi potreste non ricadere in questa situazione. Ma esiste un flag che elimina ogni problema: il flag -fmassimo.pironato@dreamland.sky forza sendmail ad usare questo mittente e tutto torna a posto.

Ancora sul file batch

A questo punto creiamo il file batch che automatizza il travaso da e dal dischetto:

#!/bin/sh
if [ ! -d $HOME/poz ];then
    echo "Copia  DA dischetto A locale  __ <- []"
    echo quot;Confermi (N/s)?"
    read cmd
    if [ $cmd != "s" -a $cmd != "S" ];then
    exit 1
    fi
    cd $HOME
    mcopy a:poz.tgz 
    if [ $? != "0" ];then
        echo Il file poz.tgz non esiste sul dischetto.
        exit 1
        fi
    tar -xvzf poz.tgz
    if [ $? != "0" ];then
        echo Impossibile scompattare poz.tgz
        exit 1
        fi
    mv .fetchmailrc .fetchmailrc.poz
    mv .procmailrc .procmailrc.poz
    mv .muttrc .muttrc.poz
    cd $HOME/poz
    cp .fetchmailrc ..
    cp .procmailrc ..
    cp .muttrc ..
    cd ..
    rm poz.tgz
else
    echo "Copia  DA locale A dischetto  __ -> []"
    echo "Confermi ? (N/s)" 
    read cmd
    if [ $cmd != "s" -a $cmd != "S" ];then
        exit 1
    fi
    cd $HOME
    cp .fetchmailrc poz
    cp .procmailrc poz
    cp .muttrc poz
    tar -cvzf poz.tgz poz
    if [ $? != "0" ];then
        echo "Impossibile compattare la directory"
        exit 1
    fi
    mdel a:poz.tgz 2> /dev/null
    cp poz.tgz .poz.backup.tgz
    mcopy poz.tgz a:
    if [ $? != "0" ];then
        echo "Impossibile copiare su dischetto"
        exit 1
    fi
    rm .fetchmailrc
    rm .muttrc
    rm .procmailrc
    mv .fetchmailrc.poz .fetchmailrc  2> /dev/null
    mv .procmailrc.poz .procmailrc 2> /dev/null
    mv .muttrc.poz .muttrc 2> /dev/null
    rm -r poz
    rm poz.tgz
fi
Chiameremo questo file psync. Copiamo anch'esso su dischetto. Quando ci sediamo su una Linux Box (ad esempio una macchina adibita a scarico ftp in una sperduta aula universitaria, con un accesso guest) copiamo dal dischetto il batch psync e lo rendiamo eseguibile con permessi 755 e successivamente lo lanciamo. Il programma rileva automaticamente se deve copiare dal dischetto (quando arriviamo) o copiare sul dischetto (quando dobbiamo andare via). Non dimenticatevi di eseguire psync per buttare tutto su dischetto, quando ve ne andate ! Periodicamente avrete cura di svuotare le mailbox ma in 1.4 Megabyte di testo ne sta ancora, per fortuna. Ecco tutto: il vostro dischetto conterrà tutto quello che vi serve per la posta, e vi seguirà ovunque. Poichè i dischetti si rovinano, il batch ha cura di conservare una copia di backup sul disco fisso di ogni macchina sulla quale siete stati. Questo avviene quando si copia sul dischetto. Se la macchina è aperta a tutti con un accesso guest, o se è l'account di un vostro amico, non dimenticate di eliminare .poz.backup.tgz prima di andarvene. Un' ultima cosa per evitare moti di stizza a chi prova il tutto su Solaris: da quel che ho visto io il tar di Solaris non accetta l'opzione z che comprime il file. Quindi sarà necessario sostituire comandi come:
tar -xvzf file directory
presenti nel batch omettendo il flag incriminato e pipando su gzip.

di Massimo Pironato


[precedente] Cross Compiler - Copertina - Tcl/Tk [successivo]