summaryrefslogtreecommitdiff
path: root/lib/net/pop.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/net/pop.rb')
-rw-r--r--lib/net/pop.rb315
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