Skip to content
This repository

How To: Use custom mailer 

dpehrson edited this page · 14 revisions

Pages 110

Clone this wiki locally

To use a custom mailer, create a class that extends Devise::Mailer, like this:

class MyMailer < Devise::Mailer   
  helper :application # gives access to all helpers defined within `application_helper`.
  include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url`
end

Then, in your config/initializers/devise.rb, set config.mailer to "MyMailer".

You may now use your MyMailer in the same way as any other mailer. In case you want to override specific mails to add extra headers, you can do so by simply overriding the method and calling super after (triggering Devise's default behavior). For instance, we can add a new header for the confirmation_instructions e-mail as follow:

You can still use devise views. You basically need to override the methods you mentioned and call super after:

def confirmation_instructions(record, token, opts={})
  headers["Custom-header"] = "Bar"
  super
end

You will also need to copy the devise mail views from app/views/devise/mailer to your new mailer folder.

For example, with the MyMailer mailer above, you need to copy the devise mail views to app/views/my_mailer/. You need to copy over all of the views even if you're only customising one. For example if you are customising confirmation_instructions.html.erb you also need to copy over reset_password_instructions.html.erb and unlock_instructions.html.erb, or those emails will silently start being sent as blank emails.

You can also override any of the basic headers (from, reply_to, etc) by manually setting the options hash:

def confirmation_instructions(record, token, opts={})
  headers["Custom-header"] = "Bar"
  opts[:from] = 'my_custom_from@domain.com'
  opts[:reply_to] = 'my_custom_from@domain.com'
  super
end
Something went wrong with that request. Please try again.