class Net::POP3Command
:nodoc: internal use only
def apop(account, password)
def apop(account, password) raise POPAuthenticationError, 'not APOP server; cannot login' \ unless @apop_stamp check_response_auth(critical { get_response('APOP %s %s', account, Digest::MD5.hexdigest(@apop_stamp + password)) }) end
def auth(account, password)
def auth(account, password) check_response_auth(critical { check_response_auth(get_response('USER %s', account)) get_response('PASS %s', password) }) end
def check_response(res)
def check_response(res) raise POPError, res unless /\A\+OK/i =~ res res end
def check_response_auth(res)
def check_response_auth(res) raise POPAuthenticationError, res unless /\A\+OK/i =~ res res end
def critical
def critical return '+OK dummy ok response' if @error_occurred begin return yield() rescue Exception @error_occurred = true raise end end
def dele(num)
def dele(num) check_response(critical { get_response('DELE %d', num) }) end
def get_response(fmt, *fargs)
def get_response(fmt, *fargs) @socket.writeline sprintf(fmt, *fargs) recv_response() end
def getok(fmt, *fargs)
def getok(fmt, *fargs) @socket.writeline sprintf(fmt, *fargs) check_response(recv_response()) end
def initialize(sock)
def initialize(sock) @socket = sock @error_occurred = false res = check_response(critical { recv_response() }) @apop_stamp = res.slice(/<[!-~]+@[!-~]+>/) end
def inspect
def inspect +"#<#{self.class} socket=#{@socket}>" end
def list
def list critical { getok 'LIST' list = [] @socket.each_list_item do |line| m = /\A(\d+)[ \t]+(\d+)/.match(line) or raise POPBadResponse, "bad response: #{line}" list.push [m[1].to_i, m[2].to_i] end return list } end
def quit
def quit check_response(critical { get_response('QUIT') }) end
def recv_response
def recv_response @socket.readline end
def retr(num, &block)
def retr(num, &block) critical { getok('RETR %d', num) @socket.each_message_chunk(&block) } end
def rset
def rset check_response(critical { get_response('RSET') }) end
def stat
def stat res = check_response(critical { get_response('STAT') }) m = /\A\+OK\s+(\d+)\s+(\d+)/.match(res) or raise POPBadResponse, "wrong response format: #{res}" [m[1].to_i, m[2].to_i] end
def top(num, lines = 0, &block)
def top(num, lines = 0, &block) critical { getok('TOP %d %d', num, lines) @socket.each_message_chunk(&block) } end
def uidl(num = nil)
def uidl(num = nil) if num res = check_response(critical { get_response('UIDL %d', num) }) return res.split(/ /)[1] else critical { getok('UIDL') table = {} @socket.each_list_item do |line| num, uid = line.split(' ') table[num.to_i] = uid end return table } end end