Dag Blog - we love

Dag Blog

Come inviare email dal terminale con SSMTP

ssmtp

In questo articolo si mostra come impostare un semplice comando che invia un'email dal terminale. Il suo nome è ssmtp, in combinazione con mailutils.

Quando si realizzano scripts personalizzati o applicazioni custom, spesso nasce la necessità di avere un feedback in caso di errori od eventi particolari. La modalità più semplice per ottenere una notifica è quella di ricevere una email automatizzata dal sistema.

Altre volte, anche solo per comodità, si vuole inviare un email al volo senza dover aprire il proprio editor, esenza dover muoversi con il mouse per impostare tutti i campi.

Tutto questo si può facilmente realizzare con ssmtp. La semplicità di questo comando è quasi imbarazzante.

Per capire quanto sia facile, ecco come si presenta il comando:

echo "questo è il mio messaggio" | mail -s "Oggetto del messaggio" indirizzo@example.com

Ora capiamo come padroneggiare il comando, come installarlo su linux, ed i vari casi di utilizzo. In particolare, gli scenari più comuni sono:

  • utilizzato con un pipe | per reindirizzare lo stdout in uscita da un comando o da uno script.

  • incorporarlo in una propria app, creando un template del messaggio da riempire con i campi desiderati, e poi inviarlo, ad esempio con una funzione o metodo integrato nel software.

  • comporre il messaggio, come consueto, ma utilizzando il terminale (super nerdy way....).

Installazione su linux

A titolo di esempio è stata scelta la distibuzione UBUNTU, ma la procedura di installazione è simile per tutte le distribuzioni GNU/Linux, con i rispettivi package manager.

# aggiorna la lista dei packages e delle versioni
apt update

# installazione dei comandi necessari
apt install ssmtp mailutils

Configurazione delle credenziali

La prima operazione da effettuare una volta installato il comando è la configurazione delle credenziali. Questi dati sono necessari per identificare l'indirizzo del mittente ed il server con cui inviare l'email.

Le credenziali sono salvate in un file che può essere editato cn qualsiasi editor, che possiamo trovare in /etc/ssmtp/ssmtp.conf.

Il file è commentato ed le opzioni sono descritte in modo chiaro. Si tratta di sostituire i valori di alcuni parametri per potermi pesonalizzare con quelli del proprio account di posta

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=user@my_domain.com

# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=mail.my_domain.it:587

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
hostname=my_domain.com

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

# Other options
UseTLS=YES
UseSTARTTLS=YES
AuthMethod=LOGIN

# Account info
AuthUser=user@my_domain.com
AuthPass=mysupersecretpassword

Di seguito un esempio per la configurazion con un account di posta di gmail.

root=nome_account@gmail.com
mailhub=smtp.gmail.com:587
hostname=gmail.com
FromLineOverride=YES
UseTLS=YES
UseSTARTTLS=YES
AuthMethod=LOGIN
AuthUser=nome_account@gmail.com

# non è sicuro usare la propria password personale.
# La password deve essere generata dall'account Gmail 
# nella sezione "Password per le app". 
AuthPass=********************* 

Questo file contiene le informazioni personali del vostro account di posta, tra cui la password. Deve essere protetto per impedire che le credenziali vengano esposte.

Un metodo è cambiare i permessi di lettura e scrittura usando il comando:

chmod 640 /etc/ssmtp/ssmtp.conf

Utilizzo del comando (come inviare un email)

1 - Metodo interattivo

Per utilizzare in modo interattivo questo strumento, si parte inserendo il comando seguito dall'indirizzo del destinatario:

ssmtp lukeskywalker@tatooine-mail.com  

A questo punto il programma chiederà di inserire le informazioni del messaggio. Premere invio e digitare:

To: lukeskywalker@tatooine-mail.com

Premere di nuovo invio ed inserire l'oggetto del messaggio:

Subject: May the force be with you

La terza riga e le successive sono dedicate al test del messaggio. Per inviare l'email digitare la combinazione tasti Ctrl+D.

2 - Utilizzare un template

Questo è il metodo più ordinato, dove sia le intestazioni , sia il corpo della email possono essere preparate in un file di testo separato. È idoneo per messaggi lunghi su più linee, che possono essere correti e rivisti prima dell'invio.

Per prima cosa si deve preparare il file di testo, rispettando la seguente forma. (ATTENZIONE: Subject e corpo del messaggio deve esseci necessariamente una riga vuota).

From: mittente@example.com
To: destinatario@dominio.it
Subject: oggetto della mail

Corpo della mail, anche su più linee.

Per l'invio vero e proprio si utilizzi il seguente comando:

ssmtp destinatario@domain.com < nome_file.txt 

3 - Invio da riga di comando (o da stdout)

Questo metodo è utile per inviare messaggi automatici provenienti da altre applicazioni, per esempio messaggi di errore o log importanti (tipico è l'esecuzoione periodica di backup) inviati tramite uno script della shell.

È anche il metodo più veloce perchè può essere eseguito in una riga singola della shell.

echo "questo è il mio messaggio" | mail -s "Oggetto del messaggio" indirizzo@example.com

A titolo di esempio si riporta un estratto di uno script che in caso di errore, invia la mail:

rsync -avh ~/src/ ~/dest/
exit_code=$?

if [ ${exit_code} -gt 0 ]; then
    echo "$(date -Iseconds) - ERROR - attenzione alcuni errori durante l'esecuzione del backup." | mail -s "Error during backup" mdognini@eurokemical.it
fi