1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/net/smtp.rb: changes coding style.

* lib/net/pop.rb: ditto.
* lib/net/protocol.rb: ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3071 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
aamine 2002-11-21 11:50:09 +00:00
parent 15911a95bf
commit f80af5150a
4 changed files with 131 additions and 118 deletions

View file

@ -1,6 +1,14 @@
Thu Nov 21 20:53:06 2002 Minero Aoki <aamine@loveruby.net>
* lib/net/smtp.rb: changes coding style.
* lib/net/pop.rb: ditto.
* lib/net/protocol.rb: ditto.
Thu Nov 21 20:17:08 2002 Minero Aoki <aamine@loveruby.net>
* lib/net/http.rb: unify coding style.
* lib/net/http.rb: changes coding style.
Thu Nov 21 20:04:06 2002 Minero Aoki <aamine@loveruby.net>

View file

@ -341,33 +341,33 @@ module Net
protocol_param :socket_type, '::Net::InternetMessageIO'
def POP3.APOP( bool )
bool ? APOP : POP3
def POP3.APOP( isapop )
isapop ? APOP : POP3
end
def POP3.foreach( address, port = nil,
account = nil, password = nil, &block )
start( address, port, account, password ) {|pop|
pop.each_mail( &block )
account = nil, password = nil, &block )
start(address, port, account, password) {|pop|
pop.each_mail(&block)
}
end
def POP3.delete_all( address, port = nil,
account = nil, password = nil, &block )
start( address, port, account, password ) {|pop|
pop.delete_all( &block )
account = nil, password = nil, &block )
start(address, port, account, password) {|pop|
pop.delete_all(&block)
}
end
def POP3.auth_only( address, port = nil,
account = nil, password = nil )
new( address, port ).auth_only account, password
account = nil, password = nil )
new(address, port).auth_only account, password
end
def auth_only( account, password )
raise IOError, 'opening already opened POP session' if active?
start( account, password ) {
start(account, password) {
# none
}
end
@ -387,10 +387,15 @@ module Net
def do_start( account, password )
conn_socket
@command = (@apop ? self.class.apop_command_type : self.class.command_type).new(socket())
conn_command
@command.auth account, password
end
def conn_command
@command = (@apop ? self.class.apop_command_type :
self.class.command_type).new(socket())
end
def do_finish
@mails = nil
disconn_command
@ -408,15 +413,15 @@ module Net
return @mails if @mails
mails = []
mtype = self.class.mail_type
mailclass = self.class.mail_type
command().list.each_with_index do |size,idx|
mails.push mtype.new(idx, size, command()) if size
mails.push mailclass.new(idx, size, command()) if size
end
@mails = mails.freeze
end
def each_mail( &block )
mails().each( &block )
mails().each(&block)
end
alias each each_mail
@ -479,7 +484,7 @@ module Net
end
def pop( dest = '', &block )
if block then
if block
dest = ReadAdapter.new(block)
end
@command.retr @num, dest
@ -540,7 +545,7 @@ module Net
@socket.each_list_item do |line|
m = /\A(\d+)[ \t]+(\d+)/.match(line) or
raise BadResponse, "illegal response: #{line}"
arr[ m[1].to_i ] = m[2].to_i
arr[m[1].to_i] = m[2].to_i
end
}
arr
@ -575,7 +580,7 @@ module Net
def uidl( num )
atomic {
getok( sprintf('UIDL %d', num) ).message.split(' ')[1]
getok(sprintf('UIDL %d', num)).message.split(/ /)[1]
}
end
@ -598,10 +603,10 @@ module Net
def get_reply
str = @socket.readline
if /\A\+/ === str then
Response.new( SuccessCode, str[0,3], str[3, str.size - 3].strip )
if /\A\+/ === str
Response.new(SuccessCode, str[0,3], str[3, str.size - 3].strip)
else
Response.new( ErrorCode, str[0,4], str[4, str.size - 4].strip )
Response.new(ErrorCode, str[0,4], str[4, str.size - 4].strip)
end
end

View file

@ -25,8 +25,8 @@ module Net
class Protocol
Version = '1.2.3'
Revision = %q$Revision$.split(/\s+/)[1]
Version = '1.2.3'
Revision = '$Revision$'.slice(/[\d\.]+/)
class << self
@ -38,11 +38,11 @@ module Net
private
def protocol_param( name, val )
module_eval <<-End, __FILE__, __LINE__ + 1
def self.#{name.id2name}
#{val}
end
End
module_eval <<-EOS, __FILE__, __LINE__ + 1
def self.#{name.id2name}
#{val}
end
EOS
end
end
@ -65,9 +65,10 @@ module Net
def Protocol.start( address, port = nil, *args )
instance = new(address, port)
if block_given? then
instance.start(*args) { return yield(instance) }
if block_given?
instance.start(*args) {
return yield(instance)
}
else
instance.start(*args)
instance
@ -125,9 +126,9 @@ module Net
def start( *args )
@started and raise IOError, 'protocol has been opened already'
if block_given? then
if block_given?
begin
do_start( *args )
do_start(*args)
@started = true
return yield(self)
ensure
@ -135,7 +136,7 @@ module Net
end
end
do_start( *args )
do_start(*args)
@started = true
self
end
@ -173,7 +174,7 @@ module Net
public
def finish
@started or raise IOError, 'closing already closed protocol'
raise IOError, 'closing already closed protocol' unless @started
do_finish
@started = false
nil
@ -189,9 +190,7 @@ module Net
end
def disconn_socket
if @socket and not @socket.closed? then
@socket.close
end
@socket.close if @socket and not @socket.closed?
@socket = nil
end
@ -274,7 +273,9 @@ module Net
end
def ===( response )
response.code_type.parents.each {|c| c == self and return true }
response.code_type.parents.each do |c|
return true if c == self
end
false
end
@ -284,17 +285,17 @@ module Net
end
ReplyCode = Code.new( [], ProtoUnknownError )
InformationCode = ReplyCode.mkchild( ProtoUnknownError )
SuccessCode = ReplyCode.mkchild( ProtoUnknownError )
ContinueCode = ReplyCode.mkchild( ProtoUnknownError )
ErrorCode = ReplyCode.mkchild( ProtocolError )
SyntaxErrorCode = ErrorCode.mkchild( ProtoSyntaxError )
FatalErrorCode = ErrorCode.mkchild( ProtoFatalError )
ServerErrorCode = ErrorCode.mkchild( ProtoServerError )
AuthErrorCode = ErrorCode.mkchild( ProtoAuthError )
RetriableCode = ReplyCode.mkchild( ProtoRetriableError )
UnknownCode = ReplyCode.mkchild( ProtoUnknownError )
ReplyCode = Code.new([], ProtoUnknownError)
InformationCode = ReplyCode.mkchild(ProtoUnknownError)
SuccessCode = ReplyCode.mkchild(ProtoUnknownError)
ContinueCode = ReplyCode.mkchild(ProtoUnknownError)
ErrorCode = ReplyCode.mkchild(ProtocolError)
SyntaxErrorCode = ErrorCode.mkchild(ProtoSyntaxError)
FatalErrorCode = ErrorCode.mkchild(ProtoFatalError)
ServerErrorCode = ErrorCode.mkchild(ProtoServerError)
AuthErrorCode = ErrorCode.mkchild(ProtoAuthError)
RetriableCode = ReplyCode.mkchild(ProtoRetriableError)
UnknownCode = ReplyCode.mkchild(ProtoUnknownError)
class Command
@ -394,15 +395,15 @@ module Net
def connect( otime )
D "opening connection to #{@address}..."
timeout( otime ) {
@socket = TCPSocket.new( @address, @port )
timeout(otime) {
@socket = TCPsocket.new(@address, @port)
}
@rbuf = ''
end
private :connect
def close
if @socket then
if @socket
@socket.close
D 'closed'
else
@ -438,7 +439,7 @@ module Net
rsize = 0
begin
while rsize + @rbuf.size < len do
while rsize + @rbuf.size < len
rsize += rbuf_moveto(dest, @rbuf.size)
rbuf_fill
end
@ -456,7 +457,7 @@ module Net
rsize = 0
begin
while true do
while true
rsize += rbuf_moveto(dest, @rbuf.size)
rbuf_fill
end
@ -471,9 +472,7 @@ module Net
def readuntil( target, ignore = false )
dest = ''
begin
while true do
idx = @rbuf.index(target)
break if idx
until idx = @rbuf.index(target)
rbuf_fill
end
rbuf_moveto dest, idx + target.size
@ -495,7 +494,7 @@ module Net
BLOCK_SIZE = 1024
def rbuf_fill
until IO.select [@socket], nil, nil, @read_timeout do
until IO.select [@socket], nil, nil, @read_timeout
on_read_timeout
end
@rbuf << @socket.sysread(BLOCK_SIZE)
@ -521,7 +520,7 @@ module Net
D_off 'reading text...'
rsize = 0
while (str = readuntil("\r\n")) != ".\r\n" do
while (str = readuntil("\r\n")) != ".\r\n"
rsize += str.size
dest << str.sub(/\A\./, '')
end
@ -532,7 +531,7 @@ module Net
# private use only (cannot handle 'break')
def each_list_item
while (str = readuntil("\r\n")) != ".\r\n" do
while (str = readuntil("\r\n")) != ".\r\n"
yield str.chop
end
end
@ -610,7 +609,7 @@ module Net
def wpend_in( src )
line = nil
pre = @writtensize
each_crlf_line( src ) do |line|
each_crlf_line(src) do |line|
do_write '.' if line[0] == ?.
do_write line
end
@ -624,13 +623,13 @@ module Net
yield
if not @wbuf.empty? then # unterminated last line
if @wbuf[-1] == ?\r then
if not @wbuf.empty? # unterminated last line
if @wbuf[-1] == ?\r
@wbuf.chop!
end
@wbuf.concat "\r\n"
do_write @wbuf
elsif @writtensize == 0 then # empty src
elsif @writtensize == 0 # empty src
do_write "\r\n"
end
do_write ".\r\n"
@ -642,12 +641,12 @@ module Net
def each_crlf_line( src )
str = m = beg = nil
adding( src ) do
adding(src) do
beg = 0
buf = @wbuf
while buf.index( /\n|\r\n|\r/, beg ) do
while buf.index(/\n|\r\n|\r/, beg)
m = Regexp.last_match
if m.begin(0) == buf.size - 1 and buf[-1] == ?\r then
if m.begin(0) == buf.size - 1 and buf[-1] == ?\r
# "...\r" : can follow "\n..."
break
end
@ -661,30 +660,26 @@ module Net
end
def adding( src )
i = nil
i = s = nil
case src
when String
0.step( src.size - 1, 2048 ) do |i|
0.step(src.size - 1, 2048) do |i|
@wbuf << src[i,2048]
yield
end
when File
while true do
i = src.read(2048)
break unless i
i[0,0] = @wbuf
@wbuf = i
while s = src.read(2048)
s[0,0] = @wbuf
@wbuf = s
yield
end
else
src.each do |i|
@wbuf << i
if @wbuf.size > 2048 then
yield
end
src.each do |s|
@wbuf << s
yield if @wbuf.size > 2048
end
yield unless @wbuf.empty?
end
@ -759,7 +754,7 @@ module Net
end
def <<( str )
call_block str, &@block if @block
call_block(str, &@block) if @block
end
private

View file

@ -21,11 +21,15 @@ This module provides your program the functions to send internet
mail via SMTP, Simple Mail Transfer Protocol. For details of
SMTP itself, refer [RFC2821] ((<URL:http://www.ietf.org/rfc/rfc2821.txt>)).
== What This Module is NOT?
== What is NOT This Module?
This module does NOT provide the functions to compose internet
mail. You must create it by yourself. For details of internet mail
format, see [RFC2822] ((<URL:http://www.ietf.org/rfc/rfc2822.txt>)).
This module does NOT provide functions to compose internet mails.
You must create it by yourself. If you want better mail support,
try RubyMail or TMail. You can get both libraries from RAA.
((<URL:http://www.ruby-lang.org/en/raa.html>))
FYI: official documentation of internet mail is:
[RFC2822] ((<URL:http://www.ietf.org/rfc/rfc2822.txt>)).
== Examples
@ -34,11 +38,11 @@ format, see [RFC2822] ((<URL:http://www.ietf.org/rfc/rfc2822.txt>)).
You must open connection to SMTP server before sending mails.
First argument is the address of SMTP server, and second argument
is port number. Using SMTP.start with block is the most simple way
to do it. SMTP Connection is closed automatically after block is
to do it. SMTP connection is closed automatically after block is
executed.
require 'net/smtp'
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
Net::SMTP.start('your.smtp.server', 25) {|smtp|
# use smtp object only in this block
}
@ -48,10 +52,7 @@ for you.
Then you can send mail.
require 'net/smtp'
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
smtp.send_mail <<EndOfMail, 'your@mail.address', 'to@some.domain'
mail_text = <<END_OF_MAIL
From: Your Name <your@mail.address>
To: Dest Address <to@some.domain>
Subject: test mail
@ -59,7 +60,13 @@ Then you can send mail.
Message-Id: <unique.message.id.string@some.domain>
This is test mail.
EndOfMail
END_OF_MAIL
require 'net/smtp'
Net::SMTP.start('your.smtp.server', 25) {|smtp|
smtp.send_mail mail_text,
'your@mail.address',
'his_addess@example.com'
}
=== Closing Session
@ -70,24 +77,24 @@ closes session automatically. I strongly recommend later one. It is
more beautiful and simple.
# using SMTP#finish
smtp = Net::SMTP.start( 'your.smtp.server', 25 )
smtp = Net::SMTP.start('your.smtp.server', 25)
smtp.send_mail mail_string, 'from@address', 'to@address'
smtp.finish
# using block form of SMTP.start
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
Net::SMTP.start('your.smtp.server', 25) {|smtp|
smtp.send_mail mail_string, 'from@address', 'to@address'
}
=== Sending Mails from Any Sources
=== Sending Mails From non-String Sources
In an example above I sent mail from String (here document literal).
In an example above I has sent mail from String (here document literal).
SMTP#send_mail accepts any objects which has "each" method
like File and Array.
require 'net/smtp'
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
File.open( 'Mail/draft/1' ) {|f|
Net::SMTP.start('your.smtp.server', 25) {|smtp|
File.open('Mail/draft/1') {|f|
smtp.send_mail f, 'your@mail.address', 'to@some.domain'
}
}
@ -248,13 +255,13 @@ module Net
conn_command
begin
if @esmtp then
if @esmtp
command().ehlo helo
else
command().helo helo
end
rescue ProtocolError
if @esmtp then
if @esmtp
@esmtp = false
command().error_ok
retry
@ -263,14 +270,12 @@ module Net
end
end
if user or secret then
(user and secret) or
raise ArgumentError, 'both of account and password are required'
if user or secret
raise ArgumentError, 'both of account and password are required'\
unless user and secret
mid = 'auth_' + (authtype || 'cram_md5').to_s
command().respond_to? mid or
raise ArgumentError, "wrong auth type #{authtype.to_s}"
raise ArgumentError, "wrong auth type #{authtype}"\
unless command().respond_to?(mid)
command().__send__ mid, user, secret
end
end
@ -289,7 +294,7 @@ module Net
def send_mail( mailsrc, from_addr, *to_addrs )
do_ready from_addr, to_addrs.flatten
command().write_mail(mailsrc)
command().write_mail mailsrc
end
alias sendmail send_mail
@ -304,7 +309,7 @@ module Net
def do_ready( from_addr, to_addrs )
raise ArgumentError, 'mail destination does not given' if to_addrs.empty?
command().mailfrom from_addr
command().rcpt(to_addrs)
command().rcpt to_addrs
end
end
@ -344,18 +349,18 @@ module Net
# "CRAM-MD5" authentication [RFC2195]
def auth_cram_md5( user, secret )
atomic {
rep = getok( 'AUTH CRAM-MD5', ContinueCode )
challenge = rep.msg.split(' ')[1].unpack('m')[0]
rep = getok('AUTH CRAM-MD5', ContinueCode)
challenge = rep.msg.split(/ /)[1].unpack('m')[0]
secret = Digest::MD5.digest(secret) if secret.size > 64
isecret = secret + "\0" * (64 - secret.size)
osecret = isecret.dup
0.upto( 63 ) do |i|
0.upto(63) do |i|
isecret[i] ^= 0x36
osecret[i] ^= 0x5c
end
tmp = Digest::MD5.digest( isecret + challenge )
tmp = Digest::MD5.hexdigest( osecret + tmp )
tmp = Digest::MD5.digest(isecret + challenge)
tmp = Digest::MD5.hexdigest(osecret + tmp)
getok [user + ' ' + tmp].pack('m').chomp
}
@ -416,14 +421,14 @@ module Net
end
klass ||= UnknownCode
Response.new( klass, stat, arr.join('') )
Response.new(klass, stat, arr.join(''))
end
def read_reply
arr = []
while true do
while true
str = @socket.readline
break unless str[3] == ?- # ex: "210-..."
break unless str[3] == ?- # "210-PIPELINING"
arr.push str
end
arr.push str