class EmailDetected::Checker

Public Class Methods

get_mail_server(host) click to toggle source
# File lib/email_detected/checker.rb, line 94
def self.get_mail_server(host)
  res = Resolv::DNS.new.getresources(host, Resolv::DNS::Resource::IN::MX)
  unless res.empty?
    # FIXME: should return the whole list
    return res.min { |x, y| x.preference <=> y.preference }.exchange.to_s
  end

  nil
end
run(addr, server = nil, decoy_from = nil) click to toggle source
# File lib/email_detected/checker.rb, line 61
def self.run(addr, server = nil, decoy_from = nil)
  # FIXME: needs a better mail address parser
  server = get_mail_server(addr[(addr.index('@') + 1)..-1]) if server.nil?

  # This only needs to be something the receiving SMTP server
  # accepts.  We aren't actually sending any mail.
  decoy_from ||= EmailDetected.config.verifier_email
  ret = nil
  begin
    EmailDetected::Checker.start(server) do |smtp|
      ret = smtp.check_mail_addr(addr, decoy_from)
      ret = MailCheckStatus.new(ret.status.to_i)
    end
  rescue Net::SMTPAuthenticationError,
         Net::SMTPServerBusy,
         Net::SMTPSyntaxError,
         Net::SMTPFatalError,
         Net::SMTPUnknownError => e
    ret = MailCheckStatus.new(e.to_s[0..2].to_i, e)
  rescue IOError, TimeoutError, ArgumentError => e
    ret = MailCheckStatus.new(-1, e)
  end
  ret
end

Public Instance Methods

check_mail_addr(to_addr, decoy_from = nil) click to toggle source
# File lib/email_detected/checker.rb, line 86
def check_mail_addr(to_addr, decoy_from = nil)
  raise IOError, 'closed session' unless @socket
  raise ArgumentError, 'mail destination not given' if to_addr.empty?

  mailfrom decoy_from
  rcptto to_addr
end