Postfix, Dovecot and MySQL

Posted on
Postfix PostfixAdmin Dovecot MySQL

PostfixDovecot を使って、メールサーバーを運用しているのだが、うちは構成が少し変則的で、メール送信サーバー (SMTP) とメール受信サーバー (IMAP/POP3) が分離している。最終的なメールの配送は DovecotLMTP デーモンに頼っているのだが、エイリアスにメールが配送されないという問題が発覚した。

別にバグでも何でもなく、ただの構成ミスである。Dovecot の仮想メールボックス機能を使ってメールアドレスを管理しているのだが、当初、Postfix の送信サーバーと Dovecot の受信サーバーは同居していたので、ローカルの配送は、Postfix の Virtual Transport に任せていた。この時点では、エイリアスの処理も問題なかった。

最近、サーバーの移転を行ったのにあわせて、送信サーバーと受信サーバーの分離を行ったのだが、これは、ローカル配送に Dovecot の LMTP デーモンが使えることがわかったからである。で、何も考えずに移行して嵌まった、と。

アドレス管理のバックエンドに MySQL を使い、PostfixAdmin で Web から管理していたのだが、それ自体はまあついで。問題は、LMTP に配送を移したことで、Postfix の Virtual Transport が解釈されなくなってしまったことにある。別ソフトなんだから、当たり前ですな。そのため、MySQL で管理していたエイリアス情報が参照されなくなってしまい、未達になっていた、と。

多分、色んな解決法があるんでしょうけど、バックエンドに MySQL を使っている私の場合は、Dovecot のユーザー情報取得部分に手を入れることで、部分的に解決した。具体的には、ユーザー情報を MySQL から取得するクエリー文を以下のように修正しただけ。

sql user_query = SELECT concat('/var/mail/', maildir) as mail, concat('*:bytes=', quota) as quota_rule, 998 as uid, 8 as gid FROM mailbox WHERE active = '1' AND username = (SELECT goto FROM alias WHERE (address = '%u' AND alias.active = '1') OR (address = (SELECT concat('%n', '@', target_domain) FROM alias_domain where alias_domain = '%d' AND alias_domain.active = '1' ) ) )

PostfixAdmin は、メールボックスの情報もエイリアステーブルに書き込んでくれるので (その場合、エイリアスとメールボックスに同じ値が入る)、通常のメールボックス宛てのメールもこれでちゃんと読み書きできる。ということで。メールアドレスのエイリアスとドメインのエイリアスはこれで解決したが、外部のアドレスに対する転送だけはどうしようもなかった。LMTP にその機能がないので。

[2019/07/20 追記] LMTP 全然関係なかった。なぜか、receive_override_options = no_address_mappings という行が、main.cf に紛れ込んでいて、こいつのせいで、Alias 展開が阻害されていたという…いつこんな記述を加えたのか…恥ずかしいっ。