Postfix:バーチャルドメイン
正直、かなりダメな仕様になってる。
本来はドメインごとに独立した定義になるべきだが、様々なものが場当たり的な混在状態になっている。
元々、そこまで柔軟にするつもりがなかったためと思われる。
virtual transport に dovecot を使うことでようやくまともになる模様。
以下はオリジナルの virtual transport に関して記述
どれを受け取るべきか(受け取らないなら当然拒否になる)
受け取ったメールはどこに配送されるか?
ややこしいのは、ドメインだけではなくユーザー名も含めてエイリアスになる点。
(なぜこんなに説明がややこしく書かれているのか…)
受信するドメイン名は以下で決定される。
transport_maps
transport_maps の方が mydestination より上にあるため、transport を書いたら他のドメインもすべて書く必要がある。
default_transport
デフォルトは smtp で、
mydestination
inet_interfaces
proxy_interfaces
virtual_alias_domains
virtual_mailbox_domains
sender_dependent_relayhost_maps
relayhost
best_mx_transport
relay_domains
受信先ドメイン(Envelope to)の取り扱いは以下の4種類が考えられる。
ローカルそのもの (local transport を使う)
mydestination
ここにはドメイン名のみを書く。
ローカルで受信するすべてのアドレスを書く。
ローカルのエイリアス
mydestination
ローカルそのものと同じ。つまり、エイリアスなのか正式名なのかの区別が付かない。
独立したドメイン
virtual_mailbox_domains
virtual transport を使う。
virtual_mailbox_maps
メールアドレスに対して、メールボックスを返す。
独立したドメインのエイリアス
virtual_alias_domains
virtual_alias_maps
次に、受信したメールをどうするか(これ自体はローカル配送手前からローカル配送までと同じになるはず)
ドメインに対して、ディレクトリを割り当て、メールボックスファイルに保存
ドメインに対して、リレーサーバーを指定してリレー
転送先メールアドレスを指定して転送
何らかのプログラムを起動して渡す
捨てる
以下、ドメインに依存しないグローバル設定のためバーチャルドメインごとには指定できない。
recipient_delimiter
virtual_mailbox_limit
以下、ローカルに依存する設定のためバーチャルドメイン独自で指定できない。
.forward 関連
以下、ドメインに依存しないグローバル設定のためバーチャルドメイン独自で指定できない。
設定メモ
バーチャルドメインのメールの配置場所はどこにすべきか?
/var/mail はもともと mbox 用に使われているので、競合を避けるために、ここは使いたくない。
/var/spool にすべきか /var にすべきか?
spool は一時ファイル置き場で、永続性が低いものと考えた方がよい。
「いざとなったとき(disk full など)に消してもかまわないデータが配置されている」と考えた方がよい。
code:create_vmail_dir.sh
mkdir /var/vmail
chown root:mail /var/vmail
chmod 775 /var/vmail
code:/usr/local/etc/postfix/virtual_mailbox_maps
foo@example.com
postmap /usr/local/etc/postfix/virtual_mailbox_maps
code:main.cf.fragment
virtual_mailbox_maps = hash:/usr/local/etc/postfix/virtual_mailbox_maps
自分宛のバーチャルドメインもデフォルトでは DNS を見に行くので、MXレコードがないと怒られる。
to=<foo@example.com>, relay=none, delay=312, delays=312/0.03/0/0, dsn=5.1.0, status=bounced (Domain example.com does not accept mail (nullMX))
テストなので、暫定的に以下を設定
disable_dns_lookups = yes
さらに、/etc/hosts に以下を追加
127.0.0.1 example.com
デフォルトでは以下のようになっているので、virtual_mailbox_maps の定義だけしておけば通るのかと思ったら通らなかった。
virtual_mailbox_domains = $virtual_mailbox_maps
以下のように怒られてしまう。
code:maillog
to=<foo@example.com>, relay=none, delay=0.03, delays=0.01/0.02/0/0, dsn=5.4.6, status=bounced (mail for example.com loops back to myself)
virtual_mailbox_domains の定義を行った
code:/usr/local/etc/postfix/virtual_mailbox_domains
example.com
code:main.cf.fragment
virtual_mailbox_domains = /usr/local/etc/postfix/virtual_mailbox_domains
virtual_uid_maps が無指定だと何が起こるのか?
code:maillog
warning: recipient foo@example.com: not found in virtual_uid_maps