class CogiEmail::Checker

Public Class Methods

new(email) 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

Reference:

https://github.com/kamilc/email_verifier/blob/master/lib/email_verifier/checker.rb
   # File lib/cogi_email/checker.rb
13 def initialize(email)
14   @email = email
15   @smtp    = nil
16   @user_email = 'nobody@nonexistant.com'
17   _, @user_domain = @user_email.split "@"
18 end

Public Instance Methods

close_connection() click to toggle source
   # File lib/cogi_email/checker.rb
59 def close_connection
60   @smtp.finish if @smtp && @smtp.started?
61 end
connect() click to toggle source
   # File lib/cogi_email/checker.rb
43 def connect
44   list_mxs
45   raise CogiEmail::NoMailServerException.new("No mail server for #{@email}") if @servers.empty?
46 
47   begin
48     server = next_server
49     raise CogiEmail::OutOfMailServersException.new("Unable to connect to any one of mail servers for #{@email}") if server.nil?
50     @smtp = Net::SMTP.start server[:address], 25, @user_domain
51     return true
52   rescue CogiEmail::OutOfMailServersException => e
53     raise CogiEmail::OutOfMailServersException, e.message
54   rescue => e
55     retry
56   end
57 end
domain() click to toggle source
   # File lib/cogi_email/checker.rb
20 def domain
21   m = Mail::Address.new(@email)
22   @domain = m.domain
23 end
is_connected() click to toggle source
   # File lib/cogi_email/checker.rb
39 def is_connected
40   !@smtp.nil?
41 end
list_mxs() click to toggle source
   # File lib/cogi_email/checker.rb
25 def list_mxs
26   return [] unless domain
27   mxs = []
28   Resolv::DNS.open do |dns|
29     ress = dns.getresources domain, Resolv::DNS::Resource::IN::MX
30     ress.each do |r|
31       mxs << { priority: r.preference, address: r.exchange.to_s }
32     end
33   end
34 
35   @servers = mxs.sort_by { |mx| mx[:priority] }
36   @servers
37 end
next_server() click to toggle source
   # File lib/cogi_email/checker.rb
70 def next_server
71   @servers.shift
72 end
verify() click to toggle source
   # File lib/cogi_email/checker.rb
63 def verify
64   mailfrom @user_email
65   rcptto(@email).tap do
66     close_connection
67   end
68 end

Private Instance Methods

ensure_250(smtp_return) click to toggle source
    # File lib/cogi_email/checker.rb
100 def ensure_250(smtp_return)
101   if smtp_return.status.to_i == 250
102     return true
103   else
104     raise CogiEmail::FailureException.new "Mail server responded with #{smtp_return.status} when we were expecting 250"
105   end
106 end
ensure_connected() click to toggle source
   # File lib/cogi_email/checker.rb
76 def ensure_connected
77   raise CogiEmail::NotConnectedException.new("You have to connect first") if @smtp.nil?
78 end
mailfrom(address) click to toggle source
   # File lib/cogi_email/checker.rb
80 def mailfrom(address)
81   ensure_connected
82 
83   ensure_250 @smtp.mailfrom(address)
84 end
rcptto(address) click to toggle source
   # File lib/cogi_email/checker.rb
86 def rcptto(address)
87   ensure_connected
88 
89   begin
90     ensure_250 @smtp.rcptto(address)
91   rescue => e
92     if e.message[/^550/]
93       return false
94     else
95       raise CogiEmail::FailureException.new(e.message)
96     end
97   end
98 end