2026年7月18日
2026年7月18日
Postfixのメールルーティング設定|transport_maps・relayhost・送信者別リレーの使い分け
Postfixで「このドメイン宛てはあのサーバーへ」「このドメインから送るメールは外部SMTPを経由して」といった振り分けをするには、宛先で決めるなら transport_maps、全体の中継先を決めるなら relayhost、送信者で決めるなら sender_dependent_relayhost_maps を使います。優先順位は transport_maps が最も高く、次に送信者別の設定、最後に relayhost です。この記事では、Postfixが配送先を決める仕組みから、3つの設定の具体的な書き方、postmap での反映と動作確認までを解説します(2026年10月現在の Postfix 3 系を前提にしています)。
Postfixが配送先を決める仕組み
Postfixは、受け取ったメールの宛先ドメインを見て、まず「アドレスクラス」に分類します。
- ローカル:
mydestinationに含まれるドメイン。サーバー上のユーザーへ配送 - 仮想エイリアス:
virtual_alias_domains。別アドレスへ書き換えて転送 - 仮想メールボックス:
virtual_mailbox_domains。仮想ユーザーのメールボックスへ配送 - リレー:
relay_domains。自分は最終配送先ではないが、受け付けて内部サーバーなどへ中継 - デフォルト:上のどれでもない宛先。インターネット上の相手へ送る
クラスごとに既定の配送方法(local_transport、relay_transport、default_transport など)があり、そこに relayhost や transport_maps が上書きをかけていく、というのが全体像です。どの設定がどのメールに効いているのか分からなくなったときは、このクラス分けに立ち返ると整理できます。
現在の設定は、既定値から変えた項目だけを表示する postconf -n で確認できます。
postconf -n
postconf relayhost transport_maps sender_dependent_relayhost_maps
設定を変える前に、/etc/postfix を丸ごとコピーしておくと、問題があったときにすぐ元に戻せます。
sudo cp -a /etc/postfix /etc/postfix.bak-$(date +%Y%m%d)
relayhost:すべての外向きメールを1か所に集める
自宅や社内のサーバーから直接インターネットへ送ると、25番ポートの制限や送信IPの評価の問題で届かないことがよくあります。そこで、外向きのメールをすべてプロバイダーのSMTPや配信サービスに任せるのが relayhost です。
# /etc/postfix/main.cf
relayhost = [smtp.example.net]:587
ホスト名を [ ] で囲むのが重要なポイントです。囲まない場合、Postfixはその名前のMXレコードを調べてから接続先を決めます。リレーサーバーの名前を直接指定したいときは、角括弧でMX検索を止めます。
多くのリレーサービスは認証を求めるため、SASL認証とTLSの設定も合わせて行います。
# /etc/postfix/main.cf
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
# /etc/postfix/sasl_passwd
[smtp.example.net]:587 your-username:your-password
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo postfix reload
sasl_passwd のキーは、relayhost に書いた値と角括弧・ポート番号まで同じ形にしないと一致しません。認証に失敗するときに最初に確認すべき箇所です。
transport_maps:宛先ごとに配送先を変える
特定の宛先だけ別のサーバーへ送りたいときは、トランスポートテーブルを使います。たとえば、社内向けドメイン宛ては社内のメールサーバーへ、取引先の特定ドメイン宛ては専用の経路へ、といった振り分けです。
# /etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
# /etc/postfix/transport
# 宛先 トランスポート:次の配送先
internal.example.com smtp:[10.0.0.25]:25
.internal.example.com smtp:[10.0.0.25]:25
partner.example.org smtp:[relay.partner.example.org]:587
alice@example.com smtp:[10.0.0.30]
old.example.com error:5.1.2 this domain is no longer in use
書式は「左に宛先、右に トランスポート名:次の配送先」です。押さえておきたい点は次のとおりです。
- ドメイン名だけを書いた行は、そのドメインそのものにしか一致しない。サブドメインも含めたい場合は、先頭にドットを付けた行(
.internal.example.com)を別に書く alice@example.comのように、個別のアドレスも指定できるerror:を指定すると、そのドメイン宛てのメールを指定した文面で差し戻せる- 右側の
smtp:は master.cf に定義されたサービス名。後述のように独自のサービスも指定できる
テーブルを編集したら、postmap でPostfixが読める形式に変換します。
sudo postmap /etc/postfix/transport
sudo postfix reload
hash: 形式では transport.db が作られます。新しい環境では既定のデータベース形式が lmdb になっていることもあるため、postconf default_database_type で確認し、main.cf の記述と合わせてください。
内部サーバーへの中継(ゲートウェイ構成)
外部からの受信を前段のPostfixで受け、ウイルスチェックなどをしてから内部のメールサーバーへ渡す構成では、relay_domains と transport_maps を組み合わせます。
# /etc/postfix/main.cf
relay_domains = example.com
relay_recipient_maps = hash:/etc/postfix/relay_recipients
transport_maps = hash:/etc/postfix/transport
# /etc/postfix/transport
example.com relay:[10.0.0.25]:25
relay_recipient_maps に実在するアドレスの一覧を入れておくと、存在しない宛先を前段で拒否でき、内部サーバーが受け取れずに差し戻す「後方散乱(バックスキャッター)」を防げます。
sender_dependent_relayhost_maps:送信者ごとに中継先を変える
1台のサーバーで複数のドメインのメールを送る場合、ドメインごとに別の配信サービスを使いたいことがあります。SPFやDKIMの設定がドメインごとに違うときに特に有効です。
# /etc/postfix/main.cf
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
smtp_sender_dependent_authentication = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
relayhost = [smtp.example.net]:587
# /etc/postfix/sender_relay
@example.com [smtp.mail-service-a.example]:587
@shop.example.jp [smtp.mail-service-b.example]:587
noreply@example.org [smtp.mail-service-c.example]:587
# /etc/postfix/sasl_passwd
# 送信者別の認証情報(smtp_sender_dependent_authentication = yes のとき送信者で検索される)
@example.com user-a:your-password-a
@shop.example.jp apikey:your-api-key
noreply@example.org user-c:your-password-c
# どれにも一致しない場合に使う relayhost の認証情報
[smtp.example.net]:587 your-username:your-password
送信者のエンベロープアドレス(Return-Path に入るアドレス)で検索され、完全なアドレス、@ドメイン の順に一致を探します。一致しない送信者は relayhost が使われます。送信者ごとに別の認証情報を使うには、smtp_sender_dependent_authentication = yes が要ります。これを忘れると、どの送信者でも relayhost 用の認証情報が送られ、認証に失敗します。
なお、中継先だけでなく配送方法そのもの(独自のトランスポート)を送信者で切り替えたい場合は、sender_dependent_default_transport_maps という別のパラメーターがあります。
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sender_relay /etc/postfix/sasl_passwd
sudo postfix reload
宛先別に送信速度を抑える独自トランスポート
大手のメールサービスへ一度に大量に送ると、一時的に受信を制限されることがあります。そうした宛先だけ同時接続数を抑えたい場合は、master.cf に専用のサービスを作り、transport_maps から指定します。
# /etc/postfix/master.cf に追記
slow unix - - n - - smtp
-o syslog_name=postfix-slow
# /etc/postfix/main.cf
slow_destination_concurrency_limit = 2
slow_destination_rate_delay = 1s
# /etc/postfix/transport
bulk-target.example slow:
サービス名_destination_concurrency_limit のように、サービス名を頭に付けたパラメーターはそのサービスにだけ効きます。右側を slow: とだけ書くと、配送方法だけを変え、配送先は通常と同じ決め方(relayhost があればそこ、なければ宛先ドメインのMX)になります。master.cf の継続行(-o の行)は、行頭に空白を入れないと別の行として扱われるので注意してください。
動作確認の方法
設定が意図どおりかは、3つの段階で確認できます。
# 1. テーブルの検索結果を直接確認
postmap -q partner.example.org hash:/etc/postfix/transport
postmap -q @example.com hash:/etc/postfix/sender_relay
# 2. 実際には配送せず、配送経路の報告を受け取る
sendmail -bv -f info@example.com someone@partner.example.org
# 3. 送信後のログで relay= の値を見る
sudo tail -f /var/log/mail.log | grep -E 'relay=|status='
sendmail -bv はアドレス検証モードで、宛先には配送せず、どこへどう送られるかを書いたレポートが送信者宛てに届きます。ログでは relay=relay.partner.example.org[198.51.100.20]:587 のように実際の接続先が記録されるので、ここが想定どおりになっているかを見れば振り分けの成否が分かります。status=deferred で止まっている場合は、続くエラー文(認証失敗、TLSの失敗、接続タイムアウトなど)が原因の手がかりです。
まとめ
- Postfixは宛先をアドレスクラスに分け、その既定の配送方法を各設定で上書きして配送先を決める
- 全体の中継先は
relayhost。ホスト名を[ ]で囲むとMX検索を止められる - 宛先ごとの振り分けは
transport_maps。サブドメインは先頭ドットの行が別に必要 - 送信者ごとの振り分けは
sender_dependent_relayhost_maps。送信者別の認証にはsmtp_sender_dependent_authentication = yesが要る - 優先順位は transport_maps → 送信者別の設定 → relayhost
- テーブルを編集したら
postmapとpostfix reload。postmap -q・sendmail -bv・ログのrelay=で確認する