ユーザの情報をMySQLが持っていて、それに応じてメールを振り分けるみたいなメールサーバーをPostfix、dovecotなどを使って構築したりすると、どれがどんな仕事をしているのか混乱してきます。自分用メモも兼ねて、図にしてみました。
ざっとした仕様
上から順に説明していきます。
メールが届いたらまずはmain.cfのmydestinationに記述されたドメインかどうか判断します。
mydestination = example.com, XXXX.example.com
もし、mydestinationに該当するようであればローカル転送へと回します。ローカル転送は下記の設定で定義されています。
local_transport = local
上の場合はpostfix内で各ローカルメールボックスなどに配信して終わります。この時にhome_mailboxなどのオプションが効いてきます。
ちなみにこのlocalをdovectと書き換えれば、ローカル転送はdovecotに回されます。こうなるとローカル転送はdovecotに委託されたようなものなので、home_mailboxなどのオプションは無視されます。
mydestinationに書かれていないドメイン宛の場合、次にvirtual_mailbox_domainsに該当するか確認されます。もし、virtual_mailbox_domainsに該当しなければメールは自分宛ではなかったので、外部に転送されます。
virtual_mailbox_domains = myvirtualdomain.com, myvirtualdomain2.com ...
virtual_mailbox_domainsに該当する場合、今度はバーチャル転送として処理されます。Po バーチャル転送をどこに回すかはmain.cfの下記項目です。
virtual_transport = dovecot
今回はdovecotなのでそちらに回されます。
さて、バーチャルメールという事でPostfixからdovecotへメールが回されてきました。
dovecotは回されてきたメールをどのメールボックスへ配信すべきかを調べます。この環境ではユーザー情報をMySQLで管理しています。データベースにはユーザーの一覧の他、メールボックスがどこにあるのかという情報が格納されています。dovecotはこれを見て、配信すべきメールボックスを確定します。
また、配信する直前にsieveなどが設定されていた場合、それに従って配信先ディレクトリの振り分けを行います。
これで無事ユーザーのメールボックスに届きました。