Appunti su Gentoo Linux.
Inviare email con msmtp

Non parlerò di come gestire la mail da riga di comando. Qui voglio solo parlare della maniera più semplice di inviare mail da riga di comando. Voi direte: a che serve? Be' questa cosa è molto importante perché spesso un amministratore vuole far in modo che automaticamente i suoi server gli mandino una mail se qualcosa va storto. Molti programmi hanno questa funzionalità, per esempio i vari demoni cron.

I demoni cron se configurati opportunamente, inviano una mail all'indirizzo specificato, riportando il problema. Tutti questi software danno per scontato che sul PC sia già installato un programma in grado di inviare mail (un MTA, Mail Transfer Agent), in particolare tutti si aspettano di trovare a disposizione il comando sendmail (purtroppo questa cosa non sta scritta da nessuna parte!!!).

Però sendmail è un casino e ha gravi problemi di sicurezza. Per questo motivo sono nati nel corso degli anni degli emulatori di sendmail che sono molto più semplici da configurare. Gentoo installa il pacchetto virtuale virtual/mta e di default questo significa installare sSMTP. Viene poi creato un link simbolico a ssmtp chiamato sendmail in modo che i programmi non abbiamo alcun problema. Questo link viene creato per qualsiasi altro mta venga installato, pertanto si capisce che se ne può avere installato solo uno alla volta sulla stessa macchina.

Un'ultima precisazione. Un MTA è solo un "trasferitore", come dice l'acronimo. Questo significa che non permette delle automazioni particolari nel comporre l'email. In pratica se volete mandare una mail con del codice HTML oppure volete mandare una mail con un allegato, non potete farlo solo con un MTA, a meno che scriviate a mano il codice necessario. La preparazione della email viene fatta solitamente da un MUA (Mail User Agent) che ha anche la funzionalità di lettura delle email, ma non del loro download in locale. Il MUA dopo aver composto la email, la passa al MTA per spedirla.

Tra i MTA più moderni, potenti ma allo stesso tempo leggeri c'è msmtp di cui parlerò in questa pagina. Come abbiamo visto sopra, il default di Gentoo è ssmtp, un altro sendmail replacement che viene spesso utilizzato ma che non è manutenuto da tempo ed è anche un po' oscuro sotto certi aspetti. Invece tra i MUA a riga di comando troviamo il famosissimo mutt. In questa pagina parlerò solo di mSMTP.

Installazione e configurazione

Come dicevamo, un MTA è solitamente già installato in Gentoo perché molti programmi richiedono un MTA come dipendenza. Solitamente viene installato ssmtp. Per installare msmtp date il comando

emerge -pv msmtp

Il file di configurazione globale è /etc/msmtprc mentre il file di configurazione per utente è /home/<utente>/.msmtprc. L'ordine di precedenza è il solito: 1. opzioni da riga di comando; 2. impostazioni locali; 3. impostazioni globali. Degli esempi si trovano nella documentazione ufficiale e nella directory /usr/share/doc/msmtp.

Ecco un esempio di file di configurazione per un server smtp "normale".

# Set default values for all following accounts.
defaults

# A Wind-Infostrada-Libero address
account libero
host smtp.libero.it
from pippo.pluto@libero.it
auth on
user pippo.pluto
password <password>

# A gmail address
account        gmail
host           smtp.gmail.com
port           587
from           username@gmail.com
user           username@gmail.com
password       <password>

# Set a default account
account default: libero

I file di configurazione utente devono avere i permessi 600 altrimenti msmtp si rifiuterà di funzionare.

chmod 600 ~/.msmtprc

Se avete delle password nel file globale allora dovete far sì che sia non leggibile dagli utenti!

chmod 600 /etc/msmtprc

Il file di configurazione globale è utile quando si vuole usare msmtp per inviare mail di sistema. In generale, settando a 600 i permessi sul file globale, gli utenti non vedranno il file di configurazione e pertanto non potranno usare gli account lì definiti. Se vorranno mandare mail dovranno crearsi il loro file di configurazione nella propria home.

Le password non sono obbligatorie. Purché ci sia auth on, msmtp va a cercare la password nel file netrc globale o della propria home. Se non lo trova chiede di inserire la passoword nel terminale.

Ricordiamo che per funzionare msmtp ha bisogno di una connessione a internet. Se la connessione non è presente al momento dell'invio, si ha un errore e il mancato invio della mail. Esistono degli script distribuiti con msmtp che implementano la coda di invio in msmtp ma per ora non ne parleremo (msmtpq e msmtpQ).

Finora abbiamo parlato di utenti che per mandare mail devono crearsi il proprio file di configurazione di msmtp. Cosa dire degli utenti di sistema, cioè quelli usati dai vari processi o demoni di Linux? Possono mandare email?

Inviare mail

Ora i programmi sapranno come mandare le mail, e quindi quest'ultime non adranno più a finire nei famosi file dead.letter delle nostre home. Però se volete fare dei tentativi a mano anche per vedere se avete configurato bene il tutto ora vi spiego come mandare una mail.

msmtp <indirizzo>

Date invio e cominciate a scrivere:

> From: Pippo Pluto <pippo.pluto@topolinia.it>
> To: Paperon de Paperoni <paperon.depaperoni@topolinia.it>
> Subject: Questa è una mail di prova!
> (questa riga bianca è fondamentale)
> Ecco un po' di testo senza senso!
> Ciao ciao.
> Fra
> <PREMERE CTRL-D PER TERMINARE L'INSERIMENTO E INVIARE LA MAIL

I campi From, To e Subject sono tutti opzionali. Purtroppo non c'è un modo banale per impostare automaticamente il campo From a seconda dell'account usato. Se non si specifica From, chi riceverà la mail leggerà qualcosa come "derived from envelope by postmaster@outrelay08.libero.it" e poi a seguire l'indirizzo email usato per accedere all'SMTP. L'opzione --from da riga di comando o la corrispondente voce "from" nel file di configurazione servono proprio per specificare il cosiddetto "envelope from" ma in pratica possono essere sempre e solo impostate a un valore uguale all'user o alla mail usati per autenticarsi nel server SMTP. Anche l'opzione --auto-from, se abilitata, imposta il --from al vostro utente del PC, ma questo comporta che l'email non verrà più inviata perché non riuscirete a loggarvi al vostro server SMTP.

L'unica soluzione quindi è mettere nel file .msmtprc, per ogni account, il campo from uguale alla mail che usate per loggarvi nel server SMTP. Se non lo specificate msmtp lo creerà da solo ma quel valore non piacerà al vostro server SMTP... Se usate sempre e solo un account nel file .msmtprc allora potete anche crearvi uno script che imposti come predefinito il campo From. Così facendo però tale script potrà essere solo usato a livello locale. Lo script qua sotto è stato fatto per un singolo utente. Nel tempo cercherò di modificarlo in modo tale che inserisca automaticamente le vostre informazioni nel campo From.

Ecco uno script interessante (salvatelo con un nome a piacere, per esempio mail, e rendetelo eseguibile). Attualmente supporta solo l'account di default impostato in .msmtprc.

#!/bin/bash
CURDATE=`date +'%d %B %Y'`
CURTIME=`date +'%H:%M'`

help () {
        echo "Usage:"
        echo "   $(basename $0) -r email@address -s 'subject' -t 'text'"
        echo " or"
        echo "   $(basename $0) -r email@address -s 'subject' -f filename"
        echo "Options:"
        echo " -r   specify recipient email addresses (required)"
        echo " -cc  specify cc recipient email addresses"
        echo " -bcc specify bcc recipient email addresses"
        echo " -s   specify the email subject (required)"
        echo " -t   specify the body of the email"
        echo " -f   specify the body of the email by an input file"
        echo " -h   show this help"
        return 0
}

while getopts ":r:cc:bcc:s:t:f:h" OPTION; do
        case $OPTION in
                r)
                        EMAIL=$OPTARG
                        ;;
                cc)
                        CCEMAIL=$OPTARG
                        ;;
                bcc)
                        BCCEMAIL=$OPTARG
                        ;;
                s)
                        SUBJECT=$OPTARG
                        ;;
                t)
                        TEXT=$OPTARG
                        ;;
                f)
                        TEXT=`cat $OPTARG`
                        ;;
                h)
                        help
                        exit 0
                        ;;
#               *)
#                       echo "Command Line Option Not Valid or Missing Argument"
#                       help
#                       exit 1
#                       ;;
                \?)
                        echo "Invalid option: -$OPTARG"
                        help
                        exit 1
                        ;;
                :)
                        echo "Option -$OPTARG requires an argument"
                        help
                        exit 1
                        ;;
        esac
done

if [[ $#-2 -lt 2 ]]
        then
                help
                exit 1
fi

# Inserire un'opzione account per scegliere l'account
# nel file .msmtprc o /etc/msmtprc. Una volta saputo
# l'account (se non specifito corrisponde al default),
# bisogna estrarre il campo from o il campo user da
# quell'account e salvarlo nella variabile $FROM

msmtp -t << EOF
# From: $FROM
To: $EMAIL
Cc: $CCEMAIL
Bcc: $BCCEMAIL
Subject: $SUBJECT

$TEXT

$CURDATE $CURTIME

EOF

Si usa così:

mail -r pippo@pippo.it -s 'oggetto' -t 'testo del messaggio!'

oppure così

mail -r pippo@pippo.it -s 'oggetto' -f filename