2026年6月28日

2026年6月28日

Postfixで特定ドメインのメールを転送する方法:virtual_alias_mapsの設定とSPF・SRSの注意点

Postfixで特定のドメイン宛てのメールを別のアドレスへ転送するには、そのドメインを virtual_alias_domains に登録し、virtual_alias_maps に「どの宛先を、どこへ転送するか」を書きます。アドレスごとの転送、ドメイン全体の転送、同じユーザー名のまま別ドメインへ移す転送のどれも、この仕組みで設定できます。この記事では、設定の手順と書き方の違い、動作の確認方法に加えて、GmailなどへのSPF・DMARCがらみの不達を防ぐためのSRSの考え方を説明します。

「転送」と「中継」の違いを先に整理する

似た設定に、宛先アドレスは変えずに、別のメールサーバーへ配送だけを任せる「中継(リレー)」があります。これは relay_domains と transport_maps で設定するもので、受け取ったメールを社内の別サーバーへ流す場合などに使います。

この記事で扱うのは、宛先そのものを書き換える転送です。たとえば info@example.org 宛てのメールを someone@gmail.com へ届ける、@example.org 宛てをすべて @example.com へ移す、といった用途です。

前提を確認する

  • 転送したいドメイン(ここでは example.org)のMXレコードが、このPostfixサーバーを指していること。MXが別のサーバーを向いていれば、メールはそもそもこのサーバーに届きません。
  • example.org が mydestination に入っていないこと。Postfixのドキュメントでは、同じドメインを mydestination と virtual_alias_domains の両方に書かないよう明記されています。
  • 作業前に /etc/postfix/ をバックアップしておくこと。
sudo cp -a /etc/postfix /etc/postfix.bak-$(date +%F)
dig +short MX example.org
postconf mydestination

設定手順

1. main.cf にドメインと転送表を登録する

sudo postconf -e 'virtual_alias_domains = example.org'
sudo postconf -e 'virtual_alias_maps = hash:/etc/postfix/virtual'

複数のドメインを転送する場合は、virtual_alias_domains = example.org, example.net のようにカンマで並べます。

ディストリビューションによっては、hash:(Berkeley DB)が使えず、lmdb: を使う構成になっていることがあります。postconf -m で使える形式を確認し、一覧に hash が無ければ lmdb:/etc/postfix/virtual と書きます(2026年10月現在)。

2. 転送表(/etc/postfix/virtual)を書く

左に受け取る宛先、右に転送先を書きます。

# アドレスごとの転送
info@example.org        someone@gmail.com
sales@example.org       sales-team@example.com

# 複数の宛先へ同時に転送(カンマ区切り)
support@example.org     alice@example.com, bob@example.com

# 同じユーザー名のまま別ドメインへ(user@example.org → user@example.com)
@example.org            @example.com

右辺を @example.com の形にすると、「同じユーザー名で別のドメイン」に書き換わります。ドメインの移行時に、旧ドメイン宛てを新ドメインへまとめて流す場合に便利です。

左辺の @example.org は、ほかの行に当てはまらない宛先をすべて受ける「キャッチオール」です。明示したアドレスの行が優先され、キャッチオールは最後に適用されます。

3. 転送表をデータベースに変換して反映する

sudo postmap /etc/postfix/virtual
sudo postfix check
sudo systemctl reload postfix

postmap は、テキストの転送表をPostfixが読む形式(virtual.db など)に変換するコマンドです。転送表を編集したら、そのたびに postmap を実行します。忘れると、編集前の内容のまま動き続けます。

キャッチオールを使うかどうか

ドメイン全体を転送するキャッチオールは手軽ですが、次の点に注意が必要です。

  • 存在しないアドレス宛ての迷惑メールもすべて受け付け、そのまま転送先へ送ってしまいます。
  • 転送先(Gmailなど)から見ると、自分のサーバーが迷惑メールを大量に送ってくる送信元に見え、サーバーの評判が下がる原因になります。
  • 受け付けたあとに転送先で拒否されると、自分のサーバーがエラーメール(バウンス)を偽の差出人へ返すことになり、これも迷惑メールの一種(バックスキャッター)になります。

使うアドレスが決まっているなら、アドレスごとの行だけを書き、キャッチオールは使わないほうが安全です。この場合、表に無い宛先は受信の段階で拒否されます。ドメイン移行のように @example.org @example.com の書き方を使う場合も、転送先のドメインで存在しないアドレスを受信時に拒否できるか確認しておきます。転送の前に迷惑メールのフィルター(Rspamdなど)を通す構成にすると、転送先への迷惑メールを減らせます。

動作を確認する

転送表の引き当てを確かめる

postmap -q で、ある宛先が転送表でどう引き当てられるかを確認できます。

postmap -q info@example.org hash:/etc/postfix/virtual
# someone@gmail.com

lmdb: を使っている場合は、hash: の部分を合わせて変えます。キャッチオールは postmap -q @example.org hash:/etc/postfix/virtual で確認します。

実際に送ってログを見る

外部のアドレスから info@example.org 宛てに送り、/var/log/mail.log(RHEL系は /var/log/maillog)を確認します。

sudo tail -f /var/log/mail.log

転送が働いていれば、次のように to= に転送先、orig_to= に元の宛先が記録されます。

postfix/smtp[...]: ABCDEF1234: to=<someone@gmail.com>, orig_to=<info@example.org>,
relay=gmail-smtp-in.l.google.com[...]:25, ... status=sent (250 2.0.0 OK ...)

status=sent なら転送先のサーバーが受け取っています。status=bounced や status=deferred の場合は、括弧内の応答に拒否の理由が書かれているので、それを手がかりに次の節を確認します。

Gmailなどで届かないとき:SPF・DMARCとSRS

外部のサービスへ転送すると、送信者認証の仕組みとかみ合わずに拒否されたり、迷惑メール扱いになったりすることがあります。

なぜ転送でSPFが失敗するのか

SPFは「エンベロープの差出人のドメインが、このIPからの送信を許可しているか」を確かめる仕組みです。sender@another.example から届いたメールを自分のサーバーが転送すると、転送先から見た送信元は自分のサーバーのIPですが、差出人は another.example のままです。another.example のSPFに自分のサーバーのIPは含まれていないため、SPFは失敗します。

DKIMの署名は、本文やヘッダーを書き換えなければ転送後も有効です。そのため、元のメールがDKIMで署名され、差出人のドメインとそろっていれば、SPFが失敗してもDMARCは合格します。逆に、DKIMの署名が無いメールや、転送の途中で件名や本文を書き換えたメールは、DMARCで不合格になりやすくなります。

SRSでエンベロープの差出人を書き換える

SRS(Sender Rewriting Scheme)は、転送するときにエンベロープの差出人を自分のドメインのアドレスに書き換え、SPFの確認を自分のドメインで合格させる仕組みです。Postfixでは、postsrsd という別のプログラムと組み合わせて使うのが一般的です。

postsrsd は版によってPostfixとの連携方法が違い、1.x系は tcp: の表、2.x系は socketmap: を使う設定例になっています。ディストリビューションのパッケージに付属する説明やpostsrsdのドキュメントを見て、インストールした版に合った書き方で sender_canonical_maps と recipient_canonical_maps を設定してください。設定後は、転送したメールのヘッダーで、エンベロープの差出人(Return-Path)が SRS0=...@example.org のような形に書き換わっているかを確認します。

あわせて、自分のサーバーの送信元IPに対する逆引き(PTR)、自分のドメインのSPF、TLSでの送信が整っていると、転送先での評価が安定します。転送量が多い場合や、転送先がGmailのように受信の基準が厳しい場合は、転送ではなく、転送先のサービス側でPOPやIMAPを使って取り込む方法も検討します。

よくあるつまずき

  • 「Relay access denied」で拒否される: example.org が virtual_alias_domains に登録されていないか、設定の反映(reload)を忘れています。postconf -n | grep virtual で確認します。
  • 「User unknown」で拒否される: 転送表に無い宛先は、キャッチオールが無ければ受信時に拒否されます。意図したアドレスが表に書かれているか、綴りを確認します。example.org が mydestination にも残っていると扱いが混乱するため、どちらか一方にします。
  • 転送表を直したのに変わらない: postmap の実行し忘れです。
  • 転送が循環する: a@example.org を b@example.org へ、b@example.org を a@example.org へ、のように転送表の中で宛先が互いを指していると循環します。Postfixには展開の回数の上限がありますが、転送表を見直して循環を解消します。
  • 自分のサーバーにも残したい: 転送先に自分のサーバーの実在するメールボックスを並べて書けば、両方に届きます。

まとめ

  • 転送は virtual_alias_domains と virtual_alias_maps で設定します。転送表は編集のたびに postmap で変換します。
  • アドレスごと、複数宛先、@example.org @example.com によるドメインごとの書き換えができます。
  • キャッチオールは迷惑メールの転送やバックスキャッターの原因になるため、必要なアドレスだけを書くほうが安全です。
  • postmap -q で引き当てを、mail.log の orig_to= と status= で実際の転送を確認します。
  • 外部への転送ではSPFが失敗しやすく、DKIMが有効なら DMARC は通ります。SRS(postsrsd)を使う場合は、版に合った設定方法を確認します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲