Tempo fa, feci uno script per controllare quante email non lette ho nella mia casella GMail. Ho deciso di andare oltre: uno script che mostra anche l'elenco dei campi oggetto delle email.

L'ho chiamato GBaCh, che sta per GMail Bash Checker.


Cosa fa

Come ho spiegato nell'altro post, non tutti sanno che GMail offre un feed atom della propria casella di posta.
È sufficiente recarsi col proprio browser all'indirizzo https://mail.google.com/mail/feed/atom:

Gmail - Inbox for INDIRIZZO@gmail.com
New messages in your Gmail Inbox
2

2014-05-18T20:36:19Z

Seconda email di prova
Prova. -- “If you have an apple and I have an apple and we exchange these apples then you and I will

2014-05-18T20:36:16Z
2014-05-18T20:36:16Z
tag:gmail.google.com,2004:1468473411071896214

me
INDIRIZZO@gmail.com



Email di prova
Prova. -- “If you have an apple and I have an apple and we exchange these apples then you and I will
2014-05-18T20:35:37Z
2014-05-18T20:35:37Z
tag:gmail.google.com,2004:1468473369708751755

me
INDIRIZZO@gmail.com



Nelle righe evidenziate vediamo chiaramente l'oggetto delle email che ci sono arrivate: gli oggetti sono racchiusi all'interno del tag title, così come l'intestazione della mailbox, ma sappiamo che è la prima riga e perciò non è un problema.
Quello che lo script fa è quindi isolare queste righe e poi stampare i campi oggetto riga per riga.


Come lo fa

Innanzitutto sono previste due modalità di utilizzo: interattiva e non-interattiva. Nel codice sono presenti le variabili $user e $password;  se non sono settate, lo script lavora in modalità interattiva, cioè chiede le credenziali di google, altrimenti va da solo (importante se lo si usa con Conky).

Ora analizziamo uno alla volta i frammenti principali di codice.

Donwload e filtraggio del feed
mail=$(curl -u $user:$password --silent "https://mail.google.com/mail/feed/atom" | sed -n '/<title>/p' |  sed s/\<title\>//g| sed s/\&quot\;/\"/g);
Questa riga di codice semplicemente scarica il feed, isola le righe che iniziano con "<title>", rimuove i tag <title> ed infine converte gli &quot; in ". Occhio, stiamo eliminando solo i tag <title> di apertura, il motivo per cui quelli di chiusura li teniamo lo vediamo tra pochissimo.

Dunque, in output abbiamo una riga fatta così:
intestazione mailbox </title> oggetto #1 </title> oggetto #2 </title>
Possiamo vederla come separata in campi, delimitati da </title> (ecco perché li abbiamo tenuti!). Ci viene quindi in aiuto il nostro fido Awk.

Conteggio e stampa dei campi oggetto
# fields number = n_email + 1
if [[ $mail != "" ]]
then
n_email=$(echo $mail | awk -F '</title>' '{print NF}');
n_email=$(echo "$n_email - 2" | bc)
fi

echo -e "($n_email)";

# printing the titles of the emails one per line
if [[ $n_email > 0 ]]
then
echo $mail | awk 'BEGIN { RS = "" ; FS = "</title>" } { for (i = 2; i <= NF-1; i++) print "-",$i }'
fi
Nel primo blocco contiamo quante email abbiamo, mentre nel secondo, iteriamo (dal secondo campo) e stampiamo il contenuto di ogni campo in una riga diversa.


Conky!

Può essere comodo avere l'output dello script a schermo. Conky è il nostro fidato amico con cui possiamo anche schedulare l'esecuzione dello script:
${texeci 60 sh ~/gbach.sh}
Ipotizzando che il nostro script si trovi nella home.


Donwload

Ecco qui il repo Github.