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