Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > library net/pop
library net/pop
要約
メールを受信するためのプロトコル POP3 (Post Office Protocol version 3) を扱うライブラリです。
POP3 の実装は [RFC1939] に基いています。
使用例
メールの受信
以下のコードは、メールを受信してファイル 'inbox/1' 'inbox/2'... に 書きこみ、サーバ上からメールを消します。pop3.server.address は適宜 読みかえてください。
require 'net/pop' pop = Net::POP3.new('pop3.server.address', 110) pop.start('YourAccount', 'YourPassword') ### if pop.mails.empty? $stderr.puts 'no mail.' else pop.mails.each_with_index do |m, idx| File.open("inbox/#{idx + 1}", 'w') {|f| f.write m.pop } m.delete end $stderr.puts "#{pop.mails.size} mails popped." end pop.finish ###
POP サーバはネットワークのむこうに存在するので、 なにか仕事をさせるにはその前に開始手続きを、 終わったら終了手続きを、行わなければいけません。 それを行うのが Net::POP3#start と Net::POP3#finish で、 POP3 オブジェクトはその二つのメソッドの間でだけ有効になります。
サーバ上のメールは POPMail オブジェクトとして表現されており、この オブジェクトのメソッドを呼ぶことでメールを取ってきたり消したりする ことができます。Net::POP3#mails はこの POPMail オブジェクトの配列であり、 Net::POP3#each_mail はさらに pop.mails.each のショートカットです。
短くする
上の例はあえて省略や短縮用メソッドを避けたためにかなり冗長です。 まず、ブロック付きの Net::POP3.start を使うことで POP3.new, #start, #finish を併合できます。
require 'net/pop' Net::POP3.start('pop3.server.address', 110, 'YourAccount', 'YourPassword') {|pop| if pop.mails.empty? $stderr.puts 'no mail.' else pop.mails.each_with_index do |m, idx| File.open("inbox/#{idx + 1}", 'w') {|f| f.write m.pop } m.delete end $stderr.puts "#{pop.mails.size} mails popped." end }
Net::POP3#delete_all を使うと さらに Net::POP3#each_mail と Net::POP3#delete を併合できます。
require 'net/pop' Net::POP3.start('pop3.server.address', 110, 'YourAccount', 'YourPassword') {|pop| if pop.mails.empty? $stderr.puts 'no mail.' else i = 0 pop.delete_all do |m| File.open("inbox/#{i}", 'w') {|f| f.write m.pop } i += 1 end end }
クラスメソッドの Net::POP3.delete_all を使うとさらに短くなります。
require 'net/pop' i = 0 Net::POP3.delete_all('pop3.server.address', 110, 'YourAccount', 'YourPassword') do |m| File.open("inbox/#{i}", 'w') {|f| f.write m.pop } i += 1 end
ファイルに直接書く
これまでの例では Net::POPMail#pop を使い、 メールをひとつの文字列としてうけとっていました。 しかし、もしメールが 100MB を越えるような巨大なメールだった場合、 この方法ではまずいかもしれません。 そのような場合は以下のように Net::POPMail#pop に File オブジェクトを与える手が使えます。
require 'net/pop' Net::POP3.delete_all('pop3.server.address', 110, 'YourAccount', 'YourPassword') do |m| File.open('inbox', 'w') {|f| m.pop f #### } end
APOP を使う
Net::POP3 クラスのかわりに Net::APOP クラスを使うと、 認証時に APOP を使うようになります。 また動的にノーマル POP と APOP を選択するには、 以下のように Net::POP3.APOP メソッドを使うのが便利です。
require 'net/pop' # use APOP authentication if $isapop == true pop = Net::POP3.APOP($isapop).new('apop.server.address', 110) pop.start(YourAccount', 'YourPassword') {|pop| # 残りのコードは同じ }
この方法はクラス自体を変えるので、クラスメソッドの start や foreach、 delete_all、auth_only なども APOP とともに使えます。
クラスとモジュール
class Net::APOP | このクラスでは新しいメソッドは導入していません。 認証方式が APOP に変わるだけです。 |
class Net::POP3 | |
class Net::POPMail | POP サーバー上のメール一通を表現するクラス。 メールの取得や消去といった操作をカプセル化します。 |
例外クラス
class Net::ProtocolError | |
class Net::POPError | POP3 の、認証以外のエラーが起きたときに発生します。 |
class Net::POPBadResponse | サーバから予期しないレスポンスが帰ってきたときに発生します。 |
class Net::ProtoAuthError | |
class Net::POPAuthenticationError | POP3 で認証に失敗したときに発生します。 |