Validate emails with the help of the mail gem instead of some clunky regexp.
Aditionally validate that the domain has a MX record.
Optionally validate against a static list of disposable email services.
There are lots of other gems and libraries that validates email addresses but most of them use some clunky regexp. I also saw a need to be able to validate that the email address is not coming from a "disposable email" provider.
Yes, it is used in several production apps.
Add this line to your application's Gemfile:
gem "valid_email2"And then execute:
$ bundle
Or install it yourself as:
$ gem install valid_email2
If you just want to validate that it is a valid email address:
class User < ActiveRecord::Base
validates :email, presence: true, email: true
endTo validate that the domain has a MX record:
validates :email, email: { mx: true }To validate that the domain is not a disposable email:
validates :email, email: { disposable: true }To validate that the domain is not blacklisted (under vendor/blacklist.yml):
validates :email, email: { blacklist: true }All together:
validates :email, email: { mx: true, disposable: true }Note that this gem will let an empty email pass through so you will need to add
presence: trueif you require an email
address = ValidEmail2::Address.new("[email protected]")
address.valid? => true
address.disposable? => false
address.valid_mx? => trueIf you are validating mx then your specs will fail without an internet connection.
It is a good idea to stub out that validation in your test environment.
Do so by adding this in your spec_helper:
config.before(:each) do
allow_any_instance_of(ValidEmail2::Address).to receive(:valid_mx?) { true }
endThis gem requires Rails 3.2 or 4.0. It is tested against both versions using:
- Ruby-1.9
- Ruby-2.0
- Ruby-2.1
- Ruby-2.2
- JRuby-1.9
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request

