Cross Compiler - Copertina - Tcl/Tk |
Articolo
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:
.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.
.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
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.
.fetchmailrc
e .procmailrc
stiano nella home (anche se non è
del tutto vero per fetchmail).
Il file batch che faremo si occuperà di:
poz
dal dischetto al
disco rigido;poz
conterrà oltre ai file che sono le
nostre mail folder, anche il nostro .fetchmailrc
, .procmailrc
e (chi l'avrebbe mai detto?) .muttrc
;.fetchmailrc
.procmailrc
e .muttrc
del sistema ospite (l'account potrebbe essere quello di un vostro amico)
al sicuro da qualche parte;poz
.fetchmailpoi
muttQuando avremo finito, il batch si occuperà delle operazioni inverse:
.fetchmailrc
.procmailrc
e .muttrc
nella directory
poz
(potremmo averli modificati);.fetchmailrc
c'è il nostro account...);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" :
bind index f1 mailvoglio 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
.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-foldere 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.
#!/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.
Cross Compiler - Copertina - Tcl/Tk |