Qualche tempo fa, in preda ad un impeto di nerditudo ho pensato: "Come posso controllare il numero di email non lette sul mio account GMail con uno script Bash?". Mi sono subito messo alla ricerca di una soluzione e l'ho trovata, ma non funzionava, quindi l'ho aggiustata (semplificandola parecchio peraltro) in modo che facesse ciò che mi serviva. Purtroppo non trovo più il link, perciò non posso dare i giusti meriti a chi ha scritto lo script sul quale mi sono basato, però credo sia altrettanto giusto che sappiate che non è tutta farina del mio sacco.

Allora, io direi che è meglio se vediamo prima tutto il codice, così lo analizziamo.
#! /bin/bash

echo -e "\nnome utente:";
read nome

echo -e "\npassword:";
read -s pwd

mail=$(curl -u $nome:$pwd --silent "https://mail.google.com/mail/feed/atom" | sed -n '/<fullcount>/p' | tr "<fullcount>,</fullcount>" " ");

echo -e "\n---------------------------------\nEmail non lette: $mail\n---------------------------------\n";

exit 0;

Innanzitutto, vengono richiesti il nome utente e la password mediante il comando read. Il parametro -s della read sta per silent, cioè non mostra ciò che si scrive durante la digitazione.

Inizia ora la parte interessante, che si concentra nella riga 9 del codice appena mostrato, che vediamo passo passo.
mail=$(curl -u $nome:$pwd --silent "https://mail.google.com/mail/feed/atom"

Lo scopo è far sì che la variabile mail contenga il numero di email non lette. Per prelevare il feed atom della casella di posta sfruttiamo curl e visto che è richiesta una autenticazione, usiamo il parametro -u, cui seguono ovviamente nome utente e password; con --silent non viene mostrato niente a schermo.

Quel che otteniamo grazie a curl è qualcosa del genere:
<?xml version="1.0" encoding="UTF-8"?>

<feed version="0.3" xmlns="http://purl.org/atom/ns#">

<title>Gmail - Inbox for andovais@gmail.com</title>

<tagline>New messages in your Gmail Inbox</tagline>

<fullcount>0</fullcount>

<link rel="alternate" href="http://mail.google.com/mail" type="text/html" />

<modified>2012-01-14T23:40:54Z</modified>

</feed>
La riga 9 contiene il numero di email non lette. Dobbiamo  isolare lei e poi isolare il numeretto che contiene. Qui entra in scena sed.
sed -n '/<fullcount>/p'
Grazie alla pipe diamo il feed in pasto al nostro amico sed e gli diciamo di stampare la riga contenente il pattern "<fullcount>", col parametro -n gli diciamo di stampare solo quella. Otteniamo qualcosa del tipo:
<fullcount>0</fullcount>
Sempre grazie ad una pipe, dirigiamo l'output al suo ultimo lido: tr.
 tr "<fullcount>,</fullcount>" " "
Con tr convertiamo i tag xml in spazi vuoti, lasciando solo soletto il numero che stava lì in mezzo.
Adesso quindi la variabile $mail contiene il numero di email non lette  (nel mio caso zero), ne stampiamo a video il contenuto et voilà :D

Spero di essere stato abbastanza chiaro e di non aver scritto boiate, soprattutto su sed, che praticamente non conosco. Sicuramente esiste una soluzione migliore, ma questa funziona e ciò mi basta :)


p.s. L'immagine del post utilizza un icona di DsynFLO Creations, che potete trovare qui.