Skip to content

How To: Use custom mailer

Jan Bernacki edited this page Jan 24, 2014 · 12 revisions

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] = '[email protected]'
  opts[:reply_to] = '[email protected]'
  super
end
Clone this wiki locally