class MailCheck

Public Class Methods

get_mail_server(host) click to toggle source
# File lib/rails/real/email/mail_check.rb, line 92
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) click to toggle source
# File lib/rails/real/email/mail_check.rb, line 59
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 ||= "#{ENV['USER']}@#{ENV['HOSTNAME']}"

  ret = nil
  begin
    MailCheck.start(server) do |smtp|
      ret = smtp.check_mail_addr(addr, decoy_from)
      ret = MailCheckStatus.new(ret[0..2].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

Public Instance Methods

check_mail_addr(to_addr, decoy_from = nil) click to toggle source
# File lib/rails/real/email/mail_check.rb, line 85
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