Class: EmailDetected::Checker

Inherits:
Net::SMTP
  • Object
show all
Defined in:
lib/email_detected/checker.rb

Defined Under Namespace

Classes: MailCheckStatus

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.get_mail_server(host) ⇒ Object



94
95
96
97
98
99
100
101
# 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.sort {|x,y| x.preference <=> y.preference}.first.exchange.to_s
  end
  nil
end

.run(addr, server = nil, decoy_from = nil) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/email_detected/checker.rb', line 62

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 => error
    ret = MailCheckStatus.new(error.to_s[0..2].to_i, error)
  rescue IOError, TimeoutError, ArgumentError => error
    ret = MailCheckStatus.new(-1, error)
  end
  return ret
end

Instance Method Details

#check_mail_addr(to_addr, decoy_from = nil) ⇒ Object

Raises:

  • (IOError)


87
88
89
90
91
92
# File 'lib/email_detected/checker.rb', line 87

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