class ValidEmail2::Address

Constants

DEFAULT_RECIPIENT_DELIMITER
DOT_DELIMITER
PROHIBITED_DOMAIN_CHARACTERS_REGEX

Attributes

address[RW]

Public Class Methods

new(address, dns_timeout = 5, dns_nameserver = nil) click to toggle source
# File lib/valid_email2/address.rb, line 25
def initialize(address, dns_timeout = 5, dns_nameserver = nil)
  @parse_error = false
  @raw_address = address
  @dns_timeout = dns_timeout
  @dns_nameserver = dns_nameserver

  begin
    @address = Mail::Address.new(address)
  rescue Mail::Field::ParseError
    @parse_error = true
  end

  @parse_error ||= address_contain_emoticons?
end
prohibited_domain_characters_regex() click to toggle source
# File lib/valid_email2/address.rb, line 17
def self.prohibited_domain_characters_regex
  @prohibited_domain_characters_regex ||= PROHIBITED_DOMAIN_CHARACTERS_REGEX
end
prohibited_domain_characters_regex=(val) click to toggle source
# File lib/valid_email2/address.rb, line 21
def self.prohibited_domain_characters_regex=(val)
  @prohibited_domain_characters_regex = val
end

Public Instance Methods

allow_listed?() click to toggle source
# File lib/valid_email2/address.rb, line 87
def allow_listed?
  domain_is_in?(ValidEmail2.allow_list)
end
deny_listed?() click to toggle source
# File lib/valid_email2/address.rb, line 91
def deny_listed?
  valid? && domain_is_in?(ValidEmail2.deny_list)
end
disposable?() click to toggle source
# File lib/valid_email2/address.rb, line 75
def disposable?
  disposable_domain? || disposable_mx_server?
end
disposable_domain?() click to toggle source
# File lib/valid_email2/address.rb, line 79
def disposable_domain?
  domain_is_in?(ValidEmail2.disposable_emails)
end
disposable_mx_server?() click to toggle source
# File lib/valid_email2/address.rb, line 83
def disposable_mx_server?
  valid? && mx_server_is_in?(ValidEmail2.disposable_emails)
end
dotted?() click to toggle source
# File lib/valid_email2/address.rb, line 67
def dotted?
  valid? && address.local.include?(DOT_DELIMITER)
end
subaddressed?() click to toggle source
# File lib/valid_email2/address.rb, line 71
def subaddressed?
  valid? && address.local.include?(DEFAULT_RECIPIENT_DELIMITER)
end
valid?() click to toggle source
# File lib/valid_email2/address.rb, line 40
def valid?
  return @valid unless @valid.nil?
  return false  if @parse_error

  @valid = valid_domain? && valid_address?
end
valid_address?() click to toggle source
# File lib/valid_email2/address.rb, line 59
def valid_address?
  return false if address.address != @raw_address

  !address.local.include?('..') &&
    !address.local.end_with?('.') &&
    !address.local.start_with?('.')
end
valid_domain?() click to toggle source
# File lib/valid_email2/address.rb, line 47
def valid_domain?
  domain = address.domain
  return false if domain.nil?

  domain !~ self.class.prohibited_domain_characters_regex &&
    domain.include?('.') &&
    !domain.include?('..') &&
    !domain.start_with?('.') &&
    !domain.start_with?('-') &&
    !domain.include?('-.')
end
valid_mx?() click to toggle source
# File lib/valid_email2/address.rb, line 95
def valid_mx?
  return false unless valid?
  return false if null_mx?

  mx_or_a_servers.any?
end
valid_strict_mx?() click to toggle source
# File lib/valid_email2/address.rb, line 102
def valid_strict_mx?
  return false unless valid?
  return false if null_mx?

  mx_servers.any?
end

Private Instance Methods

address_contain_emoticons?() click to toggle source
# File lib/valid_email2/address.rb, line 133
def address_contain_emoticons?
  return false if @raw_address.nil?

  @raw_address.scan(Unicode::Emoji::REGEX).length >= 1
end
domain_is_in?(domain_list) click to toggle source
# File lib/valid_email2/address.rb, line 111
def domain_is_in?(domain_list)
  address_domain = address.domain.downcase
  return true if domain_list.include?(address_domain)

  i = address_domain.index('.')
  return false unless i

  domain_list.include?(address_domain[(i + 1)..-1])
end
mx_or_a_servers() click to toggle source
# File lib/valid_email2/address.rb, line 164
def mx_or_a_servers
  @mx_or_a_servers_cache ||= ValidEmail2::DnsRecordsCache.new

  @mx_or_a_servers_cache.fetch(address.domain.downcase) do
    Resolv::DNS.open(resolv_config) do |dns|
      dns.timeouts = @dns_timeout
      (mx_servers.any? && mx_servers) ||
        dns.getresources(address.domain, Resolv::DNS::Resource::IN::A)
    end
  end
end
mx_server_is_in?(domain_list) click to toggle source
# File lib/valid_email2/address.rb, line 121
def mx_server_is_in?(domain_list)
  mx_servers.any? { |mx_server|
    return false unless mx_server.respond_to?(:exchange)

    mx_server = mx_server.exchange.to_s

    domain_list.any? { |domain|
      mx_server.end_with?(domain) && mx_server =~ /\A(?:.+\.)*?#{domain}\z/
    }
  }
end
mx_servers() click to toggle source
# File lib/valid_email2/address.rb, line 149
def mx_servers
  @mx_servers_cache ||= ValidEmail2::DnsRecordsCache.new

  @mx_servers_cache.fetch(address.domain.downcase) do
    Resolv::DNS.open(resolv_config) do |dns|
      dns.timeouts = @dns_timeout
      dns.getresources(address.domain, Resolv::DNS::Resource::IN::MX)
    end
  end
end
null_mx?() click to toggle source
# File lib/valid_email2/address.rb, line 160
def null_mx?
  mx_servers.length == 1 && mx_servers.first.preference == 0 && mx_servers.first.exchange.length == 0
end
resolv_config() click to toggle source
# File lib/valid_email2/address.rb, line 139
def resolv_config
  @resolv_config ||= begin
    config = Resolv::DNS::Config.default_config_hash
    config[:nameserver] = @dns_nameserver if @dns_nameserver
    config
  end

  @resolv_config
end