[Dovecot]autoexpungeで古いメールを自動削除
メールサーバを建てる際は自動削除の設定もしておかないと、削除(ゴミ箱に行くだけ)で気付いたらゴミ箱が山盛り、Junkフォルダでスパムが腐るほど溜まってる、なんてのはよくある事です(よね?)
メールサーバ関連の記事は古い事が多いのでfindを使っていたりするのが多いですが、Dovecot 2.2.20からautoexpungeというものでメールを自動削除出来るようになったので、それの使い方をメモ。
スポンサーリンク
メールの自動削除
前に「[Dovecot]スパム判定されたメールを迷惑メールフォルダに振り分ける」という記事を書いたのですが、これで振り分けされる迷惑メールはJunkフォルダに蓄積していくだけです。
自動振り分けで蓄積したスパム、消すつもりで放り込んだメールが行くゴミ箱なんかの中身は基本的に要りません。
という訳で、これを消す、手でやるのはめんどくさいから自動で。
autoexpunge
従来まではcronでfindを動かして定期的に消したりするのが主流でしたが、Dovecot 2.2.20からautoexpungeが追加されています。
これの設定は極めて簡単で、メールボックスの設定にautoexpungeを付けるだけです。(以下の例では30日後に削除する設定)
namespace inbox {
mailbox Junk {
special_use = \Junk
auto = subscribe
autoexpunge = 30d
}
mailbox Trash {
special_use = \Trash
auto = subscribe
autoexpunge = 30d
}
}
簡単ですね、cronに色々登録しなくてもOK
負荷対策
いくつか負荷対策としてしておいた方が良い設定があるようです。
といっても難しい物ではないので、ささっと紹介。
特定のプロトコルでのみ動作させる
先ほど紹介した設定例ではPOP、IMAP、LMTPの3つで動作します。
POP、IMAPはクライアントのログアウト後に動作するのですが、LMTPはメールを受信するたびに動作してしまいます。
これだとメール配信に遅延が発生したりすることがあるので、特定のプロトコルでのみ動作するように設定した方が良いかも。
protocol imap {
namespace inbox {
mailbox Junk {
autoexpunge = 30d
}
mailbox Trash {
autoexpunge = 30d
}
}
}
#protocol pop3 {
# namespace inbox {
# mailbox Junk {
# autoexpunge = 30d
# }
# mailbox Trash {
# autoexpunge = 30d
# }
# }
#}
POP3ではサーバーサイドのメールフォルダが利用できない(=SpamやJunkは見られない)ので、IMAPの時に動作させたので十分だと思われます。
こうする事で、IMAP(厳密にいえばIMAPログアウト時)のみ処理が実行されるので、負荷が少ないでしょう。
mailbox_list_index
autoexpungeを利用する際は「mailbox_list_index = yes」を設定した方が良いでしょう。
これを設定すると実際にメールを舐めまわしたりする必要なく、要らないメールを探し出して消すことが出来ます。
(というか、設定していないとメールの件数に応じてO(n)で処理に時間が掛かるようになるかと思われ)
その他
基本的にこれでメールの自動削除が出来ます。
少し考えれば当たり前ですが、該当のフォルダにあるメールは「そこに移動してからn日後」に削除されます。
受信したのが1日前でも1カ月前でも1世紀前でも、「移動してからn日」です。当たり前ですね。(そうじゃないと間違えて入れちゃったときにお察し)
疲れていたり、構築作業中で色々考えてると忘れていて「あれ~?設定したより前の日付(のメール)なのに消えな~い……」なんて思っちゃうことがあるかも……?
小ネタ
ちなみに、autoexpunge_max_mailsを使うと設定した件数以上の時にメールを削除します。(Dovecot 2.2.25で追加)
手元のDovecotがバージョン不足だったので挙動の検証できず……どちらを設定するかはお好みで。