2002-12-13 103858

受信中のキャンセル

今のQMAILは大きいメールを受信している最中などにはキャンセルが出来ません。なぜかというと、基本的にちゃんとキャンセルできるタイミングでしかキャンセルしないからなのです。FTPとちがってPOP3やIMAP4にはサーバに転送の中断を要求することが不可能なので、大きいメールの受信中にキャンセルしたかったら無理やり通信を切ってしまうほかありません。そうすると、例えばしばらくの間ログインできなくなってしまう(二重ログイン扱いになってしまうため)とか、色々な問題があるためにこれはやらないことにしていました。でもやっぱり大きいメールの途中での中断は実装したいところですね。

かといって普通の中断が出来るのに無理やり中断するのも考え物です。たとえば、1KBのメールをダウンロード中に中断された場合にはそのメールの受信を待ってから中断、大きいメールをダウンロード中に中断された場合には強制的に中断、のような動作が良さそうですね。サイズで計るのは無理そうなので、キャンセルされてから一定時間(10秒くらい?。指定可能が良いかも)以内は強制中断はしないとかいう指定が良いでしょうか。

POP3で強制中断

POP3で強制中断するときに一番困るのが、エラーで通信が切れてしまった場合にもいえるのですが、メールの削除の扱いです。POP3の仕様では、DELEコマンドを送るとメールが削除されますが、QUITコマンドを受信するまでは実際の削除はしない(つまり、サーバがQUITを受け取らずにクライアントとのコネクションを失ったら削除しない)ように動くように規定されています(サーバによってはQUITを送らなくてもメールを消してしまうサーバもあったりしますが)。このため、QMAILではQUITコマンドを送ってサーバが返答を返すまで、削除したメールのUIDリストを保持しています(そうしないと、エラーで切れた後でつなぎなおすと、二重受信してしまうため)。この辺の扱いだけでも結構ややこしいのに、さらにUIDLに対応していないサーバなどのことも考えるとかなりややこしいことになるんですよね。QsMLでのアンケートではUIDLをサポートしていないサーバは殆ど残っていないと思われるので、やはりサポートを止めちゃいましょうか。

IMAP4で強制中断

IMAP4の場合、基本的に複数のメール分まとめてコマンドを出すので、中断する場合には殆どの場合強制中断になってしまいそうです。IMAP4の場合には、POP3のDELEのような問題がないので余り問題になることはなさそうですし。大抵のIMAP4サーバは複数のコネクションを張れるようになっているので、二重ログインで蹴られるということもあまりなさそうですし。