これまで、IMAP4の設定でCLOSEを送るようにしている場合には、同期用のセッションでCLOSEを発行すると同時に、ローカルにある削除フラグの立ったメッセージを削除していました。ところが、これだとそのセッションでSELECTした後で別のセッションから削除フラグを立てた場合に、サーバからは削除されていないメッセージがローカル側で削除されることになってしまっていました*1。その結果、次回の同期時にリカバリ用のルーチンが動いてすべてのメッセージを同期しなおしてしまいます。
そこで、CLOSEの代わりにEXPUNGEを発行して、EXPUNGEレスポンスが返ってきたメッセージだけを削除するように変更しました。大量に削除フラグが付いている場合のパフォーマンスがやや心配ですが、しばらくこれで様子を見ることにします。
ところが話はこれだけで終わりませんでした。自動振り分け時には別のセッションを使っているので、そちらのセッションから削除フラグを付けても、同期用のセッションからは見えません。その結果、自動振り分けで削除フラグが付けられたメッセージが次に同期するときまで残ってしまうことになりました。この部分は、元々同じセッションを使いまわすように直すつもりだったのですが、早々に直さないといけなそうです。
*1 サーバによってはすぐに別のセッションにもフラグが反映されるので問題にならない場合もあります