Leggere nuove e-mail di Google (gmail) da terminale

C'è una pagina di Google che visualizza le nuove mail ricevute, solo quelle nuove, ovviamente dopo essersi autenticati.
Giustamente.... Direte voi, dov'è la novità?!?! Basta aprire un browser ed entrare in gmail, si potranno visualizzare sia quelle nuove che quelle vecchie!

Beh, se Google l'ha resa disponibile non pensate ci sia un motivo? Magari è possibile sfruttarla in qualche modo... magari tramite un terminale Linux... Esatto!


La pagina in questione è la seguente:

https://mail.google.com/mail/feed/atom


Se apriamo un terminale e la interroghiamo, ad esempio con curl, applicando qualche comando tipo tr... sed... ecc... potremmo filtrare per esempio l'oggetto di ogni e-mail, oppure il mittente, il corpo del messaggio ecc...

Questo comando, per esempio:

curl -u propria-mail:password "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F "<entry>" '{for (i=2; i<=NF; i++) {print $i}}' | sed -n "s/<title>\(.*\)<\/title.*summary>\(.*\)<\/summary.*name>\(.*\)<\/name>.*email>\(.*\)<\/email>.*/\3 \4 \1 - \2/p"

esegue un po' di operazioni e come risultato visualizza:

nome associato [spazio] e-mail [spazio] oggetto [spazio] - [spazio] messaggio

Ovviamente propria-mail:password non sono altro che nome utente e password di accesso a gmail.
aggiungendo alla fine un reindirizzamento ( >pippo.txt ) potremmo ottenere un file di testo contenente una serie di righe, una per ogni nuova e-mail, con le informazioni filtrate nel modo appena descritto.

Per molti potrà non avere alcuna utilità, ma per altri potrebbe essere, per esempio, uno spunto per interagire con il proprio computer tramite mail, nel caso non si avesse a disposizione una connessione ssh o altri sistemi.
Si potrebbe impostare uno script in cron che ogni tanto esegua un controllo di nuove mail e se magari oggetto o qualche altra informazione corrispondono ad una determinata parola chiave lo script potrebbe eseguire qualche comando.

Ad esempio, se l'oggetto della mail corrisponde ad una determinata parola chiave, supponiamo "ciao" lo script potrebbe eseguire il comando che noi scriveremo nel corpo della mail, supponiamo "ls -al".
Alla fine inoltre lo script potrebbe anche inviarci il risultato come file allegato ad una mail, oppure come corpo del messaggio.

Gli utilizzi potrebbero essere tanti, a seconda delle necessità.

Buon utilizzo!

 

 

Riporto qui sotto il listato di uno script, a livello molto grezzo e ottimizzabile, che avevo iniziato a fare in passato. Per funzionare funziona ma si potrebbe ottimizzare un po'.
In ogni caso, questo script controlla le nuove gmail, verifica quelle che arrivano da me e in oggetto riportano una determinata parola chiave, in caso affermativo esegue il comando passato nel corpo del messaggio e ne invia i risultati in mail.
Utilizza i pacchetti curl, ssmtp e uuencode.

 

#!/bin/bash
nome_file=pippo.txt
report_errori=report_errori.txt
report_comando=report_comando.txt
# ---------------
to="To: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo."
from="From: e-mail_mittente@xxx.yyy"
oggetto_mail_errori="Subject: Report Esecuzione Comando - Errori"
oggetto_mail_comando="Subject: Report Esecuzione Comando"
testo=""

# 1 = title = oggetto della mail
# 2 = summary = testo della mail (non credo tutto)
# 3 = name = nome associato alla mail
# 4 = email = indirizzo mail
curl -u email_login:password_login "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F "<entry>" '{for (i=2; i<=NF; i++) {print $i}}' | sed -n "s/<title>\(.*\)<\/title.*summary>\(.*\)<\/summary.*name>\(.*\)<\/name>.*email>\(.*\)<\/email>.*/\3 \4 \1 ---\2/p"> $nome_file

# verifica esistenza del file
if [ ! -f $nome_file ]; then
  echo "Il file $nome_file non esiste!"
else
 
  # Link filedescriptor 10 con stdin
  exec 10<&0
  # stdin rimpiazzato con argomento 1 passato allo script
  exec < $nome_file
 
  # Memorizza nell'array ARRAY le righe del file e verifica, saltando, le righe vuote
  while read LINE; do
    ARRAY[$arraycount]=$LINE
      ((arraycount++));
  done
 
  # Ripristino stdin dal filedescriptor 10 e chiusura filedescriptor 10
  exec 0<&10 10<&-
 
  totale=${#ARRAY[@]}
#  echo "Totale righe lette: "$totale
    for ((i=0; i<totale; i++)); do
      nome=$(echo ${ARRAY[i]} | awk '{ print $1 }')
      indirizzo=$(echo ${ARRAY[i]} | awk '{ print $2 }')
      oggetto=$(echo ${ARRAY[i]} | awk '{ print $3 }')
#      echo $nome
#      echo $indirizzo
#      echo $oggetto
      if [ $nome == "me" ] && [ $indirizzo == "Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo." ] && [ $oggetto == "parola_chiave" ]; then
        comando=$(echo ${ARRAY[i]} | sed -n "s/.*---\(.*\)/\1/p")
#        echo $comando
        echo $comando >>$report_errori
        echo "----------------------------------" >>$report_errori
        $comando 2>>$report_errori
        echo "==================================" >>$report_errori
        echo $comando >>$report_comando
        echo "----------------------------------" >>$report_comando
        $comando >>$report_comando
        echo "==================================" >>$report_comando
      fi
    done

#  mail con allegato
  echo -e $to"\n"$from"\n"$oggetto_mail_errori"\n"$testo"\n" | (cat - && uuencode $report_errori $report_errori) | ssmtp Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
  echo -e $to"\n"$from"\n"$oggetto_mail_comando"\n"$testo"\n" | (cat - && uuencode $report_comando $report_comando) | ssmtp Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.

  rm $nome_file
  rm $report_errori
  rm $report_comando
 
fi

exit 0

 

Sostituire i diversi indirizzi e-mail, la parola chiave e password di accesso... Ad esempio, inviatevi un'e-mail che come oggetto contenga la vostra parola chiave prescelta, e come corpo del messaggio per esempio ls -al. Vi tornerà in mail il risultato sotto forma di file di testo allegato, una mail per il risultato e una per gli errori.
Se questo script lo si mette in cron... gli usi possono essere svariati.