From: Keisuke Minami Date: 2003-05-01T13:22:01+09:00 Subject: [ruby-list:37637] Re: net/pop.rbにUIDLコマンドでMessage-Idのリストを取得するメソッド 三並です。 > > > > 実は 1.8 では既に POP3#uidl と POPMail#uidl が実装されています。 > > > > > どうも、UIDLコマンドでは、1つのメールの情報を取る機能しかないようです。 > > > > あっと、すみません。実装したような気がしてたんですが、 > > ないですね。追加しときます。 > > と思ったんですが考えなおしました。三並さんの実装だと > POP3#list_mid は UID の配列 (そのインデックスはメール番号) > を返しますが、これでは二つの点でまずいように思います。 > > * 返り値の形式が使いにくい (nilが混じる可能性が高い) > * 必ずしも通信量が最小にならない (中略) > * 一度でも UIDL を引数なしで呼んだら UIDL コマンドは > 二度と発行してはならない > > はずです。 > > で、長くなりましたが、まず POP3#list_mid が欲しくなった > 理由をお聞きたいのです。それによって実装を変えようと思います。 もともとの理由は、POP上でIMAPのように、 uidを指定して、特定のメール情報だけを読み出したかったので、 POP3#list_midが欲しくなりました。 #何をとぼけていたのか、retrもあわせて外部から呼べないと #意味が無いことに、さっき気がつきました。 メールクライアント内の実装としては、 以下のようにして、先にメールの一覧を作っておき、 pop = Net::POP3.APOP(apop]).new(server, port) pop.mails.each do |m| m_id = m.uidl m_header = m.header # リストを作る end ユーザーからのリクエストで、特定のメールの内容だけ引っ張り出すような ことを行おうと考えていました。 (以下のコードは仮です) def get_mail_body(uid) mids_hash = pop.list_mid mids_hash.each do |no, mid| if mid == uid mail_data = pop.retr(no) end end mail_data end POP3プロトコルの仕様上、メールの一覧を取得するのに無駄が多いのはしょうがないのですが、 特定のひとつのメールだけを取り出すには、UIDLとRETRを組み合わせるだけで うまく行くと思ったのです。 理想的には、net/pop.rb側で、 > * 一度でも UIDL を引数なしで呼んだら UIDL コマンドは > 二度と発行してはならない まで実装されるのが、理想かとは思いますが、 POP3コマンドのコマンドの直接呼び出し用の 低レベルインターフェースの実装だけでも 十分事足りるかもしれないです。 では。