Inviare e-mail da terminale con sSMTP

Tempo fa ho avuto la necessità di integrare, in vari script, un comando che inviasse un paio di e-mail.
Pensavo di dover creare un server MAIL, ma in Linux di solito un'operazione si può fare in diversi modi. Dopo qualche ricerca ho trovato un bel pacchetto che faceva al caso mio per la sua semplicità e leggerezza, in fondo dovevo solo inviarmi una mail: trattavasi di "sSMTP".
Non è un demone, quindi non consuma costantemente risorse, viene chiamato in causa solo all'occorrenza.
Basta installare il pacchetto, configurarlo collegandolo ad un server e-mail esistente (io ho utilizzato la mia e-mail di Google) e lanciare il comando in modo corretto.

Installiazione del pacchetto

sudo apt-get install ssmtp

Volendo si può installare anche il pacchetto mailutils che è un'infrastruttura ricca e potente per posta: contiene una serie di utili librerie, client e server di posta.

Poi dobbiamo configurare il pacchetto appena installato, quindi modifichiamo il file /etc/ssmtp/ssmtp.conf.
Questo file di configurazione non ha bisogno di tante spiegazioni, basta leggere i commenti e si intuisce subito, in ogni caso ecco il mio file (ovviamente modificato oscurando i dati sensibili).

 

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
utente1=Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.


# 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=[smtp.gmail.com]:587

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

# The full hostname
hostname=nome-host

# 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

# Per Gmail aggiungere queste righe
UseSTARTTLS=YES
UseTLS=YES
AuthMethod=LOGIN

# If you have to login set these:
AuthUser=Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
AuthPass=propria-password-mail

 

Ed ora un po' di spiegazioni:

root=Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
utente1=Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.

sono i rispettivi indirizzi e-mail degli utenti, in questo modo quando il sistema dovrà inviare e-mail di notifica (di solito a root) troverà i rispettivi indirizzi e li userà.

mailhub=[smtp.gmail.com]:587

è la corretta configurazione per utilizzare il server smtp di Google.

FromLineOverride=YES

serve per poter personalizzare il campo "From" al momento dell'invio della mail.

Ora si devono aggiungere gli alias al file /etc/ssmtp/revaliases.
Il file avrà un aspetto del genere:

# sSMTP aliases
#
# Format:    local_account:outgoing_address:mailhub
#
# Example: root:Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.:mailhub.your.domain[:port]
# where [:port] is an optional port number that defaults to 25.

root:indirizzo-mail:smtp.gmail.com:587
user1:indirizzo-mail:smtp.gmail.com:587
user2:indirizzo-mail:smtp.gmail.com:587


Andranno inseriti praticamente gli utenti che si vuole autorizzare all'utilizzo del servizio ssmtp, il relativo server smtp prescelto e la porta se diversa da quella di default (25).
Ovviamente se non si usa gmail andrà impostato di conseguenza il campo mailhub descritto in precedenza.

Poi bisogna impostare, se non lo sono già, proprietario, gruppo e permessi dei file /etc/ssmtp/ssmtp.conf/etc/ssmtp/revaliases  in modo da permettere o meno ai diversi utenti di usare ssmtp.
Se ssmtp non riuscirà a leggere tali file verrà visualizzato un errore del tipo:

ssmtp: Cannot open smtp.gmail.com:587


Io ho impostato a tali file utente root e gruppo mail, ma è possibile anche impostarli a root:root, l'importante è poi dare i giusti permessi di conseguenza e, per quanto riguarda gli utenti, assicurarsi che facciano parte del relativo gruppo scelto per poter inviare mail altrimenti non riusciranno ad accedere al servizio.
Quindi, nel mio caso, volendo impostare i file a root:mail (utente:gruppo) dovrò aggiungere poi al gruppo mail tutti coloro che voglio autorizzare ad utilizzare ssmtp, nel mio caso un utente e root:

sudo chown root:mail /etc/ssmtp/*
sudo adduser -a nome_utente mail


Il primo comando imposta il proprietario:gruppo dei file, mentre il secondo aggiunge nome_utente al gruppo mail, ovviamente è da ripetere per ogni utente si desidera autorizzare.
Dopo questa operazione riavviare per rendere effettive le modifiche ai gruppi.

Verificare inoltre i permessi minimi ai file, ossia che l'utente che vorrà usare ssmtp abbia accesso in lettura a tali file, quindi 644 o 640 per una maggiore sicurezza. Nel caso non siano soddisfatti basta impostarli:

sudo chmod 644 /etc/ssmtp/*


Ora dovrebbe essere tutto funzionante, per fare una prova basta aprire un terminale ed inviare una mail dando il seguente comando:

ssmtp Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.


A questo punto ssmtp attenderà che scriviamo il messaggio, basta comporlo nel seguente modo:

To: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
From: Eventuale nome personalizzato
Subject: Oggetto della mail

Messaggio di prova.
Ciao!


Alla fine basta premere CTRL+D ed il messaggio verrà inviato!

Per velocizzare le prime prove finchè tutto non funzionerà, dopo avere lanciato il comando si può dare direttamente CTRL+D, arriverà una mail vuota.


Ovviamente balza subito all'occhio che scrivere ogni volta queste righe possa essere un po' noioso... Quindi si può benissimo creare un file, che in questo caso chiamiamo esempio.txt ed inserire al suo interno le stesse righe di cui sopra, infine passarlo come parametro al comando stesso in questo modo:

ssmtp Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo. < esempio.txt


Da qui nasce immediata l'integrazione in uno script inserendo nel corpo del messaggio le variabili del sistema o del processo che ci interessa farci inviare per mail dal nostro PC!


Se volessimo anche un'allegato...

Basterebbe dare un comando simile

echo -e $to"\n"$from"\n"$oggetto"\n"$messaggio"\n" | (cat - && uuencode nome-file-allegato.bla nome-file-out.bla) | ssmtp Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.

(non va a capo ma è tutta una riga)
Praticamente, la prima parte prepara il messaggio usando delle variabili per comodità, si può anche associare un file esterno pre-compilato, poi tramite la pipe ( | ) viene passata alla seconda parte che la unisce all'allegato. L'allegato non viene altro che convertito in base64 (serve il pacchetto uuencode) ed il tutto viene nuovamente passato alla terza parte che è il solito comando sSMTP che invia il tutto.

 

Comuni errori...

1.

La mia scelta di usare il server smtp di Google è solo per non dovermi creare una nuova mail o un nuovo servizio solo per questo utilizzo, ma Google è troppo poco permissivo e potrebbe essere comune un errore del tipo o simile:

ssmtp: Authorization failed (535 5.7.1 http://mail.google.com/support/bin/answer.py?answer=14257 l12sm3234587qcu.31)

oppure un errore simile ma del tipo 534.
Non è altro che Google che ci sta impedendo l'accesso... per la nostra sicurezza, Hahahaha!!! Si... ovviamente lo fa per noi! 

Praticamente sembra che se il suo super sistema automatico rileva un tentativo "sospetto" ne impedisca l'accesso.
Per ovviare a ciò basta effettuare il login a questo indirizzo, quindi effettuare prima un logoff se si è già connessi:

https://accounts.google.com/b/0/DisplayUnlockCaptcha

da browser e dalla postazione che si sta utilizzando.
Eventualmente provare a riavviare e poi dovrebbe funzionare il tutto.
Molte volte però non basta, e se funziona, un giorno potrebbe tornare a non funzionare (esperienza personale).
Eventualmente provare da browser a cambiare password, molti riportano poi esito positivo.

 

2.

Come detto in precedenza potrebbe comparire anche questo errore:

ssmtp: Cannot open smtp.gmail.com:587

In questo caso rivedere bene permessi ai file e utenti/gruppi. Rileggere bene il tutorial per le spiegazioni.

 

3.

In caso di altri errori dare sempre un'occhiata ai file di log:

/var/log/mail.log
/var/log/mail.err

Leggere bene il tipo di errore ed eventualmente dare anche un'occhiata ai limiti di un account google gratuito:
https://support.google.com/a/answer/166852?hl=it

 

OPPURE... LA SOLUZIONE DEFINITIVA! 

Se come me vi siete rotti di provare e riprovare con Google, abbandonate ed usate un altro server smtp. Ce ne sono diversi di prestanti e molto meno restrittivi di Google:

http://mandrill.com/
http://sendgrid.com/
http://aws.amazon.com/ses/

e molti altri...

Io ho usato mandrill, basta registrarsi, e se in fase di registrazione si dà la stessa mail di google sarà quello il nostro nome utente, quindi non bisogna nemmeno modificare troppo i file di configurazione
Bisogna solo modificare nel file /etc/ssmtp/ssmtp.conf la voce mailhub, che diventa:

mailhub=[smtp.mandrillapp.com]:587

così come nel file /etc/ssmtp/revaliases  bisogna inserire il nuovo server smtp.
Per quanto riguarda la password, non è quella usata in fase di registrazione, ma bisogna semplicemente crearne una dal sito mandrill, dal nostro pannello utente:
- una volta nel sito, effettuare il login
- andare alla sezione SETTINGS nella sezione SMTP & API Credentials
- registrare una nuova API KEY da usare come password, basta cliccare il pulsante blu "+ Add API Key"
- si creerà in automatico un codice alfanumerico, questa sarà la password da usare alla voce AuthPass nel file di configurazione /etc/ssmtp/ssmtp.conf

ATTENZIONE!
Problema SPAM
Sembra che Mandrill sia usato da molti per inviare SPAM o pubblicità ecc...
Google e molti altri molto probabilmente metteranno sempre i nostri messaggi da Mandrill sotto la sezione spam, anche se lo segnaliamo come "non spam".
Perciò bisogna creare dei filtri di posta, Google lo permette, probabilmente anche altri gestori, io ora imposterò un filtro in Google.

Per creare un filtro in Google e permettere che i nostri messaggi arrivino in "Posta in Arrivo" basta aprire un browser
- entrare in gmail
- in alto a destra entrare nelle IMPOSTAZIONI
- in alto scegliere la sezione FILTRI
- cliccare su "Crea un nuovo filtro"

Crea nuovo filtro

 

 

 

 

 

 

 

 

- nella finestra che si apre compilare la prima voce, il campo "Da", e scriverci l'indirizzo e-mail da cui ci perviene il nostro messaggio. In basso a destra di questa finestra cliccare "Crea filtro con questa ricerca" e passare così alla prossima finestra:

Crea Filtro

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- selezionare la voce "Non inviare mai a Spam"
- cliccare "Crea filtro" ed il filtro è creato

Ora riprovare ad inviare un'e-mail e tutto dovrebbe funzionare senza problemi.