rails 4 email preview in production

In addition to this:

config.action_mailer.show_previews = true

you will also need to set

config.consider_all_requests_local = true

in your environment for the preview routes to be accessible. This has other implications as well (see https://stackoverflow.com/a/373135/1599045) so you likely don't want to enable this in production. However, if you have a custom environment that's not development, the combination of those two should get things working.

EDITED TO ADD:

The original question was for rails 4.1.1, which doesn't have config.action_mailer.show_previews available. To get ActionMailer previews working in non-development environments in rails 4.1.1, you need to first add some routes to config/routes.rb (in this case, my environment is named custom):

if Rails.env.custom?
  get '/rails/mailers'         => "rails/mailers#index"
  get '/rails/mailers/*path'   => "rails/mailers#preview"
end

Then you need to autoload the libraries needed in your environment's config file (in my case, config/environments/custom.rb):

config.action_mailer.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/test/mailers/previews" : nil
config.autoload_paths += [config.action_mailer.preview_path]

This seems to perform the same task as config.action_mailer.show_previews does.

As with 4.2, you will still need to adjust the local request configuration as above depending on whether your custom environment is being used locally or on a server.


It's possible to enable previews in production by config.action_mailer.show_previews = true as the best answer says.

I just want to add how you can render previews in iframe within your own admin area, eg. in active admin (Rails 5.1)

And also I found out that it is not so hard to write your own email previews administration, and don't use rails standard previews at all. You can then add your own features such as changing preview parameters or Send button to see this email in your phone.


To do it without opening a big security hole:

production.rb

MyApp::Application.configure do
  config.action_mailer.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/spec/mailer_previews" : nil
  config.autoload_paths += [config.action_mailer.preview_path]

  routes.append do
    get '/rails/mailers'         => "rails/mailers#index"
    get '/rails/mailers/*path'   => "rails/mailers#preview"
  end
end

class ::Rails::MailersController
  before_filter :authenticate_admin!
  def local_request?
    true
  end
  private
  def authenticate_admin!
    ...
  end
end