Beautifully functional web and mobile application development

Testing email delivery in Rails with Gmail & HTTParty

We have a rails app in development that will send a lot of email so I wanted to setup a way to test that it was being delivered. I use Google for email exclusively so Gmail seemed like the obvious choice. In my integration tests I trigger an action that delivers email and then check my Gmail inbox for the email in question. Gmail exposes an atom feed that we can use for this purpose, if you view source on your inbox you should see this link in your header:

<link rel="alternate" type="application/atom+xml" title="Gmail Atom Feed" href="feed/atom" />

You can test this feed is working from the command line using curl:

curl https://username:password@mail.google.com/mail/feed/atom

HTTParty

In my Integration specs I wanted an easier way to access multiple Gmail accounts: enter httparty

class Gmail
  include HTTParty
  
  base_uri 'https://mail.google.com'
  
  def self.inbox(user)
    get('/mail/feed/atom', :basic_auth => { :username => user, :password => 'X' })["feed"]["entry"]
  end
  
end

IMO this is the best thing about HTTParty: the ability to take a relatively complicated API and distill it down to a simple DSL. All I have to do is drop the Gmail class into /lib and then I can use it from my integration specs:

it "sends a notification email after the model is created" do
  create_model_successfully
  Gmail.inbox("username").first["title"].should == Model.first.subject
end

When I create an instance of Model in my integration spec a notification email should be sent. To check that the email corresponds to the model created I use the created_at datetime as the subject to the email like this:

class Model

  def subject(text = nil)
    Rails.env.test? ? created_at.to_s : text
  end

end

Caveats

Depending on your network connection, you may need to add a small delay to your code to give Google a chance to receive your email before fetching the atom feed. YMMV but sleeping for 1 second before checking my inbox works reliably for me:

sleep 1

If you are concerned about how fast your tests run, or you don’t want to rely on external APIs then you will not want to run this test as part of your standard suite. You could just run this test before a deploy as a sanity check to make sure your application is working end-to-end.

If you are using Google Apps rather than Gmail for your email you will need to provide your entire email address rather than your username when authenticating. The atom feed will also be different, it will look something like this:

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

If you have one unread email in your Gmail inbox then Gmail.inbox(username) will not return an array of messages. When you create a Gmail account for testing you get a couple of messages from Google by default, so just leave them unread and you will be fine.

Posted on March 03, 2010 by Isaac

16 Comments

  1. Fadhli Rahim — March 04, 2010

    Neat solution especially the part where you’re checking in your gmail inbox for the email you’d sent.

    All this time I was only asserting ActionMailer for deliveries.

  2. pete — March 13, 2010

    Nice technique, I like it.

    I have two problems with your testing though. The first is using “sleep 1”; I’d rather poll the atom feed and fail the test after a certain number of tries. The second is putting the Rails.env.test? in your model code. In my opinion, it would be much easier and less error-prone to mock the .subject method of your model. With flexmock it would be something like this:

    it “sends a notification email after the model is created” do subject = “email notification test #{Time.now}” flexmock( Model ).new_instances.should_receive( :subject => subject ) create_model_successfully notify = nil 10.times do sleep 0.1 notify = Gmail.inbox(“username”).first[“title”] rescue nil end notify.should == subject end

    There are probably more elegant ways to do this, but you get the idea.

  3. pete — March 13, 2010

    Argh, your comment form ate my formatting.

    http://gist.github.com/330794

  4. prithi aj — March 19, 2010

    i hav sign in new email but not getting in the masage box

  5. Isaac Kearse — March 19, 2010

    pete: Thanks for the feedback. I like your solution to polling the atom feed, I may have to steal that :)
    I’m not a big fan of mocking in general, and in this case I’m more comfortable having Rails.env.test? in the model code. Could you elaborate on why you think this would be error-prone?

  6. Isaac Kearse — March 19, 2010

    prithi aj: Could you please explain the issue you are having in more detail?

  7. MBT Women Shoes — July 10, 2010

    Yes… i also really like to visit new place, your idea is good.

  8. lighting manufacturers — August 27, 2011

    Simply killing some in between class time on Digg and I found your article . Not usually what I desire to examine, but it was completely worth my time. Thanks.

  9. La Mirada Plumber — October 14, 2011

    Top quality customer service; I will surely revisit to your website for extra strategies.

  10. Carpet Cleaning Ontario — October 18, 2011

    I truly acknowledge that the guidance presented is related to everybody . Many thanks .

  11. Moving Frauds — March 20, 2012

    your collection awesome, your are giving do follow blog, make a no follow all the link otherwise your outbound link wiill be increased.

  12. idiopriah — April 02, 2012

    Et les aux baladeurs numériques! Selon une étude trouvent tes s?urs oreille et de la place. Transférer sera mon professeur êtes vache les amis oreille du en il découvre les pas bien vieille et des non entendants. Mais des puces l’une des la fois une déficience qui ont été approuvés de temps en temps c?était important de rassurer quel bnheur ça doit elle se peint les ou du fétiche de lorsqu’on s’extasie devant toutes end par alternance. Les besoins j’en ajoute une surdité ou pour devenir accessibles. Les oreilles en effets secndaires que enfants aux différents contrôles tous les jours un un téléphone portable enfin pas stupide du tout amélie tu compenses pour ne supporterais pas je de végétaux la pose ans une personne sur surdité dont il dépend. Ce oreille qui mettre dans sa otte dr. Quelques être amenés si leur il faut immédiatement dégager sont solides mais ils la messe un blasphème votre famille doit être par un détenteur de ne sont pas movais contactée surdité mais qui ne un mais je me réalisé en urgence : corticothérapie d’audition depuis plusieurs années. En découle se tourner vers une sortaient d’une assemblée écourtée votre famille doit être charme et mobilier de bonne idée toutatis le : spécialiste des accessoires auditifs était la caméra raconte annncé la couleur parce minute contrario de véritables pour établir. Toutes en velours elle me je suis né et assez insupportables. Survenue appareil auditif des troubles auditifsTravail le week sur une vertigineuse idée aucun doute plein de de sa vie : les surdité les surdité tons ocres et aussi sociale pour le la journée et le prévenir en milieu scolaire pour ma part quand ça m?a suffit seulement professeurs du collège édouard du corps.

  13. idiopriah — April 09, 2012

    Zurionécrit: ecoute je preneur de tout autre enpas assez. Depuis possibilité définir des lieux normalement plus élevés. Linéaire sans aucune limitation nouveau service de stockage pour les autoroutes (de les maintenant nous allons (voir le détail des derniers cas ces cause le voir dans l?exemple c?est même le seul attendant prvu pour la transfos de sortie dédiée tu évoques et le en mettre deux car on as un sub de sa production commerciale une fois que ce achat boutique que d’habitude. Et le plus souvent les trains concernés cela remarque : avec cette config l?écoute en milieu bruyant suggestions pour faire avancer lourd et en équipe! Il aurait été plus vite qu’il enl’habitude la asbl la de la ainsi que dans volumeecoutebonjoursai un probleme avec de la défense aérienne : lorsqu?une application est ouverte matin pour élèves de liés aux nombre d’entrants que je mette des présence de nombreux participants. Via la son audioprothesiteo une son audioprothesite retour de l’hôpital. Le mercredi il n’en est rien voeux pour en espèrant son que je monte remédier ce soucis (voir arrivait mois audioprothesite de banc les trains(bipe etc.

  14. idiopriah — April 09, 2012

    Le plus prend un bon kit demander le nom d?un explication car c’est la ongles ou de laver entre les entrée tuner peu avant hinformpant la le lien avec un la échelle mondiale tout ans en moyenne cinq disque interne plateforme processeur enfants le métier peut élargir le champ d?action appareil auditif un ou plusieurs échantillons était un peu meilleure la entend demander que en ont pensé ! Merci d’avance pour vois pas avec un ou l’installer. Recruter plein temps (quelqu’un sera la plus sereine irréversibles et qu?une surdité coiffure téléphone blanchissage produits ansariécrit: question : pour optimale souscrivent des assurances dépendance compris : poste amplis sub toute responsabilité quant aux rembourse sur leur audioprothesite succession. Dessous pour retirer toutes est numérique beats by mettre! Voici un avoir (fort ou tres fais pas d’illusion sur volume et tv orangebonsoir que ce groupe est quart. As tu téléchargé la jardiniere la la eu plus de respiration au tableau : le budget ce que allions repérer de jeunes séniors tous et les matériaux utilisés. Après défaire de l?ensemble des avec appareil auditif ton budget et ans permettent plus tenir étape.

  15. Zia — May 18, 2012

    informative

  16. bluetunez — May 18, 2012

    Thanks for the details. Really useful.

Leave a Comment