Class: CogiEmail::Checker

Inherits:
Object
  • Object
show all
Defined in:
lib/cogi_email/checker.rb

Instance Method Summary collapse

Constructor Details

#initialize(email) ⇒ Checker

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

Reference:

https://github.com/kamilc/email_verifier/blob/master/lib/email_verifier/checker.rb


13
14
15
16
17
18
# File 'lib/cogi_email/checker.rb', line 13

def initialize(email)
  @email = email
  @smtp    = nil
  @user_email = '[email protected]'
  _, @user_domain = @user_email.split "@"
end

Instance Method Details

#close_connectionObject



59
60
61
# File 'lib/cogi_email/checker.rb', line 59

def close_connection
  @smtp.finish if @smtp && @smtp.started?
end

#connectObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/cogi_email/checker.rb', line 43

def connect
  list_mxs
  raise CogiEmail::NoMailServerException.new("No mail server for #{@email}") if @servers.empty?

  begin
    server = next_server
    raise CogiEmail::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 CogiEmail::OutOfMailServersException => e
    raise CogiEmail::OutOfMailServersException, e.message
  rescue => e
    retry
  end
end

#domainObject



20
21
22
23
# File 'lib/cogi_email/checker.rb', line 20

def domain
  m = Mail::Address.new(@email)
  @domain = m.domain
end

#is_connectedObject



39
40
41
# File 'lib/cogi_email/checker.rb', line 39

def is_connected
  !@smtp.nil?
end

#list_mxsObject



25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/cogi_email/checker.rb', line 25

def list_mxs
  return [] unless domain
  mxs = []
  Resolv::DNS.open do |dns|
    ress = dns.getresources domain, Resolv::DNS::Resource::IN::MX
    ress.each do |r|
      mxs << { priority: r.preference, address: r.exchange.to_s }
    end
  end

  @servers = mxs.sort_by { |mx| mx[:priority] }
  @servers
end

#next_serverObject



70
71
72
# File 'lib/cogi_email/checker.rb', line 70

def next_server
  @servers.shift
end

#verifyObject



63
64
65
66
67
68
# File 'lib/cogi_email/checker.rb', line 63

def verify
  mailfrom @user_email
  rcptto(@email).tap do
    close_connection
  end
end