mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
aamine
* lib/net/protocol.rb: calls on_connect before conn_command git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1891 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a20863ff41
commit
fa6dc283cd
8 changed files with 302 additions and 192 deletions
|
@ -1,3 +1,7 @@
|
|||
Sun Dec 9 18:06:26 2001 Minero Aoki <aamine@loveruby.net>
|
||||
|
||||
* lib/net/protocol.rb: calls on_connect before conn_command
|
||||
|
||||
Fri Dec 7 19:12:14 2001 Minero Aoki <aamine@loveruby.net>
|
||||
|
||||
* lib/net/smtp.rb: SMTP.new requires at least one arg.
|
||||
|
|
|
@ -27,8 +27,8 @@
|
|||
|
||||
require 'net/http'
|
||||
Net::HTTP.start( 'some.www.server', 80 ) {|http|
|
||||
response , = http.post( '/cgi-bin/any.rhtml',
|
||||
'querytype=subject&target=ruby' )
|
||||
response , = http.post( '/cgi-bin/any.rhtml',
|
||||
'querytype=subject&target=ruby' )
|
||||
}
|
||||
|
||||
=== プロクシ経由のアクセス
|
||||
|
@ -78,9 +78,9 @@ Net::HTTP
|
|||
require 'net/http'
|
||||
|
||||
Net::HTTP.start( 'auth.some.domain' ) {|http|
|
||||
response , = http.get( '/need-auth.cgi',
|
||||
'Authentication' => ["#{account}:#{password}"].pack('m').strip )
|
||||
print response.body
|
||||
response , = http.get( '/need-auth.cgi',
|
||||
'Authentication' => ["#{account}:#{password}"].pack('m').strip )
|
||||
print response.body
|
||||
}
|
||||
|
||||
バージョン 1.2 (Ruby 1.7 以降に添付) では次のように書けます。
|
||||
|
@ -90,8 +90,8 @@ Net::HTTP
|
|||
req = Net::HTTP::Get.new('/need-auth.cgi')
|
||||
req.basic_auth 'account', 'password'
|
||||
Net::HTTP.start( 'auth.some.domain' ) {|http|
|
||||
response = http.request( req )
|
||||
print response.body
|
||||
response = http.request(req)
|
||||
print response.body
|
||||
}
|
||||
|
||||
== 新しい仕様への変更と移行措置について
|
||||
|
@ -148,11 +148,11 @@ Ruby 1.6
|
|||
|
||||
# example
|
||||
proxy_class = Net::HTTP::Proxy( 'proxy.foo.org', 8080 )
|
||||
:
|
||||
proxy_class.start( 'www.ruby-lang.org' ) do |http|
|
||||
# connecting proxy.foo.org:8080
|
||||
:
|
||||
end
|
||||
:
|
||||
proxy_class.start( 'www.ruby-lang.org' ) {|http|
|
||||
# connecting proxy.foo.org:8080
|
||||
:
|
||||
}
|
||||
|
||||
: proxy_class?
|
||||
自身が (Proxy メソッドによって作成された) プロクシ用のクラスならば真。
|
||||
|
@ -233,13 +233,13 @@ Ruby 1.6
|
|||
|
||||
# using block
|
||||
File.open( 'save.txt', 'w' ) {|f|
|
||||
http.get( '/~foo/', nil ) do |str|
|
||||
f.write str
|
||||
end
|
||||
http.get( '/~foo/', nil ) do |str|
|
||||
f.write str
|
||||
end
|
||||
}
|
||||
# same effect
|
||||
File.open( 'save.txt', 'w' ) {|f|
|
||||
http.get '/~foo/', nil, f
|
||||
http.get '/~foo/', nil, f
|
||||
}
|
||||
|
||||
: head( path, header = nil )
|
||||
|
@ -256,7 +256,7 @@ Ruby 1.6
|
|||
|
||||
response = nil
|
||||
Net::HTTP.start( 'some.www.server', 80 ) {|http|
|
||||
response = http.head( '/index.html' )
|
||||
response = http.head( '/index.html' )
|
||||
}
|
||||
p response['content-type']
|
||||
|
||||
|
@ -283,13 +283,13 @@ Ruby 1.6
|
|||
|
||||
# using block
|
||||
File.open( 'save.html', 'w' ) {|f|
|
||||
http.post( '/cgi-bin/search.rb', 'querytype=subject&target=ruby' ) do |str|
|
||||
f.write str
|
||||
end
|
||||
http.post( '/cgi-bin/search.rb', 'querytype=subject&target=ruby' ) do |str|
|
||||
f.write str
|
||||
end
|
||||
}
|
||||
# same effect
|
||||
File.open( 'save.html', 'w' ) {|f|
|
||||
http.post '/cgi-bin/search.rb', 'querytype=subject&target=ruby', nil, f
|
||||
http.post '/cgi-bin/search.rb', 'querytype=subject&target=ruby', nil, f
|
||||
}
|
||||
|
||||
: get2( path, header = nil )
|
||||
|
@ -309,10 +309,10 @@ Ruby 1.6
|
|||
|
||||
# using block
|
||||
http.get2( '/index.html' ) {|response|
|
||||
p response['content-type']
|
||||
response.read_body do |str| # read body now
|
||||
print str
|
||||
end
|
||||
p response['content-type']
|
||||
response.read_body do |str| # read body now
|
||||
print str
|
||||
end
|
||||
}
|
||||
|
||||
: post2( path, header = nil )
|
||||
|
@ -332,11 +332,11 @@ Ruby 1.6
|
|||
|
||||
# using block
|
||||
http.post2( '/cgi-bin/nice.rb', 'datadatadata...' ) {|response|
|
||||
p response.status
|
||||
p response['content-type']
|
||||
response.read_body do |str| # read body now
|
||||
print str
|
||||
end
|
||||
p response.status
|
||||
p response['content-type']
|
||||
response.read_body do |str| # read body now
|
||||
print str
|
||||
end
|
||||
}
|
||||
|
||||
: request( request [, data] )
|
||||
|
|
|
@ -12,57 +12,93 @@
|
|||
|
||||
=== メールの受信
|
||||
|
||||
メールを受信してファイル 'inbox/1' 'inbox/2'... に書きこみ、
|
||||
サーバ上からメールを消します。
|
||||
pop3.server.address は適宜読みかえてください。
|
||||
以下のコードは、メールを受信してファイル 'inbox/1' 'inbox/2'... に
|
||||
書きこみ、サーバ上からメールを消します。pop3.server.address は適宜
|
||||
読みかえてください。
|
||||
|
||||
require 'net/pop'
|
||||
|
||||
Net::POP3.start( 'pop3.server.address', 110,
|
||||
'YourAccount', 'YourPassword' ) {|pop|
|
||||
if pop.mails.empty? then
|
||||
puts 'no mail.'
|
||||
else
|
||||
i = 0
|
||||
pop.each_mail do |m| # or "pop.mails.each ..."
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
pop = Net::POP3.new( 'pop3.server.address', 110 )
|
||||
pop.start( 'YourAccount', 'YourPassword' ) ###
|
||||
if pop.mails.empty? then
|
||||
puts 'no mail.'
|
||||
else
|
||||
i = 0
|
||||
pop.each_mail do |m| # or "pop.mails.each ..."
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
f.write m.pop
|
||||
}
|
||||
m.delete
|
||||
i += 1
|
||||
end
|
||||
}
|
||||
m.delete
|
||||
i += 1
|
||||
end
|
||||
puts "#{pop.mails.size} mails popped."
|
||||
}
|
||||
end
|
||||
pop.finish ###
|
||||
|
||||
POP サーバはネットワークのむこうに存在するので、なにか仕事をさせる
|
||||
にはその前に開始手続きを、終わったら終了手続きを、行わなければいけ
|
||||
ません。それを行うのが Net::POP3#start と #finish で、POP3 オブジェクト
|
||||
はその二つのメソッドの間でだけ有効になります。
|
||||
|
||||
サーバ上のメールは POPMail オブジェクトとして表現されており、この
|
||||
オブジェクトのメソッドを呼ぶことでメールを取ってきたり消したりする
|
||||
ことができます。POP3#mails はこの POPMail オブジェクトの配列であり、
|
||||
POP3#each_mail はさらに mails.each のショートカットです。
|
||||
|
||||
=== 短くする
|
||||
|
||||
以下は動作は同じでコードを短くしたバージョンです。
|
||||
上の例はあえて省略や短縮用メソッドを避けたためにかなり冗長です。
|
||||
まず、ブロック付きの Net::POP3.start を使うことで POP3.new #start
|
||||
#finish を併合できます。
|
||||
|
||||
require 'net/pop'
|
||||
|
||||
Net::POP3.start( 'pop3.server.address', 110 )
|
||||
'YourAccount', 'YourPassword' )
|
||||
if pop.mails.empty? then
|
||||
puts 'no mail.'
|
||||
else
|
||||
i = 0
|
||||
pop.each_mail do |m| # or "pop.mails.each ..."
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
f.write m.pop
|
||||
}
|
||||
m.delete
|
||||
i += 1
|
||||
end
|
||||
puts "#{pop.mails.size} mails popped."
|
||||
end
|
||||
}
|
||||
|
||||
POP3#delete_all を使うとさらに #each_mail と m.delete を
|
||||
併合できます。
|
||||
|
||||
require 'net/pop'
|
||||
|
||||
Net::POP3.start( 'pop3.server.address', 110,
|
||||
'YourAccount', 'YourPassword' ) {|pop|
|
||||
if pop.mails.empty? then
|
||||
puts 'no mail.'
|
||||
else
|
||||
i = 0
|
||||
pop.delete_all do |m|
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
f.write m.pop
|
||||
}
|
||||
i += 1
|
||||
end
|
||||
end
|
||||
if pop.mails.empty? then
|
||||
puts 'no mail.'
|
||||
else
|
||||
i = 0
|
||||
pop.delete_all do |m|
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
f.write m.pop
|
||||
}
|
||||
i += 1
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
クラスメソッドの POP3.delete_all を使うとさらに短くなります。
|
||||
|
||||
require 'net/pop'
|
||||
|
||||
i = 0
|
||||
Net::POP3.delete_all( 'pop3.server.address', 110,
|
||||
'YourAccount', 'YourPassword' ) do |m|
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
f.write m.pop
|
||||
f.write m.pop
|
||||
}
|
||||
i += 1
|
||||
end
|
||||
|
@ -78,7 +114,7 @@ pop3.server.address
|
|||
Net::POP3.delete_all( 'pop3.server.address', 110,
|
||||
'YourAccount', 'YourPassword' ) do |m|
|
||||
File.open( 'inbox', 'w' ) {|f|
|
||||
m.pop f ####
|
||||
m.pop f ####
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -93,7 +129,7 @@ APOP ǧ
|
|||
require 'net/pop'
|
||||
Net::APOP.start( 'apop.server.address', 110,
|
||||
'YourAccount', 'YourPassword' ) {|pop|
|
||||
# Rest code is same.
|
||||
# Rest code is same.
|
||||
}
|
||||
|
||||
# (2)
|
||||
|
@ -102,7 +138,7 @@ APOP ǧ
|
|||
'YourAccount', 'YourPassword',
|
||||
true ####
|
||||
) {|pop|
|
||||
# Rest code is same.
|
||||
# Rest code is same.
|
||||
}
|
||||
|
||||
== Net::POP3 class
|
||||
|
@ -119,21 +155,21 @@ APOP ǧ
|
|||
password で POP ログインします。第二引数 port に nil を渡すと
|
||||
POP3 のデフォルトポート(110)を使います。
|
||||
|
||||
Net::POP3.start( addr, port, account, password ) do |pop|
|
||||
pop.each_mail do |m|
|
||||
file.write m.pop
|
||||
m.delete
|
||||
end
|
||||
end
|
||||
Net::POP3.start( addr, port, account, password ) {|pop|
|
||||
pop.each_mail do |m|
|
||||
file.write m.pop
|
||||
m.delete
|
||||
end
|
||||
}
|
||||
|
||||
: foreach( address, port = 110, account, password ) {|mail| .... }
|
||||
POP セッションを開き、サーバ上のすべてのメールに対して繰り返します。
|
||||
以下と同じです。
|
||||
|
||||
Net::POP3.start( address, port, account, password ) {|pop|
|
||||
pop.each_mail do |m|
|
||||
yield m
|
||||
end
|
||||
pop.each_mail do |m|
|
||||
yield m
|
||||
end
|
||||
}
|
||||
|
||||
# example
|
||||
|
@ -159,10 +195,10 @@ APOP ǧ
|
|||
POP before SMTP 専用です。
|
||||
|
||||
# example
|
||||
pop = Net::POP3.auth_only( 'your.pop3.server',
|
||||
nil, # using default (110)
|
||||
'YourAccount',
|
||||
'YourPassword' )
|
||||
Net::POP3.auth_only( 'your.pop3.server',
|
||||
nil, # using default (110)
|
||||
'YourAccount',
|
||||
'YourPassword' )
|
||||
|
||||
=== メソッド
|
||||
|
||||
|
@ -249,20 +285,20 @@ POP
|
|||
# example
|
||||
allmails = nil
|
||||
POP3.start( 'your.pop3.server', 110,
|
||||
'YourAccount, 'YourPassword' ) do |pop|
|
||||
allmails = pop.mails.collect {|popmail| popmail.pop }
|
||||
end
|
||||
'YourAccount, 'YourPassword' ) {|pop|
|
||||
allmails = pop.mails.collect {|popmail| popmail.pop }
|
||||
}
|
||||
|
||||
: pop {|str| .... }
|
||||
メールの文字列を少しづつ読みこみ、順次ブロックに与えます。
|
||||
|
||||
# example
|
||||
POP3.start( 'localhost', 110 ) {|pop3|
|
||||
pop3.each_mail do |m|
|
||||
m.pop do |str|
|
||||
# do anything
|
||||
end
|
||||
end
|
||||
pop3.each_mail do |m|
|
||||
m.pop do |str|
|
||||
# do anything
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
: header
|
||||
|
|
|
@ -20,7 +20,7 @@ SMTP
|
|||
|
||||
require 'net/smtp'
|
||||
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
|
||||
# use smtp object only in this block
|
||||
# use smtp object only in this block
|
||||
}
|
||||
|
||||
your.smtp.server は適切な SMTP サーバのアドレスに読みかえてください。
|
||||
|
@ -31,7 +31,7 @@ your.smtp.server
|
|||
require 'net/smtp'
|
||||
|
||||
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
|
||||
smtp.send_mail <<EndOfMail, 'your@mail.address', 'to@some.domain'
|
||||
smtp.send_mail <<EndOfMail, 'your@mail.address', 'to@some.domain'
|
||||
From: Your Name <your@mail.address>
|
||||
To: Dest Address <to@some.domain>
|
||||
Subject: test mail
|
||||
|
@ -42,6 +42,27 @@ your.smtp.server
|
|||
EndOfMail
|
||||
}
|
||||
|
||||
=== セッションを終了する
|
||||
|
||||
メールを送ったら SMTP#finish を呼んでセッションを終了しなければいけ
|
||||
ません。File のように GC 時に勝手に close されることもありません。
|
||||
いろいろなところで finish がないソースコードの例を見掛けますが、
|
||||
すべて誤りです。finish は必ず呼んでください。
|
||||
|
||||
またブロック付きの SMTP.start/SMTP#start を使うと勝手に finish を
|
||||
呼んでくれるので便利です。可能な限りブロック付きの start を使うのが
|
||||
よいでしょう。
|
||||
|
||||
# using SMTP#finish
|
||||
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|
|
||||
smtp.send_mail mail_string, 'from@address', 'to@address'
|
||||
}
|
||||
|
||||
=== 文字列以外からの送信
|
||||
|
||||
ひとつ上の例では文字列リテラル(ヒアドキュメント)を使って送信しましたが、
|
||||
|
@ -50,9 +71,9 @@ each
|
|||
|
||||
require 'net/smtp'
|
||||
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
|
||||
File.open( 'Mail/draft/1' ) {|f|
|
||||
smtp.send_mail f, 'your@mail.address', 'to@some.domain'
|
||||
}
|
||||
File.open( 'Mail/draft/1' ) {|f|
|
||||
smtp.send_mail f, 'your@mail.address', 'to@some.domain'
|
||||
}
|
||||
}
|
||||
|
||||
=== Hello ドメイン
|
||||
|
@ -82,7 +103,7 @@ SMTP
|
|||
|
||||
# example
|
||||
Net::SMTP.start( 'your.smtp.server' ) {
|
||||
smtp.send_mail mail_string, 'from@mail.address', 'dest@mail.address'
|
||||
smtp.send_mail mail_string, 'from@mail.address', 'dest@mail.address'
|
||||
}
|
||||
|
||||
=== メソッド
|
||||
|
@ -128,9 +149,9 @@ SMTP
|
|||
|
||||
# example
|
||||
Net::SMTP.start( 'your.smtp.server' ) {|smtp|
|
||||
smtp.send_mail mail_string,
|
||||
'from@mail.address',
|
||||
'dest@mail.address' 'dest2@mail.address'
|
||||
smtp.send_mail mail_string,
|
||||
'from@mail.address',
|
||||
'dest@mail.address' 'dest2@mail.address'
|
||||
}
|
||||
|
||||
: ready( from_addr, *to_addrs ) {|adapter| .... }
|
||||
|
@ -140,11 +161,11 @@ SMTP
|
|||
|
||||
# example
|
||||
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
|
||||
smtp.ready( 'from@mail.addr', 'dest@mail.addr' ) do |adapter|
|
||||
adapter.write str1
|
||||
adapter.write str2
|
||||
adapter.write str3
|
||||
end
|
||||
smtp.ready( 'from@mail.addr', 'dest@mail.addr' ) do |adapter|
|
||||
adapter.write str1
|
||||
adapter.write str2
|
||||
adapter.write str3
|
||||
end
|
||||
}
|
||||
|
||||
== 発生する例外
|
||||
|
|
|
@ -43,8 +43,8 @@ This is required for compatibility.
|
|||
|
||||
require 'net/http'
|
||||
Net::HTTP.start( 'some.www.server', 80 ) {|http|
|
||||
response , = http.post( '/cgi-bin/any.rhtml',
|
||||
'querytype=subject&target=ruby' )
|
||||
response , = http.post( '/cgi-bin/any.rhtml',
|
||||
'querytype=subject&target=ruby' )
|
||||
}
|
||||
|
||||
=== Accessing via Proxy
|
||||
|
@ -94,9 +94,9 @@ URI class will be included in ruby standard library.
|
|||
require 'net/http'
|
||||
|
||||
Net::HTTP.start( 'auth.some.domain' ) {|http|
|
||||
response , = http.get( '/need-auth.cgi',
|
||||
'Authentication' => ["#{account}:#{password}"].pack('m').strip )
|
||||
print response.body
|
||||
response , = http.get( '/need-auth.cgi',
|
||||
'Authentication' => ["#{account}:#{password}"].pack('m').strip )
|
||||
print response.body
|
||||
}
|
||||
|
||||
In version 1.2 (Ruby 1.7 or later), you can write like this:
|
||||
|
@ -106,8 +106,8 @@ In version 1.2 (Ruby 1.7 or later), you can write like this:
|
|||
req = Net::HTTP::Get.new('/need-auth.cgi')
|
||||
req.basic_auth 'account', 'password'
|
||||
Net::HTTP.start( 'auth.some.domain' ) {|http|
|
||||
response = http.request( req )
|
||||
print response.body
|
||||
response = http.request(req)
|
||||
print response.body
|
||||
}
|
||||
|
||||
== Switching Net::HTTP versions
|
||||
|
@ -157,11 +157,11 @@ Yes, this is not thread-safe.
|
|||
|
||||
# example
|
||||
proxy_class = Net::HTTP::Proxy( 'proxy.foo.org', 8080 )
|
||||
:
|
||||
proxy_class.start( 'www.ruby-lang.org' ) do |http|
|
||||
# connecting proxy.foo.org:8080
|
||||
:
|
||||
end
|
||||
:
|
||||
proxy_class.start( 'www.ruby-lang.org' ) {|http|
|
||||
# connecting proxy.foo.org:8080
|
||||
:
|
||||
}
|
||||
|
||||
: proxy_class?
|
||||
If self is HTTP, false.
|
||||
|
@ -242,13 +242,13 @@ Yes, this is not thread-safe.
|
|||
|
||||
# using block
|
||||
File.open( 'save.txt', 'w' ) {|f|
|
||||
http.get( '/~foo/', nil ) do |str|
|
||||
f.write str
|
||||
end
|
||||
http.get( '/~foo/', nil ) do |str|
|
||||
f.write str
|
||||
end
|
||||
}
|
||||
# same effect
|
||||
File.open( 'save.txt', 'w' ) {|f|
|
||||
http.get '/~foo/', nil, f
|
||||
http.get '/~foo/', nil, f
|
||||
}
|
||||
|
||||
: head( path, header = nil )
|
||||
|
@ -263,7 +263,7 @@ Yes, this is not thread-safe.
|
|||
|
||||
response = nil
|
||||
Net::HTTP.start( 'some.www.server', 80 ) {|http|
|
||||
response = http.head( '/index.html' )
|
||||
response = http.head( '/index.html' )
|
||||
}
|
||||
p response['content-type']
|
||||
|
||||
|
@ -290,13 +290,13 @@ Yes, this is not thread-safe.
|
|||
|
||||
# using block
|
||||
File.open( 'save.html', 'w' ) {|f|
|
||||
http.post( '/cgi-bin/search.rb', 'querytype=subject&target=ruby' ) do |str|
|
||||
f.write str
|
||||
end
|
||||
http.post( '/cgi-bin/search.rb', 'querytype=subject&target=ruby' ) do |str|
|
||||
f.write str
|
||||
end
|
||||
}
|
||||
# same effect
|
||||
File.open( 'save.html', 'w' ) {|f|
|
||||
http.post '/cgi-bin/search.rb', 'querytype=subject&target=ruby', nil, f
|
||||
http.post '/cgi-bin/search.rb', 'querytype=subject&target=ruby', nil, f
|
||||
}
|
||||
|
||||
: get2( path, header = nil )
|
||||
|
@ -315,10 +315,10 @@ Yes, this is not thread-safe.
|
|||
|
||||
# using block
|
||||
http.get2( '/index.html' ) {|response|
|
||||
p response['content-type']
|
||||
response.read_body do |str| # read body now
|
||||
print str
|
||||
end
|
||||
p response['content-type']
|
||||
response.read_body do |str| # read body now
|
||||
print str
|
||||
end
|
||||
}
|
||||
|
||||
: post2( path, header = nil )
|
||||
|
@ -335,11 +335,11 @@ Yes, this is not thread-safe.
|
|||
|
||||
# using block
|
||||
http.post2( '/cgi-bin/nice.rb', 'datadatadata...' ) {|response|
|
||||
p response.status
|
||||
p response['content-type']
|
||||
response.read_body do |str| # read body now
|
||||
print str
|
||||
end
|
||||
p response.status
|
||||
p response['content-type']
|
||||
response.read_body do |str| # read body now
|
||||
print str
|
||||
end
|
||||
}
|
||||
|
||||
: request( request [, data] )
|
||||
|
|
132
lib/net/pop.rb
132
lib/net/pop.rb
|
@ -29,49 +29,81 @@ Replace 'pop3.server.address' your POP3 server address.
|
|||
|
||||
require 'net/pop'
|
||||
|
||||
Net::POP3.start( 'pop3.server.address', 110,
|
||||
'YourAccount', 'YourPassword' ) {|pop|
|
||||
if pop.mails.empty? then
|
||||
puts 'no mail.'
|
||||
else
|
||||
i = 0
|
||||
pop.each_mail do |m| # or "pop.mails.each ..."
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
pop = Net::POP3.new( 'pop3.server.address', 110 )
|
||||
pop.start( 'YourAccount', 'YourPassword' ) ###
|
||||
if pop.mails.empty? then
|
||||
puts 'no mail.'
|
||||
else
|
||||
i = 0
|
||||
pop.each_mail do |m| # or "pop.mails.each ..."
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
f.write m.pop
|
||||
}
|
||||
m.delete
|
||||
i += 1
|
||||
end
|
||||
}
|
||||
m.delete
|
||||
i += 1
|
||||
end
|
||||
puts "#{pop.mails.size} mails popped."
|
||||
}
|
||||
end
|
||||
pop.finish ###
|
||||
|
||||
=== Shorter Version
|
||||
(1) call Net::POP3#start and start POP session
|
||||
(2) access mails by using POP3#each_mail and/or POP3#mails
|
||||
(3) close POP session by calling POP3#finish or use block form #start.
|
||||
|
||||
This example is using block form #start to close the session.
|
||||
=== Enshort Code
|
||||
|
||||
The example above is very verbose. You can enshort code by using
|
||||
some utility methods. At first, block form of Net::POP3.start can
|
||||
alternates POP3.new, POP3#start and POP3#finish.
|
||||
|
||||
require 'net/pop'
|
||||
|
||||
Net::POP3.start( 'pop3.server.address', 110 )
|
||||
'YourAccount', 'YourPassword' )
|
||||
if pop.mails.empty? then
|
||||
puts 'no mail.'
|
||||
else
|
||||
i = 0
|
||||
pop.each_mail do |m| # or "pop.mails.each ..."
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
f.write m.pop
|
||||
}
|
||||
m.delete
|
||||
i += 1
|
||||
end
|
||||
puts "#{pop.mails.size} mails popped."
|
||||
end
|
||||
}
|
||||
|
||||
POP3#delete_all alternates #each_mail and m.delete.
|
||||
|
||||
require 'net/pop'
|
||||
|
||||
Net::POP3.start( 'pop3.server.address', 110,
|
||||
'YourAccount', 'YourPassword' ) {|pop|
|
||||
if pop.mails.empty? then
|
||||
puts 'no mail.'
|
||||
else
|
||||
i = 0
|
||||
pop.delete_all do |m|
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
f.write m.pop
|
||||
}
|
||||
i += 1
|
||||
end
|
||||
end
|
||||
if pop.mails.empty? then
|
||||
puts 'no mail.'
|
||||
else
|
||||
i = 0
|
||||
pop.delete_all do |m|
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
f.write m.pop
|
||||
}
|
||||
i += 1
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
And here is more shorter example.
|
||||
|
||||
require 'net/pop'
|
||||
|
||||
i = 0
|
||||
Net::POP3.delete_all( 'pop3.server.address', 110,
|
||||
'YourAccount', 'YourPassword' ) do |m|
|
||||
File.open( 'inbox/' + i.to_s, 'w' ) {|f|
|
||||
f.write m.pop
|
||||
f.write m.pop
|
||||
}
|
||||
i += 1
|
||||
end
|
||||
|
@ -85,7 +117,7 @@ This example does not create such one.
|
|||
Net::POP3.delete_all( 'pop3.server.address', 110,
|
||||
'YourAccount', 'YourPassword' ) do |m|
|
||||
File.open( 'inbox', 'w' ) {|f|
|
||||
m.pop f ####
|
||||
m.pop f ####
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -99,7 +131,7 @@ net/pop also supports APOP authentication. There's two way to use APOP:
|
|||
require 'net/pop'
|
||||
Net::APOP.start( 'apop.server.address', 110,
|
||||
'YourAccount', 'YourPassword' ) {|pop|
|
||||
# Rest code is same.
|
||||
# Rest code is same.
|
||||
}
|
||||
|
||||
# (2)
|
||||
|
@ -108,7 +140,7 @@ net/pop also supports APOP authentication. There's two way to use APOP:
|
|||
'YourAccount', 'YourPassword',
|
||||
true ####
|
||||
) {|pop|
|
||||
# Rest code is same.
|
||||
# Rest code is same.
|
||||
}
|
||||
|
||||
== Net::POP3 class
|
||||
|
@ -123,21 +155,21 @@ net/pop also supports APOP authentication. There's two way to use APOP:
|
|||
: start( address, port = 110, account, password ) {|pop| .... }
|
||||
equals to Net::POP3.new( address, port ).start( account, password )
|
||||
|
||||
Net::POP3.start( addr, port, account, password ) do |pop|
|
||||
pop.each_mail do |m|
|
||||
file.write m.pop
|
||||
m.delete
|
||||
end
|
||||
end
|
||||
Net::POP3.start( addr, port, account, password ) {|pop|
|
||||
pop.each_mail do |m|
|
||||
file.write m.pop
|
||||
m.delete
|
||||
end
|
||||
}
|
||||
|
||||
: foreach( address, port = 110, account, password ) {|mail| .... }
|
||||
starts POP3 protocol and iterates for each POPMail object.
|
||||
This method equals to
|
||||
|
||||
Net::POP3.start( address, port, account, password ) {|pop|
|
||||
pop.each_mail do |m|
|
||||
yield m
|
||||
end
|
||||
pop.each_mail do |m|
|
||||
yield m
|
||||
end
|
||||
}
|
||||
|
||||
# example
|
||||
|
@ -163,10 +195,10 @@ net/pop also supports APOP authentication. There's two way to use APOP:
|
|||
This method must not be called while POP3 session is opened.
|
||||
|
||||
# example
|
||||
pop = Net::POP3.auth_only( 'your.pop3.server',
|
||||
nil, # using default (110)
|
||||
'YourAccount',
|
||||
'YourPassword' )
|
||||
Net::POP3.auth_only( 'your.pop3.server',
|
||||
nil, # using default (110)
|
||||
'YourAccount',
|
||||
'YourPassword' )
|
||||
|
||||
=== Instance Methods
|
||||
|
||||
|
@ -253,20 +285,20 @@ A class of mail which exists on POP server.
|
|||
# example
|
||||
allmails = nil
|
||||
POP3.start( 'your.pop3.server', 110,
|
||||
'YourAccount, 'YourPassword' ) do |pop|
|
||||
allmails = pop.mails.collect {|popmail| popmail.pop }
|
||||
end
|
||||
'YourAccount, 'YourPassword' ) {|pop|
|
||||
allmails = pop.mails.collect {|popmail| popmail.pop }
|
||||
}
|
||||
|
||||
: pop {|str| .... }
|
||||
gives the block part strings of a mail.
|
||||
|
||||
# example
|
||||
POP3.start( 'localhost', 110 ) {|pop3|
|
||||
pop3.each_mail do |m|
|
||||
m.pop do |str|
|
||||
# do anything
|
||||
end
|
||||
end
|
||||
pop3.each_mail do |m|
|
||||
m.pop do |str|
|
||||
# do anything
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
: header
|
||||
|
|
|
@ -146,8 +146,8 @@ module Net
|
|||
|
||||
def connect
|
||||
conn_socket @address, @port
|
||||
conn_command @socket
|
||||
on_connect
|
||||
conn_command @socket
|
||||
end
|
||||
|
||||
def re_connect
|
||||
|
|
|
@ -37,7 +37,7 @@ executed.
|
|||
|
||||
require 'net/smtp'
|
||||
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
|
||||
# use smtp object only in this block
|
||||
# use smtp object only in this block
|
||||
}
|
||||
|
||||
Replace 'your.smtp.server' by your SMTP server. Normally
|
||||
|
@ -49,7 +49,7 @@ 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'
|
||||
smtp.send_mail <<EndOfMail, 'your@mail.address', 'to@some.domain'
|
||||
From: Your Name <your@mail.address>
|
||||
To: Dest Address <to@some.domain>
|
||||
Subject: test mail
|
||||
|
@ -60,6 +60,23 @@ Then you can send mail.
|
|||
EndOfMail
|
||||
}
|
||||
|
||||
=== Closing Session
|
||||
|
||||
You MUST close SMTP session after sending mails, by calling #finish
|
||||
method. You can also use block form of SMTP.start/SMTP#start, which
|
||||
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.send_mail mail_string, 'from@address', 'to@address'
|
||||
smtp.finish
|
||||
|
||||
# using block form of SMTP.start
|
||||
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
|
||||
smtp.send_mail mail_string, 'from@address', 'to@address'
|
||||
}
|
||||
|
||||
=== Sending Mails from Any Sources
|
||||
|
||||
In an example above I sent mail from String (here document literal).
|
||||
|
@ -68,9 +85,9 @@ like File and Array.
|
|||
|
||||
require 'net/smtp'
|
||||
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
|
||||
File.open( 'Mail/draft/1' ) {|f|
|
||||
smtp.send_mail f, 'your@mail.address', 'to@some.domain'
|
||||
}
|
||||
File.open( 'Mail/draft/1' ) {|f|
|
||||
smtp.send_mail f, 'your@mail.address', 'to@some.domain'
|
||||
}
|
||||
}
|
||||
|
||||
=== Giving "Hello" Domain
|
||||
|
@ -99,7 +116,7 @@ send or reject SMTP session by this data.
|
|||
|
||||
# example
|
||||
Net::SMTP.start( 'your.smtp.server' ) {
|
||||
smtp.send_mail mail_string, 'from@mail.address', 'dest@mail.address'
|
||||
smtp.send_mail mail_string, 'from@mail.address', 'dest@mail.address'
|
||||
}
|
||||
|
||||
=== Instance Methods
|
||||
|
@ -153,9 +170,9 @@ send or reject SMTP session by this data.
|
|||
|
||||
# example
|
||||
Net::SMTP.start( 'your.smtp.server' ) {|smtp|
|
||||
smtp.send_mail mail_string,
|
||||
'from@mail.address',
|
||||
'dest@mail.address' 'dest2@mail.address'
|
||||
smtp.send_mail mail_string,
|
||||
'from@mail.address',
|
||||
'dest@mail.address' 'dest2@mail.address'
|
||||
}
|
||||
|
||||
: ready( from_addr, *to_addrs ) {|adapter| .... }
|
||||
|
@ -169,11 +186,11 @@ send or reject SMTP session by this data.
|
|||
|
||||
# example
|
||||
Net::SMTP.start( 'your.smtp.server', 25 ) {|smtp|
|
||||
smtp.ready( 'from@mail.addr', 'dest@mail.addr' ) do |adapter|
|
||||
adapter.write str1
|
||||
adapter.write str2
|
||||
adapter.write str3
|
||||
end
|
||||
smtp.ready( 'from@mail.addr', 'dest@mail.addr' ) do |adapter|
|
||||
adapter.write str1
|
||||
adapter.write str2
|
||||
adapter.write str3
|
||||
end
|
||||
}
|
||||
|
||||
== Exceptions
|
||||
|
|
Loading…
Reference in a new issue