T:freebsd:dovecotpop3

出典: Tariki

目次

dovecotでPOP3サーバ

Dovecotはインストールすりゃ(あとちょっとの変更で)運用できる。これは歴史的経緯をもった組織でのPOP3サーバ変更の(ムダな)苦労の記録。

制約条件

  • とある組織のSMTP/POP3サーバ。
    →IMAP4は使わない(以前私が唯一のIMAP4ユーザだった(爆))
  • /home/ はメールサーバマシンになく、NFSマウントしている
  • SMTPサーバはPostfix
  • 以前はcyrus-imapdで運用
    → /var/mail/ユーザ名 がINBOXで、~ユーザ名/ にファイルは作らない

まずやったこと

  • Dovecotの導入
  • /usr/local/etc/dovecot.conf の書き換え
    →protocols = pop3、logfile = /var/log/dovemaillog くらい
  • 認証の作成
    POP3 onlyでも必要みたい。
# mkdir /etc/ssl/certs
# mkdir /etc/ssl/private
# /usr/ports/mail/dovecot/work/dovecot-1.2.4/doc

このあと『無理やりアップグレード』によるライブラリのバージョン違いでハマるが、それは別の話。

パーミッションでハマる

INBOXができる /var/mail/ は、もともとgid: mailの1775とかになっているようですが、このパーミッションが違うと以下のようなエラーになります。

日付時刻 POP3(だれそれ): Error: stat(/var/mail/だれそれ) failed: Permission denied

NFSでハマる

まずは /usr/local/etc/dovecot.conf をデフォルトのまま

mail_location = mbox:~/mail/:INBOX=/var/mail/%u

で動かす。これって ~ユーザ名/mail/ なるIMAPディレクトリを作って整理する、というポリシみたいである。POP3では当然不要だからできないと思ったら

Fatal: Mailbox indexes in /home/だれそれ are in NFS mount. You must set
  mail_nfs_index=yes (and mail_nfs_storage=yes) to avoid index corruptions.
  If you're sure this check was wrong, set nfs_check=no.

FreeBSDのNFSロックが腐っているのは有名ですが、競合するほどメールこないし。いやIMAP4使わないんですけど。と思いつつも下記をdovecot.confに追加してみる。

mmap_disable=yes
mail_nfs_index=yes
mail_nfs_storage=yes

そしたら出たエラーが

日付時刻 POP3(だれそれ): Error: fcntl() failed with mbox file /home/だれそれ/mail/inbox:
  Operation not supported

dovecotのメールボックスロックの機構は、dotlock (ファイルを作る)、fcntl、flock、lockfの方法があり、それぞれ読み書きのロックで変更できるようだ。じゃあ

mbox_read_locks = flock
mbox_write_locks = dotlock flock

で『flockが腐っている』でエラー、ならば(あれ、FreeBSDはlockfだっけ)で『lockfが腐っている』でエラー、dotlockのみにしたら『ファイルが作れません』だかでエラー。どうせいちゅうねん。

ここで思いついて

mail_location = mbox:/var/tmp/dovecot_dummy:INBOX=/var/mail/%u 

を書き加え、 /var/tmp/dovecot_dummy/を掘りパーミッション0777。つまりIMAP4のメールボックスはどーせできないので、架空のディレクトリをローカルファイルシステムに作って指定してしまった。

これでうまくいきました。ちなみにあとでぐぐると http://wiki.dovecot.org/MailLocation/Mbox に同様の手法があり(『Only /var/mail/ mboxes』)、正しくは

mail_location = mbox:/var/empty:INBOX=/var/mail/%u:INDEX=MEMORY

のように書けということです (IMAP4ユーザがいると危険とも)。

mail_location = mbox:/var/tmp/dovecot_dummy/%u:INBOX=/var/mail/%u 

としたら安全じゃないのかな?

正しい運用

Dovecotのポリシは、ホームディレクトリにIMAP4メールボックスを必ず作る (INBOXはincomingのみ)、ということのようなので、NFSロックが腐っている場合 (IMAP4が必要な場合)、正しくは

  1. /home/のNFSサーバ (ローカルにあるマシン)でDovecotを運用する
  2. 各ユーザのIMAP4メールボックスをローカルに作る

ということなようです。

今回は既に運用していたメールサーバのPOP3サーバ変更だったので自由は利かなかったのだが、いずれポリシを変更してみようかと思う。