programming ruby imap email

Leggere le email di Gmail con Ruby

Sto progettando un piccolo sito per un amico, che ogni tanto vorrebbe aggiungere delle notizie autonomamente. Questo mio amico è negato con la gestione di un blog, ma sa usare benissimo le email. Così ho pensato di dargli la possibilità di aggiungere notizie mandando un'email. Siccome sono molto preso da Ruby, ho provato a farlo.

Avendo Gmail, ho provato subito con questo provider. Ho creato l'etichetta (che IMAP vede come una cartella) chiamata blog e ho messo dentro un'email.

Connessione a IMAP

Prima di inserirlo nel workflow del sito, ho semplicemente provato con uno script, avviabile da terminale:

#!/usr/bin/env ruby

require 'net/imap'
require 'mail'

imap = Net::IMAP.new('imap.gmail.com', 993, true)
imap.login('username', 'password')
imap.select('blog')
imap.search(["NOT", "DELETED"]).each do |message_id|
  msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822']
  mail = Mail.read_from_string(msg)
  puts mail.text_part.body.to_s
end
imap.logout()
imap.disconnect()

Il modulo net/imap è già fornito dal core, mentre il modulo mail si può installare con gem install mail. A questo punto basta dare i permessi di esecuzione allo script... et voilà! Semplice ed efficace, quando avviamo questo piccolo programma, leggiamo tutte le email nella cartella blog.

Attenzione! In questo modo il nostro script ha accesso completo all'account di posta elettronica. Se modificato, aggiungendo altri comandi, può anche eliminare le email! Consiglio di usare un account di prova.

Autorizzazione con OAUTH2

Lo script sopra ha due problemi: la password è scritta in chiaro e ha i permessi di fare qualsiasi cosa nell'account email. Google ha pensato bene di fornire un servizio per mettere in sicurezza le applicazioni che si collegano alla posta elettronica: l'autorizzazione con OAUTH2. È necessario installare un'altra gem con gem install gmail_xoauth. Dopodiché dobbiamo creare il token necessario all'autenticazione.

Google APIs Console

Utilizzando la Google APIs Console, andiamo a registrare la nostra applicazione.

Aprire la Google APIs Console Cliccare "Create project" (crea progetto) Selezionare "I agree to these terms" e cliccare "Accept", per accettare i termini del contratto. Cliccare sulla voce a sinistra "API access" Cliccare "Create an OAUTH 2.0 Client ID" Inserire il nome dell'applicazione, per esempio "Test Email Reader" Selezionare "Installed application" Cliccare "Create Client ID"

Ottenere il token

Ora ci troviamo con due codici: "Client ID" e "Client secret". Ancora non abbiamo il token. Per crearlo, dobbiamo usare un programmino scritto in python, fornito da Google. Quando lo usiamo, ci viene chiesto di aprire una pagina web, in cui accettiamo che l'applicazione possa accedere alla posta. Quindi ci fornisce il token.

Scaricare oauth2.py

Dare i permessi di esecuzione ed eseguirlo, cambiando i parametri con i codici forniti dalla Google APIs Console.

./oauth2.py --generate_oauth2_token --client_id=12345678901.apps.googleusercontent.com --client_secret=Syajhgi7689uhgjanasdgBwD

Lo script con l'autorizzazione OAUTH2

Seguire le istruzioni. Alla fine otteniamo il token, che andiamo ad inserire nel nostro script.

#!/usr/bin/env ruby

require 'net/imap'
require 'mail'
require 'gmail_xoauth'

imap = Net::IMAP.new('imap.gmail.com', 993, true)
imap.authenticate('XOAUTH2', 'username', 'inserire_qui_il_token')
imap.select('blog')
imap.search(["NOT", "DELETED"]).each do |message_id|
  msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822']
  mail = Mail.read_from_string(msg)
  puts mail.text_part.body.to_s
end
imap.logout()
imap.disconnect()

Se tutto è andato bene, dovremmo avere lo stesso risultato del primo script, ma con la sicurezza offerta da XOAUTH2.

Ti è piaciuto l'articolo? Condividilo! Commentalo!

comments powered by Disqus