Mutt è un client email che si utilizza da terminale.

Installazione§

# Su Arch
$ sudo pacman -S mutt

# Su Debian/Ubuntu
$ sudo apt install mutt

È disponibile un po' dappertutto, comunque (il nome è sempre quello).

Assocciare a casella Gmail§

Ormai evito di utilizzare il servizio mail di Big G.

Gmail, purtroppo, blocca l'accesso alle app non Google per motivi di sicurezza, ma ci permette di superare il problema attraverso un piccolo procedimento.

Accedere al proprio account Google attraverso questo link, dopodiché aprire la sezione sicurezza ed abilitare l'autenticazione a due fattori. Questa consiste nell'associare alla mail un numero di telefono: come già avviene con altre app (come Telegram), ogni accesso all'account Google sarà seguito dall'invio di un codice di accesso a sei cifre che ci consentirà di garantire la nostra identità.

A questo punto, sempre nella sezione sicurezza, apparirà la sottosezione "Password per le app", che è proprio quello che fa al caso nostro, dato che vogliamo associare Mutt. Abilitiamo questa funzione e clicchiamo su "Genera", così Google genererà per noi una password di 16 caratteri specifica per l'app in questione. Scriviamocela da qualche parte, perché bisogna copiare ed incollare questi sedici caratteri nel file di configurazione di Mutt, cioè ~/.muttrc. Quest'ultimo, però, dobbiamo prima crearlo.

Apriamo il terminale:

$ nano ~/.muttr

Incollare il seguente testo:

#======================================================#
# USER VARIABLES
set my_name = "Name Surname"
set my_username = "user.name"
set my_address = "user.name@gmail.com"
set my_password = "my-password"

#======================================================#
# Boring details
set realname = $my_name
set from = $my_address
set use_from = yes
set envelope_from = "yes"
set sendmail="/usr/bin/msmtp"

# If not set in environment variables:
set spoolfile = "+INBOX"

#======================================================#
# FOLDERS
set folder="~/Mail"                # Mailboxes in here
set record="+sent"                 # where to store sent messages
set postponed="+postponed"         # where to store draft messages
set move=no                        # Don't move mail from the spool.

#======================================================#
# Watch these mailboxes for new mail:
mailboxes ! +Fetchmail +slrn +mutt
set sort_browser=alpha    # Sort mailboxes by alpha(bet)

#======================================================#
# EDITOR
# Vim or Nano (default)?
# Uncomment the following for nano:
set editor = "nano"
# Uncomment the following for vim:
# set editor="vim -c 'set tw=70 et' '+/^$' "
# See the headers when editing:
set edit_headers 
# Set charset as utf-8 in order to avoid problems; change only if you know what you're doing.
set charset = "utf-8"

# IMAP
set imap_user = "$my_address"
set imap_pass = "$my_password"
set folder    = "imaps://imap.gmail.com/"

set ssl_force_tls = yes

# Store message headers locally to speed things up.
# If hcache is a folder, Mutt will create sub cache folders for each account which may speeds things up even more.
set header_cache = ~/.cache/mutt

# Store messages locally to speed things up, like searching message bodies.
# Can be the same folder as header_cache.
# This will cost important disk usage according to your e-mail amount.
set message_cachedir = "~/.cache/mutt"

# Specify where to save and/or look for postponed messages.
set postponed = +[Gmail]/Drafts

# Allow Mutt to open a new IMAP connection automatically.
unset imap_passive

# Keep the IMAP connection alive by polling intermittently (time in seconds).
set imap_keepalive = 300

# How often to check for new mail (time in seconds).
set mail_check = 120

#======================================================#
# SMTP
set smtp_url = "smtps://$my_username@gmail.com@smtp.gmail.com:465/"
set smtp_pass = "$my_password"

#======================================================#
# Odds and ends
set markers          # mark wrapped lines of text in the pager with a +
set smart_wrap       # Don't wrap mid-word
set pager_context=5  # Retain 5 lines of previous page when scrolling.
set status_on_top    # Status bar on top.
push <show-version>  # Shows mutt version at startup

Sostituire nei rispettivi campi iniziali (dove ho scritto USER VARIABLES) nome e cognome, username e password (inserendo quella appena generata). Ci sono sicuramente miriadi di opzioni in più che possono essere aggiunte e migliorie varie da apportare a questo livello, ma per il momento andiamo avanti. Successivamente, sarete liberi di cercare altrove la configurazione che più fa per voi.

Apriamo mutt da terminale:

$ mutt

A questo punto il software dovrebbe effettuare l'accesso con successo e mostrarvi le mail.

Ma non tutti sono così fortunati, io ad esempio no, infatti ho ottenuto il seguente errore \<cartella> No such file or directory (errno = 2). In effetti, il problema potrebbe essere dato dall'assenza del file indicato, la cui creazione magari richiede i permessi da amministratore. La soluzione è in breve la seguente:

$ sudo touch <file>

Ma a che serve questo file? Si tratta della mailbox di mutt, cioè del luogo in cui il programma conserva tutte le informazioni relative alle mail. Mutt non utilizza, infatti, un complesso database per la gestione dei dati, ma un file1 (che qualcuno definirebbe "flat") nel quale va ad aggiungere via via i dati necessari attraverso un semplice append. Se l'obiettivo era di mantenere le cose semplici, gli sviluppatori ci sono riusciti alla grandissima e si sono mantenuti molto sul semplice.

Operazioni facoltative§

Volendo, possiamo direttamente aggiungere delle shortcut in stile Gmail, per facilitarci la navigazione via tastiera. Questo si fa modificando lo stesso file di configurazione di prima, cioè muttrc. Propongo le seguenti, che sono state prese da questo gist:

#======================================================#
# Gmail-like keyboard shortcuts
macro index,pager ga "<change-folder>=[Gmail]/All<tab><enter>" "Go to all mail"
macro index,pager gi "<change-folder>=INBOX<enter>" "Go to inbox"
macro index,pager gs "<change-folder>=[Gmail]/Starred<enter>" "Go to starred messages"
macro index,pager gd "<change-folder>=[Gmail]/Drafts<enter>" "Go to drafts"
# The following is different from Gmail, but wanted to keep "y" to show folders:
macro index,pager e "<enter-command>unset trash\n <delete-message>" "Gmail archive message"

Mi si presenta un nuovo errore: Error sending message, child exited 127 (Exec error.), ma non è più un problema di configurazione. Come risolvere? Su stackoverflow consigliano di lanciare:

$ sudo apt-get install sendmail

Installato questo pacchetto, dovreste essere a posto. A me ha funzionato. In generale, però, sconsiglio di usare il terminale per inviare le mail, dato che mi pare di capire sia più elevata la probabilità che finiscano nello spam.

Comandi Mutt§

^B                                           M <enter-command> set my_pipe_decode=$pipe_decode pi... call urlview to extract URLs out of a message
^D                                           delete-thread                                           cancella tutti i messaggi nel thread
^E                                           edit-type                                               modifica il tipo di allegato
^F                                           forget-passphrase                                       cancella la/le passphrase dalla memoria
<Tab>                                        next-new-then-unread                                    salta al successivo messaggio nuovo o non letto
<Return>                                     display-message                                         visualizza un messaggio
^K                                           extract-keys                                            estra le chiavi pubbliche PGP
^N                                           next-thread                                             salta al thread successivo
^P                                           previous-thread                                         salta al thread precedente
^R                                           read-thread                                             segna il thread corrente come già letto
^T                                           untag-pattern                                           togli il segno ai messaggi corrispondenti al modello
^U                                           undelete-thread                                         de-cancella tutti i messaggi nel thread
<Esc><Tab>                                   previous-new-then-unread                                salta al precedente messaggio nuovo o non letto
<Esc>C                                       decode-copy                                             fai una copia decodificata (text/plain)
<Esc>P                                       check-traditional-pgp                                   controlla firma PGP tradizionale
<Esc>V                                       collapse-all                                            (de)comprimi tutti i thread
<Esc>b                                       M <search>~b                                            search in message bodies
<Esc>c                                       change-folder-readonly                                  apri un altro folder in sola lettura
<Esc>d                                       delete-subthread                                        cancella tutti i messaggi nel subthread
<Esc>e                                       resend-message                                          usa il messaggio corrente come modello per uno nuovo
<Esc>k                                       mail-key                                                spedisci una chiave pubblica PGP
<Esc>l                                       show-limit                                              mostra il modello limitatore attivo
<Esc>n                                       next-subthread                                          salta al subthread successivo
<Esc>p                                       previous-subthread                                      salta al thread seguente
<Esc>r                                       read-subthread                                          segna il subthread corrente come già letto
<Esc>s                                       decode-save                                             fai una copia decodificata (text/plain) e cancellalo
<Esc>t                                       tag-thread                                              segna il thread corrente
<Esc>u                                       undelete-subthread                                      de-cancella tutti i messaggi nel subthread
<Esc>v                                       collapse-thread                                         (de)comprimi il thread corrente
<Space>                                      display-message                                         visualizza un messaggio
#                                            break-thread                                            dividi il thread in due parti
$                                            sync-mailbox                                            salva i cambiamenti nella mailbox
%                                            toggle-write                                            (dis)attiva se la mailbox sarà riscritta
&                                            link-threads                                            collega il messaggio segnato con quello attuale
.                                            buffy-list                                              elenca le mailbox con nuova posta
@                                            display-address                                         visualizza l'indirizzo completo del mittente
C                                            copy-message                                            copia un messaggio in un file/mailbox
D                                            delete-pattern                                          cancella i messaggi corrispondenti al modello
F                                            flag-message                                            (dis)attiva il flag 'importante' del messaggio
G                                            fetch-mail                                              recupera la posta dal server POP
J                                            next-entry                                              spostati alla voce successiva
K                                            previous-entry                                          spostati alla voce precedente
L                                            list-reply                                              rispondi alla mailing list indicata
N                                            toggle-new                                              (dis)attiva il flag 'nuovo' di un messaggio
O                                            sort-reverse                                            ordina i messaggi in ordine inverso
P                                            parent-message                                          salta al messaggio padre nel thread
Q                                            query                                                   chiedi gli indirizzi a un programma esterno
R                                            recall-message                                          richiama un messaggio rimandato
T                                            tag-pattern                                             segna i messaggi corrispondenti al modello
U                                            undelete-pattern                                        de-cancella i messaggi corrispondenti al modello
P                                            parent-message                                          salta al messaggio padre nel thread
Q                                            query                                                   chiedi gli indirizzi a un programma esterno
R                                            recall-message                                          richiama un messaggio rimandato
T                                            tag-pattern                                             segna i messaggi corrispondenti al modello
U                                            undelete-pattern                                        de-cancella i messaggi corrispondenti al modello
V                                            show-version                                            mostra il numero di versione e la data di Mutt
W                                            clear-flag                                              cancella il flag di stato da un messaggio
Y                                            edit-label                                              add, change, or delete a message's label
a                                            create-alias                                            crea un alias dal mittente del messaggio
b                                            bounce-message                                          rispedisci un messaggio a un altro utente
c                                            change-folder                                           apri un altro folder
d                                            delete-message                                          cancella la voce corrente
e                                            M <enter-command>unset trash\n <delete-message>         Gmail archive message
f                                            forward-message                                         inoltra un messaggio con i commenti
ga                                           M <change-folder>=[Gmail]/All<tab><enter>               Go to all mail
gd                                           M <change-folder>=[Gmail]/Drafts<enter>                 Go to drafts
gi                                           M <change-folder>=INBOX<enter>                          Go to inbox
gs                                           M <change-folder>=[Gmail]/Starred<enter>                Go to starred messages
h                                            display-toggle-weed                                     visualizza il messaggio e (dis)attiva la rimozione degli header
j                                            next-undeleted                                          salta al messaggio de-cancellato successivo
k                                            previous-undeleted                                      salta al precedente messaggio de-cancellato
l                                            limit                                                   mostra solo i messaggi corrispondenti al modello
m                                            mail                                                    componi un nuovo messaggio
o                                            sort-mailbox                                            ordina i messaggi
p                                            print-message                                           stampa la voce corrente
q                                            quit                                                    salva i cambiamenti alla mailbox ed esci
r                                            reply                                                   rispondi a un messaggio
s                                            save-message                                            salva messaggio/allegato in una mailbox/file
u                                            undelete-message                                        de-cancella la voce corrente
v                                            view-attachments                                        mostra gli allegati MIME
w                                            set-flag                                                imposta un flag di stato su un messaggio
x                                            exit                                                    esci da questo menù
y                                            browse-mailboxes                                        select a new mailbox from the browser
|                                            pipe-message                                            manda un messaggio/allegato a un comando della shell con una pipe
~                                            mark-message                                            create a hotkey macro for the current message
<Down>                                       next-undeleted                                          salta al messaggio de-cancellato successivo
<Up>                                         previous-undeleted                                      salta al precedente messaggio de-cancellato
<Enter>                                      display-message                                         visualizza un messaggio

Assegnazioni generiche:

<Return>                                     select-entry                                            seleziona la voce corrente
^L                                           refresh                                                 cancella e ridisegna lo schermo
<Esc>/                                       search-reverse                                          cerca all'indietro una espressione regolare
!                                            shell-escape                                            esegui un comando in una subshell
*                                            last-entry                                              spostati all'ultima voce
/                                            search                                                  cerca una espressione regolare
1                                            jump                                                    salta a un numero dell'indice
2                                            jump                                                    salta a un numero dell'indice
3                                            jump                                                    salta a un numero dell'indice
4                                            jump                                                    salta a un numero dell'indice
5                                            jump                                                    salta a un numero dell'indice
6                                            jump                                                    salta a un numero dell'indice
7                                            jump                                                    salta a un numero dell'indice
8                                            jump                                                    salta a un numero dell'indice
9                                            jump                                                    salta a un numero dell'indice
:                                            enter-command                                           inserisci un comando di muttrc
;                                            tag-prefix                                              applica la funzione successiva ai messaggi segnati
<                                            previous-line                                           spostati in alto di una riga
=                                            first-entry                                             spostati alla prima voce
>                                            next-line                                               spostati una riga in basso
?                                            help                                                    questo schermo
H                                            top-page                                                spostati all'inizio della pagina
L                                            bottom-page                                             spostati in fondo alla pagina
M                                            middle-page                                             spostati in mezzo alla pagina
Z                                            previous-page                                           spostati alla pagina precedente
[                                            half-up                                                 sposta verso l'alto di 1/2 pagina
]                                            half-down                                               sposta verso il basso di 1/2 pagina
j                                            next-entry                                              spostati alla voce successiva
k                                            previous-entry                                          spostati alla voce precedente
n                                            search-next                                             cerca la successiva corrispondenza
q                                            exit                                                    esci da questo menù
t                                            tag-entry                                               segna la voce corrente
z                                            next-page                                               spostati alla pagina successiva
<Down>                                       next-entry                                              spostati alla voce successiva
<Up>                                         previous-entry                                          spostati alla voce precedente
<Left>                                       previous-page                                           spostati alla pagina precedente
<Right>                                      next-page                                               spostati alla pagina successiva
<Home>                                       first-entry                                             spostati alla prima voce
<F1>                                         M <shell-escape> zcat /usr/share/doc/mutt/manual.txt... show Mutt documentation
<PageDown>                                   next-page                                               spostati alla pagina successiva
<PageUp>                                     previous-page                                           spostati alla pagina precedente
<Enter>                                      select-entry                                            seleziona la voce corrente
<End>                                        last-entry                                              spostati all'ultima voce

Funzioni non assegnate:

browse-mailboxes-readonly                                                                            select a new mailbox from the browser in read only mode
next-unread-mailbox                                                                                  apri la mailbox successiva con nuova posta
compose-to-sender                                                                                    compose new message to the current message sender
edit                                                                                                 modifica il messaggio grezzo
group-chat-reply                                                                                     reply to all recipients preserving To/Cc
group-reply                                                                                          rispondi a tutti i destinatari
imap-fetch-mail                                                                                      recupera la posta dal server IMAP
imap-logout-all                                                                                      termina la sessione con tutti i server IMAP
edit                                                                                                 modifica il messaggio grezzo
group-chat-reply                                                                                     reply to all recipients preserving To/Cc
group-reply                                                                                          rispondi a tutti i destinatari
imap-fetch-mail                                                                                      recupera la posta dal server IMAP
imap-logout-all                                                                                      termina la sessione con tutti i server IMAP
purge-message                                                                                        delete the current entry, bypassing the trash folder
tag-subthread                                                                                        segna il subthread corrente
next-new                                                                                             salta al successivo nuovo messaggio
previous-new                                                                                         salta al precedente messaggio nuovo
next-unread                                                                                          salta al successivo messaggio non letto
previous-unread                                                                                      salta al precedente messaggio non letto
root-message                                                                                         jump to root message in thread
decrypt-copy                                                                                         fai una copia decodificata
decrypt-save                                                                                         fai una copia decodificata e cancellalo
sidebar-next                                                                                         move the highlight to next mailbox
sidebar-next-new                                                                                     move the highlight to next mailbox with new mail
sidebar-open                                                                                         open highlighted mailbox
sidebar-page-down                                                                                    scroll the sidebar down 1 page
sidebar-page-up                                                                                      scroll the sidebar up 1 page
sidebar-prev                                                                                         move the highlight to previous mailbox
sidebar-prev-new                                                                                     move the highlight to previous mailbox with new mail
sidebar-toggle-visible                                                                               make the sidebar (in)visible
tag-prefix-cond                                                                                      applica la successiva funzione SOLO ai messaggi segnati
end-cond                                                                                             fine dell'esecuzione condizionata (noop)
search-opposite                                                                                      cerca la successiva corrispondenza nella direzione opposta
current-top                                                                                          muovi la voce all'inizio dello schermo
current-middle                                                                                       muovi al voce in mezzo allo schermo
current-bottom                                                                                       muovi la voce in fondo allo schermo
error-history                                                                                        display recent history of error messages
what-key                                                                                             mostra il keycode per un tasto premuto
check-stats                                                                                          calculate message statistics for all mailboxes

Sincronizzare le mail offline§

Per sincronizzare le mail in remoto con dei file in locale, possiamo usare offlineimap. In caso aveste problemi ad interfacciarvi con le mail direttamente seguendo la procedura sopra, questa operazione potrebbe risolvervi il problema senza farvi sbattere troppo.

$ sudo apt-get install offlineimap

Offlineimap funziona molto bene con Gmail, quindi fa al caso nostro. Per gestire quest'altro software, abbiamo giustamente bisogno di un altro file di configurazione, ~/.offlineimaprc:

[general]
ui=Curses.Blinkenlights
accounts = private

[Account private]
localrepository = hs-Local
remoterepository = hs-Remote

[Repository hs-Local]
type = Maildir
localfolders = ~/.mail/private

[Repository hs-Remote]
type = Gmail
remoteuser = yourusername
remotepass = yourpassword
realdelete = no

nametrans = lambda folder: re.sub('.*Spam$', 'spam',
	re.sub('.*Bozze$', 'drafts',
  re.sub('.*Importanti$', 'essentials',
    re.sub('.*inviata$', 'sent',
	re.sub('.*Speciali$', 'flagged',
    re.sub('.*Cestino$', 'trash',
	re.sub('.*Tutti i messaggi$', 'archive', folder)))))))

Leggere agevolmente l'HTML§

La maggior parte delle mail oggi sono (purtroppo) pensate con tonnellate di codice HTML/CSS + immagini e scriptini vari (che il più delle volte vengono bloccati dal client, rendendo l'esperienza tutt'altro che piacevole). Come facciamo a leggerle da terminale? Ci aiuta LYNX, uno dei più vecchi (se non il più vecchio) browser in circolazione, in grado di leggere l'html in forma puramente testuale, formattando il testo in maniera molto comprensibile ed ancora utilizzato in certe nicchie d'utenza (es. non vedenti). L'idea è far fare il lavoro sporco a lynx (ma potremmo impiegare anche links o w3m, che fanno più o meno la stessa cosa).

Installiamo lynx:

$ sudo apt-get install lynx

A questo punto creiamo un altro file (è l'ultimo, prometto):

$ sudo touch .mailcap

Ed incolliamo il seguente testo:

text/html;                      lynx %s; nametemplate=%s.html
text/html;                      lynx -dump %s; nametemplate=%s.html; copiousoutput

Sostituite lynx al browser che preferite, in caso vogliate utilizzare links, w3m o qualcos'altro.

Torniamo su .muttrc ed aggiungiamo questa riga (un po' dove ci pare):

auto_view text/html

A questo punto lanciamo mutt ed esploriamo le email raccolte. Buon divertimento a tutti.

1

https://www.bigbrus.com/2015/01/31/mutt-error-folder-is-not-mailbox/