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:
		
							parent
							
								
									15911a95bf
								
							
						
					
					
						commit
						f80af5150a
					
				
					 4 changed files with 131 additions and 118 deletions
				
			
		
							
								
								
									
										10
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								ChangeLog
									
										
									
									
									
								
							|  | @ -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> | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 aamine
						aamine