class EmailValidator

Validator for email

Public Instance Methods

allow_idn?() click to toggle source

check the options for idn support

# File lib/rails_email_validator.rb, line 13
def allow_idn?
  options[:allow_idn].nil? or options[:allow_idn] == true
end
convert_idn(domain_part) click to toggle source

convert an unicode domain_part to asccii for validation

# File lib/rails_email_validator.rb, line 28
def convert_idn(domain_part)
  if allow_idn?
    # idn suport if available
    begin
      require 'idn'
      # encode domain part
      return IDN::Idna.toASCII(domain_part)
    rescue LoadError
    rescue IDN::Idna::IdnaError
    end
  end
  domain_part
end
has_mx?(domain) click to toggle source

validate if an mx exists on domain

# File lib/rails_email_validator.rb, line 18
def has_mx?(domain)
  require 'resolv'
  mx = []
  Resolv::DNS.open do |dns|
    mx = dns.getresources(domain, Resolv::DNS::Resource::IN::MX)
  end
  not mx.nil? and mx.size > 0
end
validate_each(record, attribute, value) click to toggle source

main validator for email

# File lib/rails_email_validator.rb, line 43
def validate_each(record, attribute, value)
  unless value.blank?

    # pre var
    valid = true
    local_part = nil
    domain_part = nil

    if valid
      # split local and domain part
      (local_part, domain_part) = value.to_s.split('@', 2)
    end

    domain_part = convert_idn domain_part

    if valid
      # check syntax
      valid = false unless local_part =~ /\A[a-z0-9!\#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!\#$%&'*+\/=?^_`{|}~-]+)*\Z/i
      valid = false unless domain_part =~ /\A(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\Z/i
    end

    # check mx
    if valid and validate_mx?
      valid = false unless has_mx? domain_part
    end

    # email valid
    record.errors.add(attribute, :invalid) unless valid
  end
end
validate_mx?() click to toggle source

check the options for do mx validation

# File lib/rails_email_validator.rb, line 8
def validate_mx?
  options[:validate_mx].nil? or options[:validate_mx] == true
end