Mass mailing on Rails

emailCome esercizio di programmazione ho voluto implementare un semplice sistema per inviare email personalizzate in Ruby On Rails.

Tutto è nato dalla necessità di dover spedire qualche centinaio di email a più indirizzi e con dati variabili.
Usare i "vecchi" metodi come mailing list, piuttosto che le funzionalità di mail-merge di OpenOffice.org o divertenti script bash sarebbe stato come rinnegare la mia natura di informatico curioso e sperimentatore.

Questi giorni sto usando Ruby On Rails, così ho pensato di implementare il sistema attraverso questo potente framework.

Per prima cosa ho creato un nuovo progetto (mailer)
ed un modello (Address) che, banalmente, contiene l'indirizzo email e gli eventuali attributi che servono per la personalizazione delle email da spedire.

Lo script di scaffolding in Rails 2 mi ha permesso di creare modello, controller, viste e script di migrazione con una sola riga di comando.

Fatto questo ho popolato la tabella addresses. Per farlo, però, ho giocato sporco: come DB ho usato Sqlite3 e quindi mi è bastato importare con sqlitebwrowser un file CSV che conteneva tutti i dati (indirizzi ed altri campi).
Ad ogni modo era anche possibile leggere il file CVS e popolare il database tramite Rails.

La struttura per interagire con gli indirizzi ed i dati è quindi pronta, i dati sono presenti nel database, manca solo l'invio delle email.

Per farlo basta creare un controller (che ho chiamato Mailer) contenente un metodo (sendmail, originale no?) che carica l'elenco di indirizzi e, tramite Net::SMTP, invia le email, opportunamente composte, ai vari indirizzi.

L'unico accorgimento è che il server SMTP potrebbe offendersi se si cerca di inviare un numero massiccio di email. Per questo motivo ho messo un intervallo di qualche secondo tra un invio e l'altro.

Tempo complessivo: meno di 25 minuti, compreso il tempo per guardarmi la documentazione di Net::SMTP.

Infine il mail server, dopo la quattrocentoventesima email, si è comunque offeso ed ho avuto un bel:

554 vsmtp14.tin.it Service not available - access denied

Il timeout di 4 secondi probabilmente non era abbastanza!