# app/controllers/emails_controller.rb
# Could not get gem letter_opener_web to work as intended,
# This is a simple alternative that uses delivery_method :test
class EmailsController < ActionController::Base
layout nil
def index
@deliveries = ActionMailer::Base.deliveries.reverse
end
end
# config/environments/staging.rb
config.action_mailer.delivery_method = :test
<!-- app/views/emails/index.html.erb -->
<div style="position: fixed; width: 200px; height: 100%">
<% @deliveries.each_with_index do |delivery, index| %>
<a href="#<%= index %>"><%= delivery.subject.to_s %></a>
<br/>
<% end %>
</div>
<div style="margin-left: 200px">
<% @deliveries.each_with_index do |delivery, index| %>
<article id="<%= index %>">
<div>From: <%= delivery.from.join(", ") %></div>
<div>Subject: <%= delivery.subject.to_s %></div>
<div>Date: <%= delivery.date %></div>
<div>To: <%= delivery.to.join(", ") %></div>
<pre><%= delivery.body.to_s.html_safe %></pre>
</article>
<hr/>
<% end %>
<% if @deliveries.empty? %>
No mails have been sent since last start of the app
<% end %>
</div>
# config/routes.rb
if Rails.env.development? || Rails.env.staging?
resources :emails, path: "/letter_opener"
end
Or if you prefer to use slim for templates
/ app/views/emails/index.html.slim
div style="position: fixed; width: 200px; height: 100%"
- @deliveries.each_with_index do |delivery, index|
a href="##{index}" = delivery.subject.to_s
br
div style="margin-left: 200px"
- @deliveries.each_with_index do |delivery, index|
article id=index
div From: #{delivery.from.join(", ")}
div Subject: #{delivery.subject.to_s}
div Date: #{delivery.date}
div To: #{delivery.to.join(", ")}
pre = delivery.body.to_s.html_safe
hr
- if @deliveries.empty?
| No mails have been sent since last start of the app