class EmailAssessor::Address

Constants

PROHIBITED_DOMAIN_CONTENT
PROHIBITED_DOMAIN_PREFIXES
PROHIBITED_DOMAIN_SUFFIXES
PROHIBITED_LOCAL_CONTENT
PROHIBITED_LOCAL_PREFIXES
PROHIBITED_LOCAL_SUFFIXES

Attributes

parsed[RW]

Public Class Methods

new(raw_address) click to toggle source
# File lib/email_assessor/address.rb, line 86
def initialize(raw_address)
  @parse_error = false
  @raw_address = raw_address
  @address = nil
  @valid = nil
  @mx_servers = nil
  @domain_tokens = nil

  begin
    @address = Mail::Address.new(raw_address)
  rescue Mail::Field::ParseError
    @parse_error = true
  end
end
prohibited_domain_regex() click to toggle source
# File lib/email_assessor/address.rb, line 43
def prohibited_domain_regex
  @prohibited_domain_content_regex ||= make_regex(
    prefixes: PROHIBITED_DOMAIN_PREFIXES,
    content: PROHIBITED_DOMAIN_CONTENT,
    suffixes: PROHIBITED_DOMAIN_SUFFIXES
  )
end
prohibited_local_regex() click to toggle source
# File lib/email_assessor/address.rb, line 51
def prohibited_local_regex
  @prohibited_local_content_regex ||= make_regex(
    prefixes: PROHIBITED_LOCAL_PREFIXES,
    content: PROHIBITED_LOCAL_CONTENT,
    suffixes: PROHIBITED_LOCAL_SUFFIXES
  )
end

Private Class Methods

make_regex(prefixes: nil, content: nil, suffixes: nil) click to toggle source
# File lib/email_assessor/address.rb, line 61
def make_regex(prefixes: nil, content: nil, suffixes: nil)
  parts = []

  unless prefixes.nil?
    prefixes.each do |prefix|
      parts << "\\A#{Regexp.escape(prefix)}"
    end
  end

  unless content.nil?
    content.each do |prefix|
      parts << Regexp.escape(prefix)
    end
  end

  unless suffixes.nil?
    suffixes.each do |prefix|
      parts << "#{Regexp.escape(prefix)}\\z"
    end
  end

  Regexp.new(parts.join("|"), Regexp::IGNORECASE)
end

Public Instance Methods

blacklisted?() click to toggle source
# File lib/email_assessor/address.rb, line 121
def blacklisted?
  domain_in_list?(EmailAssessor.blacklisted_domains)
end
disposable?() click to toggle source
# File lib/email_assessor/address.rb, line 117
def disposable?
  domain_in_list?(EmailAssessor.disposable_domains)
end
educational?() click to toggle source
# File lib/email_assessor/address.rb, line 125
def educational?
  domain_in_list?(EmailAssessor.educational_domains)
end
fastpass?() click to toggle source
# File lib/email_assessor/address.rb, line 129
def fastpass?
  domain_in_list?(EmailAssessor.fastpass_domains)
end
mx_servers() click to toggle source
# File lib/email_assessor/address.rb, line 137
def mx_servers
  @mx_servers ||= Resolv::DNS.open do |dns|
    mx_servers = dns.getresources(@address.domain, Resolv::DNS::Resource::IN::MX)
    (mx_servers.any? && mx_servers) ||
      dns.getresources(@address.domain, Resolv::DNS::Resource::IN::A)
  end
end
valid?() click to toggle source
# File lib/email_assessor/address.rb, line 101
def valid?
  return @valid unless @valid.nil?
  return false if @parse_error

  @valid =
    if @address.domain && @address.address == @raw_address
      domain = @address.domain

      domain.include?('.') &&
        !domain.match?(self.class.prohibited_domain_regex) &&
        !@address.local.match?(self.class.prohibited_local_regex)
    else
      false
    end
end
valid_mx?() click to toggle source
# File lib/email_assessor/address.rb, line 133
def valid_mx?
  valid? && mx_servers.any?
end

Private Instance Methods

domain_in_list?(list) click to toggle source
# File lib/email_assessor/address.rb, line 147
def domain_in_list?(list)
  valid? && list.include_any?(domain_tokens)
end
domain_tokens() click to toggle source
# File lib/email_assessor/address.rb, line 151
def domain_tokens
  @domain_tokens ||= EmailAssessor.tokenize_domain(@address.domain)
end