Dovecot でローカル配信する

Dovecot 1.x の時代、ローカル配信は Dovecot 付属の deliver を使うのが主流だった。

Dovecot 2.x になってから、deliver は dovecot-lda になって delibver は dovecot-lda へのシンボリックリンクに変わった。

そのせいかどうかはわからない(Dovecot 1.x の時代にどうであったかはわからない)が、system user じゃない virual user、つまり、OS のユーザじゃなく Dovecot 上にしか登録されていないユーザ、への配信がどうもうまくいかない。

Postfix 側の方の設定によるものなのか、 Dovecot 側なのかということもわからないのだが、パーミッションの関係かもしれないと思って Dovecot2 のドキュメントの Dovecot LDA with Postfix – Virtual users with multiple uids の節を読んでみると、dovecot-lda を setuid root しろとか、sudo で起動しろとか書いてある。

さらに、Dovecot LDA のセクションを読むと冒頭に、いや、いまどき普通 LMTP でしょ、とか書いてある。

Nowadays you should probably use the LMTP server instead, because it’s somewhat easier to configure (especially related to permissions) and gives better performance.

普通 LMTP というならしかたがない、ということで、ドキュメントを見ながら色々試行錯誤したまとめ。

まず、OS上のユーザ(システムユーザ)とDovecot上のユーザ(仮想ユーザ)の扱い。これは別ドメインとして管理することにして、OSのユーザへのローカル配信はPostfixで、仮想ユーザへの配信を dovecot-lmtp で行うことにした。そうすればシステムユーザに対しては /etc/mail/aliases とか ~/.forward も従来通り有効だし、レガシーなメールアプリケーションとも親和性がよいだろう。

postfix 側の設定は、/etc/postfix/main.cf に以下を追加する。

virtual_mailbox_domains = mbox.$mydomain
virtual_transport = lmtp:unix:private/dovecot-lmtp

1行目が Dovecot で管理する仮想ドメインの指定。2行目が仮想ドメインに配信するソケットの指定で、各要素がコロン ‘:’ で区切られている。

1つ目の ‘lmtp’ がプロトコル。2つ目の ‘unix’ がソケットの種類で、ここでは UNIX ドメインのソケットであることを示している。3つ目の ‘private/dovecot-lmtp’ は UNIX ドメインソケットのパスで、相対パスになっている。絶対パスだと ‘/var/spool/postfix/private/dovecot-lmtp’ だ。もちろん環境依存である。

Dovecot 側の設定では、関係するところを抜粋した。

protocols = imap lmtp

protocol lmtp {
  mail_plugins = quota
}

service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    user = postfix
    group = wheel
    mode = 0666
  }
}

userdb {
  driver = passwd-file
  args = username_format=%n /usr/pkg/etc/dovecot/userdb
}

protocols に lmtp を入れておくのは当然。

‘service lmtp’ が LMTP サーバの定義。プロトコルには UNIX と INET が使用できるが、Postfix からのローカル配信限定という条件なので、UNIX のみにした。したがって、’unix_listener’ の定義のみで、その直後に記述されている ‘/var/spool/postfix/private/dovecot-lmtp’ というのが待ち受けるソケットのパスになる。当然ながら、先の Postfix 側の設定と対応する。

ソケットの場所、ユーザとグループ、パーミッションは、Postfix の他のソケットと揃えておいた。NetBSD 5.1.2 では /var/spool/postfix/private が 0700 で、中のソケットが 0666 というレイアウトになっている。

そして最後に userdb の設定(これが一番ハマった)。ここでは仮想ユーザの検索ドライバとして passwd-file を使用し、args で指定している ‘/usr/pkg/etc/dovecot/userdb’ から仮想ユーザの情報を得ている。

args に ‘username_format=%n’ とあるのは、LMTP に検索キーとして渡される宛先アドレスからユーザ名を抽出するための設定。Postfix から dovecot-lmtp へはドメインを含む(メールアドレスの ‘@’ 右側を含む)宛先アドレスが渡される。仮想ユーザをドメイン込で passwd-file に記述していればそのままでいいが、ユーザ名部分のみ(’@’ の左側部分のみ)だと一致しないということで、ユーザが見つからないという結果になる。

複数のドメインを取り扱う場合にはドメイン込で記述する必要があるが、単一のドメインの場合は、略したいので ‘username_format=%n’ という設定が必要となる。

Dovecot ってサンプルとかチュートリアルがまだまだ少ないよね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です