[ruby-list:37637] Re: net/pop.rbにUIDLコマンドでMessage-Idのリストを取得するメソッド

From: "Keisuke Minami" <keisuke@...>
Date: 2003-05-01 04:22:01 UTC
List: ruby-list #37637
三並です。

> > > > 実は 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コマンドのコマンドの直接呼び出し用の
低レベルインターフェースの実装だけでも
十分事足りるかもしれないです。

では。


In This Thread