2026年5月26日

2026年5月26日

Postfixのリレーサーバー設定方法:relayhostで外部SMTPへ中継する手順とmynetworksでの社内中継

Postfix で「リレー」を設定する場面は2つあります。1つは、自分のサーバーから直接メールを配送せず、SendGrid や Amazon SES、プロバイダーの SMTP サーバーなどへ中継させる設定(relayhost)。もう1つは、社内の別のサーバーから届いたメールを、自分の Postfix が受けて外へ中継する設定(mynetworks)です。この記事では、両方の手順と、設定後の送信テスト、ログに出るエラーの読み方を説明します。後者は設定を誤るとだれでも使える「オープンリレー」になるため、確認の方法まで含めて扱います。

例は Ubuntu / Debian の Postfix です。設定ファイルを編集する前に、/etc/postfix/main.cf を main.cf.bak などの名前で複製しておいてください。

なぜ外部の SMTP へ中継するのか

VPS やクラウドのサーバーから直接メールを送ると、届かないことがよくあります。理由は主に次の3つです。

  • 25番ポートの送信が止められている: 多くのクラウドや VPS では、迷惑メール対策として外向きの25番ポートが初期状態で塞がれています。
  • IP アドレスの評判がない: 新しい IP アドレスや、以前に悪用された IP アドレスからのメールは、受信側で迷惑メールに振り分けられやすくなります。
  • 逆引きや認証の設定が揃っていない: PTR レコード、SPF、DKIM を自分で整える手間がかかります。

送信を専門のサービスに中継させれば、送信用のポート(587番)で認証して送るだけになり、配送や評判の管理をサービス側に任せられます。WordPress のメールも、PHP の mail() から sendmail 互換のコマンドを通って Postfix に渡るので、Postfix にリレーを設定すればサイト全体のメールがまとめて中継されます。

手順1: SASL 認証のモジュールを入れる

中継先には、ユーザー名とパスワード(多くのサービスでは API キー)で認証して送ります。Postfix がこの認証(SASL)を行うには、追加のパッケージが要ります。

sudo apt install libsasl2-modules
# RHEL 系では cyrus-sasl-plain

このパッケージがないと、ログに no mechanism available や SASL authentication failed が出て送れません。リレーの設定がうまくいかないときに最初に疑う点です。

手順2: main.cf に中継先を設定する

# /etc/postfix/main.cf に追記(既存の同じ項目があれば書き換える)

# 中継先。[] で囲むと MX レコードを引かずにこのホストへ直接送る
relayhost = [smtp.example.com]:587

# 中継先への認証
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous

# 中継先への通信は TLS を要求する(暗号化できなければ送らない)
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

smtp_tls_security_level = encrypt にしておくと、STARTTLS が使えない状態でパスワードを平文で送ってしまうことを防げます。中継先のホスト名とポートは、利用するサービスの公式ドキュメントに書かれた値を使ってください。465番ポート(接続直後から TLS を使う方式)しか使えないサービスでは、smtp_tls_wrappermode = yes を追加し、relayhost のポートを 465 にします。

手順3: 認証情報のファイルを作る

# 中身は「中継先 ユーザー名:パスワード」の1行。値は自分のものに置き換える
sudo sh -c 'echo "[smtp.example.com]:587 your-username:your-api-key" > /etc/postfix/sasl_passwd'
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd     # sasl_passwd.db が作られる
sudo chmod 600 /etc/postfix/sasl_passwd.db

つまずきやすいのは次の点です。

  • **左側の書き方を relayhost と揃える**: relayhost が [smtp.example.com]:587 なら、ファイルの左側も角かっこ・ポート番号まで同じに書きます。違っていると認証情報が見つからず、認証なしで接続して拒否されます。
  • **編集したら postmap をやり直す**: Postfix が読むのは .db のほうです。
  • パーミッション: パスワードが書かれたファイルなので、root だけが読めるようにします。シェルの履歴にパスワードが残るのが気になる場合は、エディターでファイルを直接編集してください。
  • データベースの形式: 例の hash: が使えない環境では、postconf -m で使える形式を確かめ、lmdb: などに読み替えます。

手順4: 設定を確かめて反映する

sudo postfix check          # 設定ファイルやパーミッションの問題を表示する
postconf -n | grep -E 'relayhost|sasl|tls_security'
sudo systemctl reload postfix

postconf -n は、既定値から変えた項目だけを表示します。同じ項目を main.cf に2回書いていると、あとに書いたほうが使われるので、ここで意図した値になっているかを見ます。

手順5: 送信テストとログの確認

printf 'Subject: relay test\n\nThis is a test.\n' | sendmail -f wp@example.com you@example.net

# ログを見る(環境によって /var/log/mail.log または journalctl)
sudo tail -f /var/log/mail.log

成功していれば、ログに relay=smtp.example.com[...]:587 と status=sent が出ます。うまくいかない場合は、ログの文言から次の順に確かめます。

  1. **SASL authentication failed**: ユーザー名やパスワード(API キー)の誤り、sasl_passwd の左側の不一致、postmap のし忘れ。サービス側で API キーに送信の権限を付け忘れていることもあります。
  2. **no mechanism available**: 手順1のパッケージが入っていません。
  3. **Connection timed out**: サーバーから中継先のポートへ出られていません。クラウドのファイアウォールや、サーバー内のファイアウォールで 587 番の外向き通信が許可されているかを確かめます。
  4. **Must issue a STARTTLS command first**: TLS を使わずに接続しています。smtp_tls_security_level の設定を見直します。
  5. **Sender address rejected など送信者に関する拒否**: 中継先のサービスで、送信元アドレスやドメインの認証(ドメインの所有確認)が済んでいません。

届かずに溜まったメールは mailq で確認し、原因を直したあとに sudo postqueue -f で再送できます。

社内サーバーのメールを受けて中継する(mynetworks)

同じネットワークにある別のサーバー(例: 社内の業務システム)から、この Postfix を経由してメールを送らせたい場合は、送ってよい相手を mynetworks で限定します。

# /etc/postfix/main.cf
inet_interfaces = all
mynetworks = 127.0.0.0/8 [::1]/128 192.168.10.0/24

# mynetworks か、SMTP 認証した相手だけに中継を許す
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination

mynetworks に広い範囲(0.0.0.0/0 やグローバルな IP の範囲)を入れると、インターネット上のだれでもこのサーバーを使って迷惑メールを送れるようになります。オープンリレーになると、数時間でブラックリストに載ることもあります。社内のサーバーだけが接続できるように、ファイアウォールでも25番ポートへの接続元を絞っておきます。

外部のネットワークから接続して、自分のドメイン以外の宛先を指定したときに Relay access denied で拒否されることを確かめてください。確認は、自分が管理するサーバーに対してだけ行います。

WordPress から使うときの補足

  • WordPress の既定の送信元は wordpress@サイトのドメイン です。中継先で認証済みのドメインと揃っていないと拒否されたり迷惑メールに入ったりするので、送信元アドレスを揃えておきます。
  • SPF と DKIM の設定は、中継先のサービスの案内に従って DNS に追加します。中継させても、送信元ドメインの DNS 設定は自分で行う必要があります。
  • サーバーに Postfix を置かず、「WP Mail SMTP」などのプラグインで WordPress から直接外部の SMTP に送る方法もあります。サーバー上の WordPress 以外のプログラムもメールを送るなら Postfix のリレー、WordPress だけならプラグイン、と使い分けると管理しやすくなります。

中継サービスの送信上限や認証方式は、サービスごとに異なり、変更されることもあります(2026年10月現在)。設定する前に各サービスのドキュメントを確認してください。

まとめ

  • 外部 SMTP への中継は relayhost = [ホスト]:587 と SASL 認証、TLS の要求で設定する。
  • 認証には libsasl2-modules が要る。sasl_passwd の左側は relayhost と揃え、編集のたびに postmap。
  • テストは sendmail で送り、ログの status=sent と relay= を確かめる。失敗はログの文言から順に切り分ける。
  • 社内サーバーのメールを中継するなら mynetworks を狭く限定し、オープンリレーになっていないか確かめる。

お気軽にご相談ください

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