2003-01-22 121618 [長年日記]

X-UIDLとUID

POP3サーバとしてたぶん一番使われているんじゃないかと思われるQpopperのことなんですが、一回UIDを計算するとX-UIDLというヘッダにこの値を書き込んでおいて再利用するようになっているようです(デフォルトでは)。このため、元々X-UIDLがついているメールが配信されるとその値をUIDとして使ってしまいます。さらにそれが重複していた場合でもお構いなしなのです。そもそもはSMTPサーバがローカルスプールに配信する際にX-UIDLヘッダをカットするべきだと思いますが、そうなっていないメールサーバもあるようです。

で、QMAIL側ではUIDは重複しないことを前提にしているので、複数のメールのUIDが重複していると最初のメールしかダウンロードされません。さらに、UIDLコマンドで取得できるメール数とローカルに保存しているUIDのメール数が異なるために、毎回全UIDを取得しようとしてしまいます。うまく回避できないかなと思っているのですが、単純にやるとサーバ上の未読メール管理機能自体(別のクライアントなどから一部のメールだけ削除された場合などに重複受信しないようにするところとか)がちゃんと動かなくなるので、どうしたものかというところですね。

BODYSTRUCTUREのバグ回避

ここに書いたBODYSTRUCTUREのバグの回避ですが、最初にBODYSTRUCTUREを発行しないオプションをつけることにしました。このオプションを指定すると、最初にヘッダなどを取得するときにBODYSTRUCTUREの代わりにBODY.PEEK[HEADER.FIELDS (Content-Type Content-Disposition)]を発行します。でもって、Content-TypeとContent-Dispositionを見て、マルチパートであるかメッセージ自体が添付ファイルの場合かつ、同期フィルタでテキストのみダウンロードが指定された場合のみBODYSTRUCTUREを発行しなおすようにしました。

制限事項としては、同期フィルタ中で@Size(@True())が正しく動作しないことです。BODYSTRUCTUREを発行しないとテキストパートのみのサイズが算出できないので、単純に@Size()と同じ値を返します。マルチパートならば無条件にBODYSTRUCTUREを発行して、その後で同期フィルタをチェックするという方法も取れますが、このモードを使わなくてはいけないようなサーバはそれほどないと思うので、不都合が生じるまではこの方法で行くことにします。


トップ «前の日記(2003-01-21) 最新 次の日記(2003-01-23)»