2026年5月22日

2026年5月22日

PostfixでWordPressのメールを送る設定|直接送信と外部SMTPリレー、SPF・DKIM・DMARC

WordPress は、問い合わせフォームの通知やパスワードの再設定などのメールを、PHP の mail() 関数(内部ではサーバーの sendmail コマンド)で送ります。VPS などで自分でサーバーを管理している場合、その受け口になるメールサーバーとしてよく使われるのが Postfix です。

この記事では、Postfix を送信専用として設定し、WordPress のメールを届くようにする手順を説明します。例は2026年10月時点の Ubuntu 24.04 / Debian 12 で、RHEL 系(AlmaLinux・Rocky Linux)の違いは都度書いています。ドメインは example.com、サーバーの IP アドレスは例示用の 192.0.2.10 としています。

送り方は2通りある

Postfix から外部へメールを出す方法は、大きく次の2つです。どちらか一方を選んで設定します。

方法 仕組み 向いている場合
A. 直接送信 宛先のメールサーバー(Gmail など)へ 25 番ポートで直接届ける 25 番ポートの送信が許可されていて、逆引き(PTR)を設定できる
B. 外部 SMTP へのリレー Amazon SES・SendGrid などの送信サービスに、認証付きで 587 番ポートなどから渡す 25 番ポートが塞がれている、到達率の管理をサービスに任せたい

クラウドでは、25 番ポートの外向きの通信が既定で制限されていることがあります(例: Amazon EC2 は既定で制限し、申請で解除する仕組み。Google Cloud は外向きの 25 番を許可していない)。利用している事業者の公式ドキュメントで確認し、使えない場合は B を選びます。

「リレー先を指定しない(relayhost が空)」のに「SMTP 認証(SASL)を有効にする」のような、A と B の設定を混ぜた状態にはしないでください。認証は B の場合にだけ使います。

Postfixをインストールする

# Ubuntu / Debian
sudo apt update
sudo apt install postfix mailutils

インストール中の設定画面では、A なら「Internet Site」、B なら「Internet with smarthost」を選び、「System mail name」にはメールアドレスの @ 以降にしたいドメイン(例: example.com)を入れます。あとで main.cf を直接編集するので、ここでの選択は後から変えられます。

# RHEL 系
sudo dnf install postfix s-nail
sudo systemctl enable --now postfix

動作とバージョンを確認します。

sudo postfix status
postconf mail_version

main.cfの共通設定

/etc/postfix/main.cf を開き、送信専用として次の項目を確認・変更します。値は sudo postconf -e "項目 = 値" で書き換えることもできます。

# このサーバーのホスト名(FQDN)。DNS の A レコードと逆引きをこれに合わせる
myhostname = mail.example.com

# 送信元アドレスの @ 以降に使うドメイン
myorigin = example.com

# 送信専用なので、外部からの接続は受け付けない
inet_interfaces = loopback-only

# このサーバー自身が受け取る宛先。example.com を入れない
mydestination = $myhostname, localhost.$mydomain, localhost

# 送信時、相手が対応していれば TLS で暗号化する
smtp_tls_security_level = may

mydestination に example.com を入れると、info@example.com 宛てのメールを「自分宛て」と判断してサーバー内に配達してしまい、Google Workspace など別の場所で受けているメールボックスに届きません。ドメインのメールを別のサービスで受けている場合は、上のように example.com を含めないでください。

サーバーに IPv6 アドレスがあっても IPv6 の逆引きを設定していない場合は、inet_protocols = ipv4 にして IPv4 だけで送ると、受信側での拒否を避けやすくなります。

設定を変えたら構文を確認して反映します。

sudo postfix check
sudo systemctl reload postfix

A. 直接送信する場合

DNSと逆引きを設定する

直接送信では、受信側が送信元のサーバーを確かめるため、次のレコードをそろえます。

設定する場所 レコード 例
ドメインの DNS mail.example.com の A レコード 192.0.2.10
VPS 事業者の管理画面 192.0.2.10 の逆引き(PTR) mail.example.com
ドメインの DNS example.com の TXT(SPF) v=spf1 ip4:192.0.2.10 ~all

逆引き(PTR)は IP アドレスの持ち主である VPS 事業者の側で設定します。Google の送信者ガイドラインでも、送信元 IP アドレスの正引きと逆引きが一致していることが求められています。

SPF のレコードは、1つのドメインに1つだけです。Google Workspace などで既に SPF を設定している場合は、新しく追加せず、既存のレコードに ip4:192.0.2.10 を書き足します(例: v=spf1 include:_spf.google.com ip4:192.0.2.10 ~all)。末尾の ~all は「ほかからの送信は疑わしい」、-all は「ほかからの送信は不正」という意味です。

dig +short TXT example.com
dig +short -x 192.0.2.10

OpenDKIMで署名する

DKIM は、送信するメールに電子署名を付け、受信側が DNS の公開鍵で検証する仕組みです。Postfix には OpenDKIM を milter としてつなぎます。

sudo apt install opendkim opendkim-tools

# 鍵を作る(セレクター名 mail、2048 ビット)
sudo mkdir -p /etc/opendkim/keys/example.com
sudo opendkim-genkey -b 2048 -d example.com -s mail -D /etc/opendkim/keys/example.com
sudo chown -R opendkim:opendkim /etc/opendkim/keys

/etc/opendkim.conf で、次の項目を設定します(既にある行は書き換えます)。

Domain                  example.com
Selector                mail
KeyFile                 /etc/opendkim/keys/example.com/mail.private
Canonicalization        relaxed/simple
Mode                    sv
Socket                  inet:8891@localhost

Debian / Ubuntu の Postfix は一部の処理を chroot(/var/spool/postfix)の中で動かすため、OpenDKIM の既定の UNIX ソケット(/run/opendkim/ の下)が Postfix から見えないことがあります。上の例では、その問題が起きない TCP(localhost の 8891 番)でつないでいます。/etc/default/opendkim に SOCKET= の行が有効になっている場合は、そちらも同じ値にそろえます。

Postfix 側に milter を設定します。

sudo postconf -e "smtpd_milters = inet:localhost:8891"
sudo postconf -e "non_smtpd_milters = \$smtpd_milters"
sudo postconf -e "milter_default_action = accept"
sudo systemctl restart opendkim
sudo systemctl reload postfix

non_smtpd_milters は、WordPress のように sendmail コマンドで渡されたメールに適用されます。これを設定しないと、WordPress のメールに署名が付きません。

公開鍵は mail.txt に DNS 用の形式で出力されています。

sudo cat /etc/opendkim/keys/example.com/mail.txt

mail._domainkey.example.com という名前の TXT レコードを作り、括弧の中の v=DKIM1; から p=... までを値として登録します(ファイル内で複数の "..." に分かれている部分はつなげて1つの値にします。DNS の管理画面によっては分けたまま登録できます)。登録後、鍵が DNS と一致するかを確かめます。

sudo opendkim-testkey -d example.com -s mail -vvv
# → "key OK" と出ればよい(DNSSEC を使っていない場合は "key not secure" も併せて出る)

DMARCを設定する

DMARC は、SPF・DKIM の結果をもとに、受信側にどう扱ってほしいかを伝えるレコードです。最初は p=none(何もしない、報告だけ受け取る)で始め、正当なメールがすべて合格することを確かめてから quarantine・reject に強めます。

名前 種類 値の例
_dmarc.example.com TXT v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com

B. 外部SMTPへリレーする場合

Amazon SES・SendGrid などの送信サービスを使う場合は、サービスの管理画面で送信ドメインの認証(DKIM 用の DNS レコードなど)を済ませ、SMTP の接続先・ポート・ユーザー名・パスワードを確認しておきます。値はサービスごとに違うので、各サービスの公式ドキュメントに従ってください。

SASL 認証の部品を入れます。

# Ubuntu / Debian
sudo apt install libsasl2-modules
# RHEL 系
sudo dnf install cyrus-sasl-plain

main.cf に次を追加します。[ ] で囲むと、MX レコードを引かずにそのホスト名へ直接接続します。

relayhost = [smtp.example.net]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt

smtp_tls_security_level = encrypt にすると、TLS で暗号化できない場合は送信しません。パスワードを平文で流さないための設定です。

認証情報のファイルを作ります。1行目の接続先は relayhost と同じ書き方にします。

# /etc/postfix/sasl_passwd
[smtp.example.net]:587    ユーザー名:パスワード
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo systemctl reload postfix

postmap で作られる sasl_passwd.db も、元のファイルと同じく root だけが読める権限にしておきます。SPF・DKIM・DMARC は、送信サービスの案内に従って DNS に登録します(自分のサーバーで OpenDKIM を動かす必要は通常ありません)。

WordPressから送る

WordPress の既定の送信方法(PHP の mail())は、sendmail コマンドを通じて Postfix に渡されるので、Postfix が動いていれば追加の設定なしで送れます。

差出人は、既定では wordpress@サイトのドメイン になります。SPF・DKIM を設定したドメインのアドレスで送るため、必要に応じて差出人を指定します。

<?php
// テーマの functions.php や独自プラグインに書く
add_filter( 'wp_mail_from', function ( $from ) {
	return 'noreply@example.com';
} );
add_filter( 'wp_mail_from_name', function ( $name ) {
	return 'Example Site';
} );

WP-CLI が使えるなら、サーバー上から送信を試せます。

wp eval 'var_dump( wp_mail( "you@example.net", "Test", "Hello from WordPress" ) );' --path=/var/www/html

bool(true) は Postfix に渡せたという意味で、相手に届いたかどうかはログで確認します。

送信を確認する

# ログ(Ubuntu / Debian)。RHEL 系は /var/log/maillog か journalctl -u postfix
sudo tail -f /var/log/mail.log

# 送信待ちのメール
mailq

# 送信待ちのメールをすぐに再送する
sudo postqueue -f

ログの status=sent は相手のサーバーが受け取ったこと、status=deferred は一時的な失敗で再送待ち、status=bounced は配送できず差し戻されたことを表します。deferred や bounced の行の括弧内に、相手のサーバーからの理由が書かれています。

Gmail の宛先に送ったら、受信したメールのメニューから「メッセージのソースを表示」を開き、SPF・DKIM・DMARC が PASS になっているかを確認します。ヘッダーの Authentication-Results: でも同じ結果を見られます。

送信テスト用の外部サービス(mail-tester.com など)を使う場合は、そのサイトに表示される専用のアドレスに送り、結果をサイト上で確認します。

注意点

  • Gmail の送信者ガイドラインでは、すべての送信者に SPF か DKIM の設定、送信元 IP の正引き・逆引き、TLS での送信が求められ、1日あたりの送信量が多い送信者には DMARC も求められます。内容は変わることがあるので、Google の最新の案内を確認してください。
  • inet_interfaces = loopback-only にしているので、このサーバーは外部からメールを受け付けません。返信やエラーメールを受け取りたいアドレスは、別のメールサービスで受けられるドメイン(mydestination に含めていないドメイン)にしておきます。
  • 会員登録やメールマガジンなどで大量に送る場合は、直接送信より送信サービス(B)のほうが、送信量の制限や到達率の管理を任せられます。

関連記事

お気軽にご相談ください

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