class EmailVerifier::Checker

Public Class Methods

new(address) click to toggle source

Returns server object for given email address or throws exception Object returned isn’t yet connected. It has internally a list of real mail servers got from MX dns lookup

# File lib/email_verifier/checker.rb, line 10
def initialize(address)
  @email   = address
  _, @domain  = address.split("@")
  @servers = list_mxs @domain
  raise EmailVerifier::NoMailServerException.new("No mail server for #{address}") if @servers.empty?
  @smtp    = nil

  # this is because some mail servers won't give any info unless
  # a real user asks for it:
  @user_email = EmailVerifier.config.verifier_email
  _, @user_domain = @user_email.split "@"
end

Public Instance Methods

close_connection() click to toggle source
# File lib/email_verifier/checker.rb, line 63
def close_connection
  @smtp.finish if @smtp && @smtp.started?
end
connect() click to toggle source
# File lib/email_verifier/checker.rb, line 39
def connect
  begin
    server = next_server
    raise EmailVerifier::OutOfMailServersException.new("Unable to connect to any one of mail servers for #{@email}") if server.nil?
    @smtp = Net::SMTP.start server[:address], 25, @user_domain
    return true
  rescue EmailVerifier::OutOfMailServersException => e
    raise EmailVerifier::OutOfMailServersException, e.message
  rescue => e
    retry
  end
end
ensure_250(smtp_return) click to toggle source
# File lib/email_verifier/checker.rb, line 91
def ensure_250(smtp_return)
  if smtp_return.status.to_i == 250
    return true
  else
    raise EmailVerifier::FailureException.new "Mail server responded with #{smtp_return.status} when we were expecting 250"
  end
end
ensure_connected() click to toggle source
# File lib/email_verifier/checker.rb, line 87
def ensure_connected
  raise EmailVerifier::NotConnectedException.new("You have to connect first") if @smtp.nil?
end
is_connected() click to toggle source
# File lib/email_verifier/checker.rb, line 35
def is_connected
  !@smtp.nil?
end
list_mxs(domain) click to toggle source
# File lib/email_verifier/checker.rb, line 23
def list_mxs(domain)
  return [] unless domain
  res = Dnsruby::DNS.new
  mxs = []
  res.each_resource(domain, 'MX') do |rr|
    mxs << { priority: rr.preference, address: rr.exchange.to_s }
  end
  mxs.sort_by { |mx| mx[:priority] }
rescue Dnsruby::NXDomain
  raise EmailVerifier::NoMailServerException.new("#{domain} does not exist") 
end
mailfrom(address) click to toggle source
# File lib/email_verifier/checker.rb, line 67
def mailfrom(address)
  ensure_connected

  ensure_250 @smtp.mailfrom(address)
end
next_server() click to toggle source
# File lib/email_verifier/checker.rb, line 52
def next_server
  @servers.shift
end
rcptto(address) click to toggle source
# File lib/email_verifier/checker.rb, line 73
def rcptto(address)
  ensure_connected
 
  begin
    ensure_250 @smtp.rcptto(address)
  rescue => e
    if e.message[/^550/]
      return false
    else
      raise EmailVerifier::FailureException.new(e.message)
    end
  end
end
verify() click to toggle source
# File lib/email_verifier/checker.rb, line 56
def verify
  self.mailfrom @user_email
  self.rcptto(@email).tap do
    close_connection
  end
end