diff options
Diffstat (limited to 'lib/net/pop.rb')
-rw-r--r-- | lib/net/pop.rb | 315 |
1 files changed, 240 insertions, 75 deletions
diff --git a/lib/net/pop.rb b/lib/net/pop.rb index bd4551571d..0ec2481557 100644 --- a/lib/net/pop.rb +++ b/lib/net/pop.rb @@ -1,8 +1,14 @@ -# -# pop.rb version 1.0.1 -# -# author: Minero Aoki <aamine@dp.u-netsurf.ne.jp> -# +=begin + += net/pop.rb + +written by Minero Aoki <aamine@dp.u-netsurf.ne.jp> + +This library is distributed under the terms of the Ruby license. +You can freely distribute/modify this library. + +=end + require 'net/session' require 'md5' @@ -10,101 +16,250 @@ require 'md5' module Net - class POP3Session < Session - attr :mails +=begin - def each() @mails.each{|m| yield m} end +== Net::POP3 +=== Super Class - private +Net::Protocol + +=== Class Methods + +: new( address = 'localhost', port = 110 ) + This method create a new POP3 object. + This will not open connection yet. + + +=== Methods + +: start( account, password ) + This method start POP3. + +: each{|popmail| ...} + This method is equals to "pop3.mails.each" +: mails + This method returns an array of ((URL:#POPMail)). + This array is renewed when login. - def proto_initialize - @proto_type = POP3Command - @port = 110 - @mails = [].freeze +=end + + class POP3 < Protocol + + protocol_param :port, '110' + protocol_param :command_type, '::Net::POP3Command' + + protocol_param :mail_type, '::Net::POPMail' + + def initialize( addr = nil, port = nil ) + super + @mails = [].freeze end + + attr :mails + + def each + @mails.each {|m| yield m } + end + + + private + def do_start( acnt, pwd ) - @proto.auth( acnt, pwd ) + @command.auth( acnt, pwd ) + t = self.type.mail_type @mails = [] - @proto.list.each_with_index do |size,idx| + @command.list.each_with_index do |size,idx| if size then - @mails.push POPMail.new( idx, size, @proto ) + @mails.push t.new( idx, size, @command ) end end @mails.freeze end + end - def do_finish - @proto.quit - end + POP = POP3 + POPSession = POP3 + POP3Session = POP3 +=begin - class POPMail +== Net::POPMail - def initialize( idx, siz, pro ) - @num = idx - @size = siz - @proto = pro +A class of mail which exists on POP server. - @deleted = false - end +=== Super Class - attr :size +Object - def all( dest = '' ) - @proto.retr( @num, dest ) - end - alias pop all - alias mail all - def top( lines, dest = '' ) - @proto.top( @num, lines, dest ) - end +=== Method - def header( dest = '' ) - top( 0, dest ) - end +: all +: pop +: mail + This method fetches a mail and return it. - def delete - @proto.dele( @num ) - @deleted = true - end - alias delete! delete +: header + This method fetches only mail header. - def deleted? - @deleted - end +: top( lines ) + This method fetches mail header and 'lines' lines body. + +: delete +: delete! + This method deletes mail. + +: size + size of mail(bytes) + +: deleted? + true if mail was deleted + +=end + + class POPMail + + def initialize( n, s, cmd ) + @num = n + @size = s + @command = cmd + @deleted = false end - end + attr :size - class APOPSession < POP3Session + def all( dest = '' ) + @command.retr( @num, dest ) + end + alias pop all + alias mail all - def proto_initialize - super - @proto_type = APOPCommand + def top( lines, dest = '' ) + @command.top( @num, lines, dest ) + end + + def header( dest = '' ) + top( 0, dest ) + end + + def delete + @command.dele( @num ) + @deleted = true + end + alias delete! delete + + def deleted? + @deleted end + def uidl + @command.uidl @num + end + + end + + +=begin + +== Net::APOP + +This class has no new methods. Only way of authetication is changed. + +=== Super Class + +Net::POP3 + +=end + + class APOP < POP3 + + protocol_param :command_type, 'Net::APOPCommand' + end + APOPSession = APOP + + +=begin + +== Net::POP3Command + +POP3 command class. + +=== Super Class + +Net::Command + +=== Class Methods + +: new( socket ) + This method creates new POP3Command object. 'socket' must be ProtocolSocket. + + +=== Methods + +: auth( account, password ) + This method do POP authorization (no RPOP) + In case of failed authorization, raises Protocol::ProtocolError exception. + +: list + a list of mails which existing on server. + The list is an array like "array[ number ] = size". + + ex: + + The list from server is + + 1 2452 + 2 3355 + 4 9842 + : + + then, an array is - POPSession = POP3Session - POP3 = POP3Session + [ nil, 2452, 3355, nil, 9842, ... ] +: quit + This method ends POP using 'QUIT' commmand. + +: rset + This method reset all changes done in current session, + by sending 'RSET' command. + +: top( num, lines = 0 ) + This method gets all mail header and 'lines' lines body + by sending 'TOP' command. 'num' is mail number. + + WARNING: the TOP command is 'Optional' in RFC1939 (POP3) + +: retr( num : Integer ) + This method gets a mail by 'RETR' command. 'num' is mail number. + +: dele( num : Integer ) + This method deletes a mail on server by 'DELE'. + +=end class POP3Command < Command + def initialize( sock ) + super + check_reply SuccessCode + end + + def auth( acnt, pass ) - @socket.writeline( 'USER ' + acnt ) + @socket.writeline 'USER ' + acnt check_reply_auth @socket.writeline( 'PASS ' + pass ) @@ -115,8 +270,7 @@ module Net def list - @socket.writeline( 'LIST' ) - check_reply( SuccessCode ) + getok 'LIST' arr = [] @socket.read_pendlist do |line| @@ -129,40 +283,40 @@ module Net def rset - @socket.writeline( 'RSET' ) - check_reply( SuccessCode ) + getok 'RSET' end def top( num, lines = 0, dest = '' ) - @socket.writeline( sprintf( 'TOP %d %d', num, lines ) ) - check_reply( SuccessCode ) - - return @socket.read_pendstr( dest ) + getok sprintf( 'TOP %d %d', num, lines ) + @socket.read_pendstr( dest ) end def retr( num, dest = '', &block ) - @socket.writeline( sprintf( 'RETR %d', num ) ) - check_reply( SuccessCode ) - - return @socket.read_pendstr( dest, &block ) + getok sprintf( 'RETR %d', num ) + @socket.read_pendstr( dest, &block ) end def dele( num ) - @socket.writeline( sprintf( 'DELE %s', num ) ) - check_reply( SuccessCode ) + getok sprintf( 'DELE %d', num ) end + def uidl( num ) + rep = getok( sprintf 'UIDL %d', num ) + uid = rep.msg.split(' ')[1] + + uid + end + private def do_quit - @socket.writeline( 'QUIT' ) - check_reply( SuccessCode ) + getok 'QUIT' end @@ -190,6 +344,22 @@ module Net end +=begin + +== APOPCommand + +=== Super Class + +POP3Command + +=== Methods + +: auth( account, password ) + This method do authorization by sending 'APOP' command. + If server is not APOP server, this raises Net::ProtoAuthError exception. + On other errors, raises Net::ProtocolError. + +=end class APOPCommand < POP3Command @@ -222,9 +392,4 @@ module Net end - - unless Session::Version == '1.0.1' then - $stderr.puts "WARNING: wrong version of session.rb & pop.rb" - end - end |