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