Inizio Capitolo

Introduzione


Non è il grande che supera il piccolo, ma il veloce il lento. [Heinz Peter Halek]

Diversificare il comportamento in base a regole con gli hooks

Se usate Mutt per un pò, sicuramente finirete per configurare anche i cosiddetti uncini (hooks)!

Mediante un hook possiamo eseguire un comando di Mutt, o settare una sua variabile di configurazione, diversamente a seconda del rispetto o meno di una certa regola.

Mutt ci mette a disposizione numerosi tipi di hook, che cercheremo di illustrare con degli esempi, come al solito tratti dal mio .muttrc.

Per far capire meglio e da subito di cosa stiamo parlando, un hook può consentire, ad esempio, di impostare una signature diversa a seconda del mittente a cui rispondiamo, di spostare un messaggio già letto in una mailbox specifica a seconda del suo autore (invece di quella "standard" definita con la variabile mbox), ecc..

In generale, non è comunque possibile dire tutto quello che è possibile fare con i vari tipi di hook, perchè ciascuno può sbizzarrirsi a seconda delle sue necessità, nei limiti delle variabili e dei comandi disponibili e delle regole di funzionamento degli hook utilizzati.

Attraverso gli hooks possiamo fare in modo che le personalizzazioni e i comodi automatismi di Mutt siano ancora più tarati sulle nostre esigenze. Non ci servono per iniziare ad usare Mutt, sono invece una delle funzionalità più apprezzate da chi è un mutter sfegatato.

In questo capitolo tratteremo i principali tipi di hook disponibili, ovvero:
  1. folder-hook
  2. send-hook
  3. message-hook
  4. save-hook
  5. mbox-hook
  6. fcc-hook
  7. fcc-save-hook

Tratteremo nel capitolo dedicato all'utilizzo di GnuPg il pgp-hook (utilizzabile per far cifrare un messaggio destinato ad un certo indirizzo utilizzando l'ID della chiave pubblica specificato attraverso l'hook).


Non tratteremo invece, anche perchè i relativi argomenti non sono qui illustrati:
  1. account-hook (alla stessa stregua di folder-hook consente di impostare settaggi quando si chiede a Mutt di entrare in una casella di posta remota IMAP. Si utilizza pertanto quando se ne possiede più d'una e si vuole far gestire correttamente, ad esempio, l'autenticazione alle diverse caselle IMAP).
  2. charset-hook (per definire un alias per un certo set di caratteri)
  3. iconv-hook (per forzare l'impostazione del nome di sistema per un certo tipo di set di caratteri)
  4. e altri hook, spesso disponibili solo se Mutt viene compilato con patch particolari che ne ampliano le funzionalità.

Prima di illustrare gli hook, chiariamo però i seguenti aspetti generali nell'utilizzo di un hook (che poi vedremo declinati argomentando sui singoli tipi di hook):
  1. Utilizzo della variabile default_hook
  2. Posizione della regola di default in una catena di hook.
  3. Utilizzo del comando unhook.


^top

La variabile default_hook

Ogni tipo di hook nella sua sintassi prevede che venga definita una condizione, un criterio che, se soddisfatto, farà si che Mutt esegua il comando o imposti una variabile specificata.

Con eccezione del folder-hook, ove la condizione va posta attraverso una espressione regolare (regexp), negli altri tipi di hook la condizione va definita attraverso un pattern per consentire un controllo mirato su alcune parti componenti tipiche di un messaggio di posta (es: destinatario, mittente, soggetto, ...)

Per "risparmiarci" la fatica di scrivere il pattern in ogni hook, possiamo utilizzare la variabile default_hook.

Se anteponiamo un default_hook alla serie di un certo tipo di hook che prevede l'inserimento di un pattern come condizione e nei quali invece fissiamo le condizioni mediante "semplici" espressioni regolari, Mutt le tradurrà automaticamente nel o nei pattern specificati tramite il default_hook.

Un default_hook, una volta "letto" da Mutt, rimane impostato; pertanto dobbiamo fare in modo che per ogni serie di hook il valore del default_hook sia adeguato.

Per questo possiamo definire un default_hook unico molto ricco di pattern, ovvero tanti default_hook anteposti ai tipi di hook che richiedono un pattern e con pattern adeguati al tipo di hook che devono servire.

Analizzando nel dettaglio i tipi di hook vedremo delle possibili impostazioni del default_hook.

Abbiamo illustrato i pattern nel capitolo sulla gestione dei messaggi, per rileggere clicca qui.



^top

Posizione della regola di default in una catena di hook

Quando impostiamo una variabile in base ad un hook, Mutt mantiene tale impostazione della variabile anche una volta "usciti" dalla condizione che ne aveva dettato il particolare settaggio.

Pertanto è importante definire sempre un hook che imposti la regola di default!

La regola di default viene fissata:
  1. se utilizziamo una espressione regolare, mediante un semplice punto (in base alla sintassi delle espressioni regolari abbiamo già visto che il ".", ovvero il punto, consente di impostare una regola "matcha tutto").
  2. se utilizziamo un pattern, mediante ~A (che significa "matcha tutti i messaggi").

  3. Il corretto posizionamento della regola di default è tuttavia importante affinchè gli hook funzionino secondo le attese. La posizione dipende dal tipo di hook:

    1. Regola di default in testa per folder-hook, send-hook, message-hook.

      Questi tipi di hook possono eseguire più comandi e configurare più variabili, poichè Mutt processa ogni hook (dello stesso tipo) nell'elenco, eseguendo ogni comando che matcha la regola dell'hook in cui è inserito.

      Posizionando in testa alla sequenza la regola di default ci garantiamo che venga comunque fissato lo standard e che poi l'eventuale match di una regola successiva possa variare, sovrascrivendole, le impostazioni standard.

      Detto che gli hook vengono analizzati ed eseguiti, se del caso, nell'ordine in cui sono inseriti nel .muttrc, è di norma consigliabile impostare le regole più omnicomprensive prima e quelle più specifiche dopo.

    2. Regola di default in coda per mbox-hook, save-hook, fcc-hook, fcc-save-hook.

      Con questi tipi di hook Mutt deve eseguire un comando o settare una variabile non appena la condizione viene verificata e fermarsi, senza proseguire nell'elaborazione.

      Posizionando la regola di default in coda consentiamo alle regole che la precedono di essere esaminate; se una regola particolare viene matchata Mutt esegue l'impostazione richiesta e si ferma; se nessuna regola particolare trova riscontro, Mutt prosegue fino ad applicare l'impostazione prevista dalla regola di default.

      Al contrario del punto precedente, con questo tipo di hook è opportuno definire le regole più stringenti in testa e quelle più omnicomprensive in coda, con ultima sempre quella di default.


    ^top

    Il comando unhook

    E' buona norma inserire in testa ad ogni sequenza di hook anche il comando unhook.

    Questo comando consente infatti di resettare le impostazioni attive, per ulteriore tranquillità sul corretto comportamento di Mutt (corretto nel senso di conforme alle attese!).

    Per resettare tutti gli hook la sintassi del comando è
    # resetta tutti gli hook

    unhook *

    Per resettare solo un certo tipo di hook la sintassi sarà invece (ad esempio per il save-hook):
    # resetta i save-hook

    unhook save-hook


    ^top

    folder-hook: settaggi in base alla mailbox

    Cosa può essere comodo differenziare nel comportamento di Mutt a seconda della mailbox a cui si accede?

    Principalmente, direi, il criterio di ordinamento dei messaggi, ma anche le variabili che impostano il look di Mutt (illustrate nel prossimo capitolo), ovvero colori, testi delle righe di status, ecc...

    La sintassi del comando folder-hook è:

    folder-hook regexp comando/variabile

    Regola di default: in testa.

    Criterio: regexp

    Lapalissianamente, poichè questo hook serve a personalizzare Mutt nel momento in cui entriamo in lettura di una certa mailbox, la condizione che scriviamo in un folder-hook (tramite la regexp) dev'essere rivolta a identificare una o più mailbox.

    Il folder-hook ammette qualsiasi comando/variabile riconosciuti da Mutt.

    Possiamo anche far eseguire più comandi o settare più variabili (mediante più folder-hook applicati allo stesso folder).

    Personalmente utilizzo questo tipo di hook solo per far eseguire un comando (che riporto più avanti), per cui prendo spunto dal semplice esempio riportato nel manuale di Mutt, grazie al quale vediamo come come impostare l'ordinamento dei messaggi per thread per la mailbox denominata mutt, mentre il resto delle mailbox verrà ordinata, secondo la regola di default, in base alla data di invio:

    unhook folder-hook
    folder-hook . set sort=date-sent
    folder-hook mutt set sort=threads


    L'unico folder-hook che utilizzo personalmente è il seguente:

    # per far posizionare il cursore all'ultima entry/messaggio
    # della lista quando si accede ad una mailbox

    folder-hook . 'exec last-entry'


    ^top

    send-hook: settaggi in base al destinatario


    La sintassi del comando send-hook è:

    send-hook pattern comando/variabile

    Regola di default: in testa

    Criterio: pattern

    Possibile default_hook:

    set default_hook="~C %s"

    Se non abbiamo settato la variabile default_hook o anche se preferiamo comunque scrivere le nostre condizioni utilizzando i pattern, tra i disponibili potremo utilizzare quelli che consentono di impostare ricerche su informazioni contenute negli header del messaggio riferite all'indirizzo email del destinatario.


    In un send-hook useremo quindi, tipicamente, questi pattern:
    
    ~t EXPR         messaggio che ha nel campo to: un indirizzo che matcha EXPR
    ~c EXPR messaggio che ha nel campo cc: un indirizzo che matcha EXPR
    ~C EXPR messaggio che ha nel campo to: o cc: un indirizzo che matcha EXPR

    I send-hook sono a mio avviso tra i più utili. Possiamo personalizzare infatti il nostro messaggio in base al destinatario, adeguando in modo opportuno, ad esempio, gli header del messaggio, la signature, l'attribution e la post indent string (ovvero il testo che viene rispettivamente preposto e postposto automaticamente al testo quotato del messaggio a cui si risponde).
    Chi utilizza PGP potrebbe far firmare e cifrare automaticamente il messaggio inviato a certi destinatari.
    Se abbiamo corrispondenza con persone straniere potremmo far modificare la variabile locale.

    Vediamo qualche esempio tratto dal mio .muttrc:

    ## SEND-HOOK (CAMBIO SETTINGS IN BASE AL DESTINATARIO)
    #------------------------------------------------------------------------------
    # con i send-hooks di norma si personalizzano:
    # signature, attribution, headers,

    # resetta i send-hook

    unhook send-hook


    # ------------------------------
    # SEND-HOOK - HEADERS
    # ------------------------------
    # Indicano a Mutt quali header utilizzare se il destinatario
    # e' tra quelli indicati nei pattern

    send-hook . 'my_hdr From: Francesco Ciattaglia <[email protected]>'

    send-hook '~t ^diego_zallocco@provider\.it$'\
    'my_hdr From: Tu amigo Francesco <[email protected]>'



    # -----------------------------------
    # SEND-HOOK - ATTRIBUTION:
    # -----------------------------------
    # Indicano a Mutt il testo da preporre al testo quotato del messaggio
    # cui si risponde. Il testo cambia dal default se si risponde ad un
    # indirizzo che corrisponde al pattern.

    send-hook . 'set attribution = "* %n <%a> [%(%d.%m.%y %H:%M)]:"'

    send-hook '~t ^diego_zallocco@provider\.it$'\
    'set attribution = "* [%(%d.%m.%y %H:%M)]:, il mio caro Diegone ha scritto:"'



    # -----------------------------------------------
    # SEND-HOOK - POST_INDENT_STRING:
    # -----------------------------------------------
    # Indicano a Mutt il testo da postporre al testo quotato del messaggio
    # cui si risponde. Il testo cambia dal default se si risponde ad un
    # indirizzo che corrisponde al pattern.

    send-hook . 'set post_indent_string = "* Ciò letto, correndo `date +%A` `date +%d`\
    `date +%B` `date +%Y`, alle `date +%k` e `date +%M` rispondo così:"'


    send-hook '~t ^diego_zallocco@provider\.it$' 'set post_indent_string = "* Ciò letto,\
    correndo `date +%A` `date +%d` `date +%B` `date +%Y`, alle `date +%k` e\
    `date +%M` io ti rispondo così, mio caro Diegone:"'



    # ---------------------------------
    # SEND-HOOK - SIGNATURE:
    # ---------------------------------
    # Indicano a Mutt quale signature utilizzare nel messaggio in
    # spedizione in base al destinatario.

    send-hook . 'set signature = "sgrotum ~/.sgrotum/signature_ciat5.cfg;\
    sed -e '/^$/d' ~/.signature > ~/.signature2; cat ~/.signature2 |"'


    send-hook mutt-users@mutt\.org\
    'set signature = "sgrotum ~/.sgrotum/signature_ciat4.cfg;\
    sed -e '/^$/d' ~/.signature > ~/.signature2; cat ~/.signature2 |"'


    send-hook slrn-user@lists\.sourceforge\.net\
    'set signature = "sgrotum ~/.sgrotum/signature_ciat4.cfg;\
    sed -e '/^$/d' ~/.signature > ~/.signature2; cat ~/.signature2 |"'



    ^top

    message-hook: settaggi o comandi prima di visualizzare il messaggio


    La sintassi del comando message-hook è:

    message-hook pattern comando/variabile

    Regola di default: in testa

    Criterio: pattern

    Possibile default_hook:

    set default_hook="~L %s | ~C %s"

    Il message-hook viene utilizzato se ci interessa far eseguire dei comandi o impostare delle variabili diverse da quelle definite nel file di configurazione, prima che venga visualizzato il messaggio che risponde al criterio impostato con il pattern.

    Come per il folder-hook, non ho finora avuto esigenze che potevano essere soddisfatte con tale tipo di hook che pertanto non utilizzo.

    Dai tanti esempi disponibili in rete, si nota come il message-hook possa essere utile per, ad esempio:
    1. Cambiare il visualizzatore utilizzato per il messaggio (settando la variabile pager)
    2. Verificare automaticamente le firme PGP "vecchio stile", inserite nel corpo del messaggio come ASCII.
    3. Visualizzare automaticamente, all'apertura del messaggio, una X-Face contenuta negli header (così come proposto da Christoph Berg nel suo sito X-Face Headers and Mutt). Ricordo che nel capitolo sulla lettura messaggi abbiamo proposto un modo alternativo che opera attraverso macro.
    4. Rendere più agevole la lettura di messaggi spediti da client di posta poco rispettosi degli standard (outlook, incredimail, ecc..).

    Vediamo quest'ultimo caso che ci consente anche di utilizzare la variabile display_filter:

    # resetta i message-hook

    unhook message-hook


    # default, resetta il display_filter.

    message-hook . "unset display_filter"

    # Elimina caratteri strani prodotti da mailer Microsoft MUAs e analoghi.
    # nel .muttr tutto su una riga!

    message-hook "~h \"X-Mailer: (Microsoft Outlook IMO|Experian ContactMail)\"" "set display_filter='tr \\\\200\\\\202\\\\221\\\\222\\\\223\\\\224\\\\225\\\\226\\\\227 \\\\244\\\\054\\\\140\\\\047\\\\042\\\\042\\\\052\\\\055\\\\055'"

    # Pulisce la mail spedita tramite Incredimail,
    # rendendola come testo formattato DOS.

    message-hook "~h \"X-Mailer: IncrediMail" "set display_filter='tr -d \\\\r'"


    ^top

    save-hook: settaggio del nome della mailbox proposta con il comando save


    La sintassi del comando save-hook è:

    save-hook pattern filename

    Regola di default: in coda

    Criterio: pattern

    Possibile default_hook:

    set default_hook="~L %s | ~s %s"

    Il save-hook consente di impostare una mailbox particolare che viene proposta da Mutt quando chiediamo di salvare il messaggio.

    Questo hook può essere utile nel caso in cui non si voglia definire una regola di archiviazione automatica per messaggi, ad esempio, provenienti da un certo mittente (tramite mbox-hook che vediamo subito dopo), ma al tempo stesso si voglia avere un settaggio del nome della mailbox diverso dallo standard che viene proposto da Mutt (una mailbox con il nome del mittente). In tal modo:

    1. Se il messaggio ci interessa, dopo averlo letto, potremo spostarlo (premendo s) in una mailbox dedicata e predefinita grazie al save-hook.
    2. Se il messaggio non ci interessa lo cancelliamo (premendo d).
    3. Se il messaggio è meglio non cancellarlo, ma non è nemmeno necessario che venga archiviato nella "sua" mailbox, lasciamo a Mutt il compito di spostarlo nella mailbox standard dei messaggi letti (definita tramite la regola di default degli mbox-hook, oppure, se non utilizziamo gli mbox-hook, tramite la variabile mbox).

    Trovo utile questo hook, ad esempio, per i messaggi che ci vengono spediti periodicamente dai provider di servizi che utilizziamo (spazio web, internet banking, trading on line, ecc...). A volte ci scrivono per informazioni di servizio, come l'interruzione programmata del servizio per manutenzione, altre volte ci inviano informazioni importanti sui settaggi, altre volte ancora ci inviano mera pubblicità. Data l'eterogeneità e la diversa importanza dei messaggi ricevuti è preferibile impostare un save-hook rispetto ad un mbox-hook:

    # resetta i save-hook

    unhook save-hook


    save-hookinternet.bank@banca\.it+banca
    save-hookprovider.web@provider.\it+provider
    save-hook."+Read/read-`date +%Y-%m`"

    ^top

    mbox-hook: settare la mailbox ove spostare automaticamente i messaggi letti


    La sintassi del comando mbox-hook è:

    mbox-hook pattern mailbox

    Regola di default: in coda

    Criterio: pattern

    Possibile default_hook:

    set default_hook="+%s"

    Questo hook rende più flessibile e diversificabile il comportamento di Mutt impostato mediante la variabile mbox, di cui avevamo parlato nel Capitolo dedicato alla Panoramica del programma (per rileggere clicca qui).

    Esso ci consente di spostare automaticamente i messaggi letti e contenuti in una particolare mailbox (individuata mediante il pattern) in un'altra mailbox (specificata sempre con l'hook).

    Lo spostamento viene eseguito da Mutt nel momento in cui si esce dal programma o quando si passa ad un'altra mailbox.

    Poichè Mutt esegue solo il primo hook che matcha la regola è importante pensare bene all'ordine della sequenza di mbox-hook, facendo attenzione a porre in coda la regola di default.

    Poichè chi si decide ad utilizzare Mutt ha con certezza una intelligenza sufficientemente "dinamica" per utilizzare anche Procmail, è probabile che lo utilizzi per fare in modo che i suoi corrispondenti telematici più importanti e ricorrenti abbiano la loro mailbox dedicata della posta in arrivo.

    Allo stesso modo, con mbox-hook possiamo garantire un'archiviazione in loculi, ehm, in mailbox dedicate ai messaggi di queste per noi importanti persone (in pratica salviamo i loro messaggi dalla fossa, ehm archivio, comune!).

    Vediamo qualche esempio tratto dal mio .muttrc:

    # ---------------
    # MBOX-HOOK:
    # ---------------
    # Mailbox in cui salvare i messaggi letti contenuti in una
    # particolare mailbox (bypassa il set mbox)

    # resetta i mbox-hook

    unhook mbox-hook


    # per archiviare i messaggi con familiari letti e non cancellati

    mbox-hook+Friends/francesco+Archive/francesco
    mbox-hook+Friends/Babbo-Mamma+Archive/Babbo-Mamma
    mbox-hook+Friends/Zio+Archive/Zio

    # per archiviare i messaggi con amici letti e non cancellati

    mbox-hook+Friends/zio-Raf+Archive/zio-Raf
    mbox-hook+Friends/Flo+Archive/Flo

    # per archiviare i messaggi delle mailing list letti e non cancellati

    mbox-hook+/Lists/ML-mutt+/Archive/ML-mutt
    mbox-hook+/Lists/ML-slrn+/Archive/ML-slrn

    # per archiviare i messaggi letti contenuti nella mailbox principale

    mbox-hook+inbox"+Read/read-`date +%Y-%m`"

    # per archiviare tutti gli altri messaggi spediti che non matchano una
    # delle regole sopra (la regola di default deve stare in fondo a tutte)

    mbox-hook."+Read/read-`date +%Y-%m`"


    ^top

    fcc-hook: settare la mailbox ove copiare automaticamente i messaggi spediti



    La sintassi del comando fcc-hook è:

    fcc-hook pattern mailbox

    Regola di default: in coda

    Criterio: pattern

    Possibile default_hook:

    set default_hook="~t +%s"

    Questo hook amplia la possibilità garantita dal settaggio della sola variabile record, di cui avevamo sempre parlato nel Capitolo dedicato alla Panoramica del programma (per rileggere clicca qui).

    Esso ci consente di spostare automaticamente i messaggi spediti ad un certo indirizzo in una mailbox specifica e diversa da quella standard definita con la variabile record.

    Facciamo sempre attenzione all'ordine degli hook e a tenere in coda la regola di default.

    Vediamo qualche esempio tratto dal mio .muttrc:

    # --------------
    # FCC-HOOK:
    # --------------
    # Per indicare a Mutt le mailbox in cui spostare una copia
    # dei messaggi spediti verso alcuni indirizzi predefiniti.
    # (questo hook bypassa il set record)
    # A indirizzare anche la posta in entrata proveniente dagli
    # stessi indirizzi nella stessa mailbox è compito di procmail...
    # vedi il mio friends.rc)
    # In tal modo si tiene unito un eventuale thread di messaggi scambiati

    # resetta gli fcc-hook

    unhook fcc-hook


    # dove mettere i messaggi spediti a familiari

    fcc-hook'~t ^francesco\.ciattaglia@qui\.it'+Friends/francesco
    fcc-hook'~t ^giovanni\.ciattaglia@quo\.it'+Friends/Babbo-Mamma
    fcc-hook'~t ^luigi\.ciattaglia@qua\.it'+Friends/Zio

    # dove mettere i messaggi spediti ad amici

    fcc-hook'~t ^rafcast@pippo\.it'+Friends/zio-Raf
    fcc-hook'~t ^floriano\.ferranti@pluto\.it'+Friends/Flo

    # dove mettere i messaggi spediti alla banca on line

    fcc-hook'~t ^internet\.bank@banca\.it'+banca

    # dove mettere tutti gli altri messaggi spediti che non matchano una
    # delle regole sopra (la regola di default deve stare in fondo a tutte)

    fcc-hook.+Sent/sent-`date +%Y-%m`


    ^top

    fcc-save-hook: save-hook e fcc-hook in un unico hook



    La sintassi del comando fcc-save-hook è:

    fcc-save-hook pattern mailbox

    Regola di default: in coda

    Criterio: pattern

    Possibile default_hook:

    set default_hook="~L %s | ~t %s"

    Questo hook unisce in un unico comando save-hook e fcc-hook. L'avrà mai usato qualcuno?



    ^top

    Conclusione

    In questo quinto capitolo abbiamo imparato come:

    1. Predefinire i pattern di default per i vari tipi di hook, mediante la variabile default_hook.
    2. Conoscere la posizione corretta della regola di default per i vari tipi di hook.
    3. Resettare le impostazioni degli hook, mediante il comando unhook.
    4. Definire settaggi specifici in base alla mailbox acceduta in lettura, mediante il folder-hook.
    5. Definire settaggi specifici in base al destinatario del messaggio, mediante il send-hook.
    6. Definire settaggi specifici prima di visualizzare un messaggio, mediante il message-hook.
    7. Definire settaggi particolari della mailbox proposta con il comando save, mediante il save-hook.
    8. Definire settaggi particolari della mailbox ove spostare i messaggi letti, mediante il mbox-hook.
    9. Definire settaggi particolari della mailbox ove copiare i messaggi spediti, mediante il fcc-hook.
    10. Utilizzare un hook (fcc-save-hook) e averne settati due insieme (save-hook e fcc-hook).


    << Capitolo Precedente Prossimo Capitolo >>