How do I set up email confirmation with Devise?

73,582

Solution 1

1. Make sure you include confirmable in Model.devise call

class User < ActiveRecord::Base
  devise :database_authenticatable, :confirmable ...
end

2. Make sure you add confirmable to the user migration

create_table :users do |t|
  t.database_authenticatable
  t.confirmable
  ...
end

If you're using devise 2.0+ this fails because devise no longer provides migration helpers, and so t.confirmable raises an error. Instead, copy the block labeled "Confirmable" from their migration guide.

3. Generate the devise views, with either of the following commands,so you can override the devise mailer views:

rails generate devise:views # global
rails generate devise:views users # scoped

You can now override the mailer views in devise/mailer/confirmation_instructions.html.erb or users/mailer/confirmation_instructions.html.erb depending on your setup

4. For development environment add the following config lines in /config/environments/development.rb

config.action_mailer.default_url_options = { :host => 'localhost:3000' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {:address => "localhost", :port => 1025}

5. For production environment in /config/environments/production.rb you may use something similar to the following (supposing you have a SMTP server on localhost:25):

config.action_mailer.default_url_options = {:host => 'yourdomain.com'}
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address => "127.0.0.1",
  :port    => 25,
  :domain  => 'yourdomain.com'
}

6 To test the setup in development install the mailcatcher gem, that you will use as a SMTP server in development, catching all incoming mails and displaying them on http://localhost:1080/:

gem install mailcatcher

Once installed start the mailcatcher server with the command:

mailcatcher

A toy SMTP server will be running on port 1025 catching emails and displaing them on HTTP port 1080.

You can now create an account and see the confirmations.

Solution 2

Have you looked at the ActionMailer Rails Guide?

Share:
73,582
jyli7
Author by

jyli7

Updated on August 12, 2020

Comments

  • jyli7
    jyli7 over 3 years

    Is there a tutorial out there that explains how to set up Devise's signup confirmation email from scratch (in both development and production), i.e. if you don't have Action Mailer set up?

    Google searching has just turned up a bunch of separate pieces related to this. No one piece explains enough, and I'm not sure how they fit together. Is there a step-by-step explanation out there, or even something that explains the initial steps?


    Finally got it working. Followed all the steps in the accepted answer below, then added the following to my environment.rb file:

    ActionMailer::Base.delivery_method = :smtp
    ActionMailer::Base.smtp_settings = {
       :tls => true,
       :address => "smtp.gmail.com",
       :port => 587,
       :domain => "gmail.com",
       :authentication => :login,
       :user_name => "[username]",
       :password => "[password]"
     }
    
  • jyli7
    jyli7 over 12 years
    Wow, thanks for that amazingly comprehensive answer. I've got it working such that the mail catcher is catching the emails, but no email actually shows up in my inbox. I've tried two different email addresses and checked the spam folders in both. Is there something I might be missing here? (I'm in development mode).
  • jyli7
    jyli7 over 12 years
    Realized that the mail catcher was preventing them from going through. When I turned off mail catcher, my server threw up this error: Errno::ECONNREFUSED in Devise::RegistrationsController#create. Any ideas?
  • clyfe
    clyfe over 12 years
    In development you don't need to actually deliver the emails to the address. Mailcatcher has a web interface on localhost:1080 that you can open and see the catched emails - that's the point of it, to make it simple for you in development. In production however, you want to use a real SMTP server (Google Apps, qmail, postfix etc talk to your sysadmin)
  • Matt Bond
    Matt Bond almost 11 years
    And don't forget to restart your server!
  • Ross Allen
    Ross Allen over 10 years
    Devise 2.0 no longer provides migration helpers, and so t.confirmable raises an error. Instead, copy the block labeled "Confirmable" from their migration guide: github.com/plataformatec/devise/wiki/…
  • Arup Rakshit
    Arup Rakshit almost 9 years
    Awesome tutorial... thanks for sharing.. +1.. Also worth to see How To: Add :confirmable to Users page.
  • user3763682
    user3763682 almost 9 years
    The letter_opener gem is a better choice than mailcatcher
  • Aleksandrus
    Aleksandrus over 8 years
    I'm getting an error: SSL_connect returned=1 errno=0 state=unknown state: unknown protocol. what could I do to make this work?
  • BenKoshy
    BenKoshy over 6 years
    @clyfe thank you for your answer. do you know if your instructions would be the same given rails 5?