Devise::MultiEmail

Let devise support multilpe emails, it allows you to:
- Login with multiple emails
- Send confirmations to multiple emails
- Recover the password with any of the emails
- Validations for multiple emails
:multi_email_authenticatable, :multi_email_confirmable and :multi_email_validatable are provided by devise-multi_email.
Getting Started
Add this line to your application's Gemfile, devise-multi_email has been tested with devise 4.0 and rails 4.2:
gem 'devise-multi_email'
Suppose you have already setup devise, your User model might look like this:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable
end
In order to let your User support multiple emails, with devise-multi_email what you need to do is just:
class User < ActiveRecord::Base
has_many :emails
# Replace :database_authenticatable, with :multi_email_authenticatable
devise :multi_email_authenticatable, :registerable
end
class Email < ActiveRecord::Base
belongs_to :user
end
Note that :email column should be moved from users table to the emails table, and a new primary boolean column should be added to the emails table (so that all the emails will be sent to the primary email, and user.email will give you the primary email address). Your emails table's migration should look like:
create_table :emails do |t|
t.integer :user_id
t.string :email
t.boolean :primary
end
Confirmable with multiple emails
Sending different confirmaitons to different emails is supported. What you need to do is:
Declare devise :multi_email_confirmable in your User model:
class User < ActiveRecord::Base
has_many :emails
# You should not declare :confiramble and :multi_email_confirmable at the same time.
devise :multi_email_authenticatable, :registerable, :multi_email_confirmable
end
Add :confirmation_token, :confirmed_at and :confirmation_sent_at to your emails table:
create_table :emails do |t|
t.integer :user_id
t.string :email
t.boolean :primary, default: false
## Confirmable
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
end
Then all the methods in devise confirmable are avalible in your Email model. You can do Email#send_confirmation_instructions for each of your email. And User#send_confirmation_instructions will be delegated to the primary email.
Validatable with multiple emails
Declare devise :multi_email_validatable in the user model, then all the user emails will be validated:
class User < ActiveRecord::Base
has_many :emails
# You should not declare :validatable and :multi_email_validatable at the same time.
devise :multi_email_authenticatable, :registerable, :multi_email_validatable
end
What's more
The gem works with all other devise modules just as normal, you don't need to add the multi_email prefix.
devise :multi_email_authenticatable, :multi_email_confirmable, :multi_email_validatable, :lockable,
:recoverable, :registerable, :rememberable, :timeoutable, :trackable
Issues
You need to implement add/delete emails for a user as well as set/unset primary email.
You can do email.send_confirmation_instructions for every email, but you also need to handle this logic in some place(excpet for the primary email). e.g. After a new email was added by a user, you might want to provide some buttons to allow user to resend confirmation instrucitons for that email.
Development
After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/devise-multi_email. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
License
The gem is available as open source under the terms of the MIT License.