DEV Community

Mauricio Ackermann
Mauricio Ackermann

Posted on • Originally published at mauricioackermann.com.br on

How to preview emails with ActionMailer::Preview on Rails

We know how it's a pain to test ** e-mails** in our dev environment. Thinking of it, on Rails 4.1, the ActionMailer::Preview was released, making it possible to view e-mails without actually sending them. Let's learn how to use this tool.

First of all, we need to create a new mailer in our project.

rails generate mailer Welcome
Running via Spring preloader in process 5087
      create  app/mailers/welcome_mailer.rb
      invoke  erb
      create    app/views/welcome_mailer
      invoke  test_unit
      create    test/mailers/welcome_mailer_test.rb
      create    test/mailers/previews/welcome_mailer_preview.rb
Enter fullscreen mode Exit fullscreen mode

It's possible to see that Rails created to files inside test filter: test/mailers/welcome_mailer_test.rb and test/mailers/previews/welcome_mailer_preview.rb. In our case, we are going to use test/mailers/previews/welcome_mailer_preview.rb to preview our templates.

Now let's create a method inside WelcomeMailer that will be responsible for sending a welcome message to users that signup in our system, assuming we have a model User with an e-mail attribute. To do that, we need to open the file app/mailers/welcome_mailer.rb

class WelcomeMailer < ApplicationMailer

  def send_welcome_email(user)
    @user = user
    mail({
      to: user.email,
      from: 'eu@mauricioackermann.com.br',
      subject: 'Seja bem-vindo ao sistema Maurício Ackermann'
      })
  end

end
Enter fullscreen mode Exit fullscreen mode

Since WelcomeMailer is inheriting from ApplicationMailer, he will use the mailer default layout

class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end
Enter fullscreen mode Exit fullscreen mode

app/layouts/mailer.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
      /* Email styles need to be inline */
    </style>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
Enter fullscreen mode Exit fullscreen mode

At last, we need to create an e-mail template. Let's create a file send_welcome_email.html.erb inside the folder app/views/welcome_mailer, which will be our e-mail view.

<p>Hello, <%= @user.name %></p>
<p><strong>Thank you</strong> for registering in our system!</p>
Enter fullscreen mode Exit fullscreen mode

Now that we have our mailer and template done let's test it. All e-mail previews are in test/mailers/previews. Open the file created by our generator, welcome_mailer_preview.html.erb.

class WelcomeMailerPreview < ActionMailer::Preview

  def send_welcome_email
    WelcomeMailer.send_welcome_email(User.new(name: 'Maurício Ackermann', email: 'eu@mauricioackermann.com.br'))
  end

end
Enter fullscreen mode Exit fullscreen mode

Now to visualize the e-mail, we start the server and access the link
http://localhost:3000/rails/mailers/welcome_mailer/send_welcome_email

Did you know about this Rails feature? I hope this post helps you debugging your projects

Top comments (4)

Collapse
 
jattoabdul profile image
Jatto Abdulqahhar

Can this be used in previewing emails in staging environments?

Collapse
 
mbackermann profile image
Mauricio Ackermann

Absolutely! You can turn it on on any envrionment. You can use the following config:

config.action_mailer.show_previews = true
Enter fullscreen mode Exit fullscreen mode
Collapse
 
bizzibody profile image
Ian bradbury

I never knew that. Thanks.

Collapse
 
mbackermann profile image
Mauricio Ackermann

It's a great tool. I use it a lot