Recently, I’ve really dug into the Hanami framework. Coming from a Rails background it is really fascinating to see what a Ruby framework looks like in a post-Rails world. One of the first things I setup with new Rails projects is a process by which I can test mailers in development. The letter_opener gem is perfect for this purpose and luckily has a non-Rails setup guide.
Installing the Letter Opener gem
First and foremost we need to add the letter_opener gem to our Gemfile. Version 1.7.0 is the current latest as of writing this. I use
~> 1.7 to limit the version number to be between
>= 1.7.0 and < 1.8.0. This ensures any minor version changes aren’t installed without this value being updated.
group :development do gem 'letter_opener', '~> 1.7' end
Next you’ll want to bundle the new gem by running
bundle install on the command line.
Now that we’ve installed the gem in our project, we can begin setting up Hanami to start using it in the development environment.
Configure Hanami to use Letter Opener
Hanami is a great lightweight Ruby framework. If you’re unfamiliar with it, there is a great tutorial and documentation over at https://hanamirb.org/. Assuming you’re familiar or have read the guide let’s move onto configuration.
Reading the letter_opener guide on Non-Rails Setup, you’ll see the following configuration:
require "letter_opener" Mail.defaults do delivery_method LetterOpener::DeliveryMethod, :location => File.expand_path('../tmp/letter_opener', __FILE__) end
This is really close to how we’ll configure this for Hanami.
The important things here are that we set the delivery method to use Letter Opener and we set the output location where the temporary email files live. The first argument to
delivery_method contains the strategy and the keyword argument
location sets the file location.
For Hanami mailer options are found within
project_name/config/environment.rb. Open this file up.
First add we need to require letter opener at the top of the file.
require 'bundler/setup' require 'hanami/setup' require 'hanami/model' require 'letter_opener' # add this line ...
Next, looking inside the
Hanami.configure block, there are two ways you can configure but I only recommend the first.
(Recommended) Method 1 - Development environment
If you look inside the
environment :production do block you’ll see that it contains a special
mailer do block. Directly above the production environment setup is a
environment :development do block. That’s where we want to add our configuration code. This ensures that it only will send us emails when running in the development environment.
Here’s the working setup code:
environment :development do # See: https://guides.hanamirb.org/projects/logging logger level: :debug mailer do delivery LetterOpener::DeliveryMethod, location: File.expand_path('../tmp/letter_opener', __FILE__) end end
Now when an email is sent in development, it will instead be opened in the browser.
(Alternative) Method 2 - All environments but production
The second method is not scoped to any one environment but rather configured in the main
mailer do configuration block. This has the benefit of setting up Letter Opener for all environments but production (because production has its own special setup block already). Unfortunately, this benefit is also a downside as now mailers will be opened in your browser for other environments like test. This means running a spec that contains a mailer will open browser tabs. Not necessarily ideal if you have a lot of mailer specs.
You can find the main mailer setup by searching for the
mailer do block which by default looks like:
mailer do root 'lib/project_name/mailers' # See https://guides.hanamirb.org/mailers/delivery delivery :test end
Change the delivery line to use
LetterOpener::DeliveryMethod and a set location and you’re good to go.
mailer do root 'lib/project_name/mailers' # See https://guides.hanamirb.org/mailers/delivery delivery LetterOpener::DeliveryMethod, location: File.expand_path('../tmp/letter_opener', __FILE__) end
What did you think? Was this a helpful tip for testing mailers in Hanami? I’d love to hear about other tips using Hanami in the comments below.
Thanks for reading.