2026年8月26日
2026年8月26日
Postfixのインストールと基本設定方法(送信用MTAとしての最小構成)
Postfixは、Linuxで広く使われているメール転送エージェント(MTA)です。この記事では、WordPressなどのWebサーバーから通知メールを送るための「送信用」の最小構成を例に、インストール、main.cf の基本パラメータ、外部SMTPへのリレー、送信テストとログの読み方までを説明します。受信メールボックスやIMAPを含むメールサーバー全体の構築は別の作業になるため、ここでは外部から接続を受け付けない安全な構成を前提にします。
Postfixで何をするのかを先に決める
Postfixの設定は、サーバーにどんな役割を持たせるかで大きく変わります。最初に次のどれに当たるかを決めておくと、設定項目を必要最小限にできます。
- 送信専用(この記事の対象): WordPressのお問い合わせ通知、cronの実行結果、監視の通知などを外部に送るだけ。外部からの接続は受け付けません。
- 外部SMTPへのリレー: 送信専用の一種で、メールを直接相手に届けるのではなく、SendGridやMailgun、契約しているメールサービスのSMTPに中継させます。到達率の面で有利なことが多い構成です。
- 受信もするメールサーバー: MXレコードで自ドメイン宛のメールを受け取り、メールボックスに保存して、IMAPで読み出せるようにします。Dovecotの導入やスパム対策、TLS証明書の管理まで含む大きな作業です。
WordPressの通知メールを届けたいだけなら、送信専用かリレーで十分です。自前の受信サーバーは運用負担が大きいため、本当に必要かを検討してから進めてください。
作業前に確認すること
- ホスト名:
hostname -fで完全修飾ドメイン名(例:web01.example.com)が返るようにします。PostfixはこれをSMTPの挨拶(HELO/EHLO)に使います。 - DNS: そのホスト名のAレコード(IPv6を使うならAAAAも)があり、サーバーのIPアドレスの逆引き(PTR)が同じホスト名を返す状態が望ましいです。逆引きは多くの場合、VPSやクラウドの管理画面で設定します。
- ポート25の制限: 多くのクラウドやVPSは、迷惑メール対策として外向きのポート25を既定で制限しています。直接送信できない場合は、事業者に解除を申請するか、ポート587でのリレーを使います。
- 既存のMTA: すでにEximやsendmailなどが入っていないか確認します。同じポートを奪い合うと起動に失敗します。
- バックアップ: 既存環境に入れる場合は、
/etc/postfix/を丸ごと控えてから作業します。
インストール
Debian/Ubuntu
sudo apt update
sudo apt install postfix mailutils
インストール中に設定の種類を尋ねる画面が出ます。直接送信するなら「Internet Site」、外部SMTPに中継するなら「Internet with smarthost」を選び、次の画面の「System mail name」にはメールアドレスの@以降に使うドメインを入れます。この画面の内容はあとから main.cf で変更できますし、sudo dpkg-reconfigure postfix でやり直すこともできます。mailutils はテスト送信に使う mail コマンドのためのパッケージです。
RHEL/AlmaLinux/Rocky Linux
sudo dnf install postfix s-nail
sudo systemctl enable --now postfix
RHEL系では、最小構成のインストールにMTAが含まれていないことがあります。mail コマンドのパッケージ名はバージョンによって異なるため(新しい系統では s-nail)、見つからない場合は dnf search mailx で確認してください。
インストールできたら、バージョンと起動状態を確認します。
postconf mail_version
systemctl status postfix
main.cf の基本パラメータ
Postfixの主な設定は /etc/postfix/main.cf にあります。ファイルを直接編集してもよいのですが、postconf -e を使うと1行ずつ書き換えられ、打ち間違いも起きにくくなります。現在の設定のうち既定値から変えたものだけを見るには postconf -n を使います。
送信専用サーバーの設定例です。example.com と web01 は自分の環境に置き換えます。
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
sudo postconf -e 'myhostname = web01.example.com'
sudo postconf -e 'mydomain = example.com'
sudo postconf -e 'myorigin = $myhostname'
sudo postconf -e 'inet_interfaces = loopback-only'
sudo postconf -e 'inet_protocols = ipv4'
sudo postconf -e 'mydestination = $myhostname, localhost.$mydomain, localhost'
sudo postconf -e 'mynetworks = 127.0.0.0/8'
sudo postconf -e 'smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination'
sudo postconf -e 'smtp_tls_security_level = may'
sudo postfix check
sudo systemctl restart postfix
各項目の意味は次のとおりです。
- myhostname: このサーバーの名前です。EHLOで名乗る名前になるため、DNSの正引き・逆引きと一致させます。
- mydomain/myorigin:
myoriginは、ドメインを省略した送信者(例: cronが使うroot)に付けるドメインです。ここではホスト名を付け、サーバー内のシステムメールとして扱います。 - inet_interfaces: どのネットワークインターフェースで接続を待ち受けるかです。
loopback-onlyにすると、サーバー自身(127.0.0.1)からしか送信を受け付けなくなり、外部から中継の踏み台にされる経路を閉じられます。 - inet_protocols: IPv6のアドレスを持っていても、IPv6の逆引きやSPFを用意していない場合、相手のサーバーに受信を拒否されることがあります。準備が整うまでは
ipv4に限定するのが無難です。 - mydestination: 「このサーバー自身が最終的に受け取るドメイン」です。ここに
example.comを入れると、自ドメイン宛のメールを外部のメールサービスに送らず、サーバー内で抱え込んでしまいます。自ドメインのメールをGoogle Workspaceなどで受けている場合は入れません。 - smtpd_relay_restrictions: 中継を許可する相手です。
mynetworks(ここではローカルのみ)以外からの他ドメイン宛の中継は拒否します。 - smtp_tls_security_level = may: 相手のサーバーがTLSに対応していれば暗号化して送ります。
設定を変えたら postfix check で構文やファイル権限の問題がないかを確かめ、systemctl reload postfix(待ち受け設定を変えたときは restart)で反映します。
rootなどシステム宛のメールを転送する
cronやシステムからの通知は root 宛に送られます。/etc/aliases に転送先を書いておくと、普段読んでいるメールアドレスで受け取れます。
# /etc/aliases に追記
root: admin@example.com
編集後に sudo newaliases を実行してデータベースを更新します。
外部SMTPにリレーする場合
直接送信でポート25が使えない、または到達率を上げたい場合は、契約しているメールサービスのSMTPにリレーします。Debian/Ubuntuでは、SMTP認証に libsasl2-modules パッケージが要ります。
sudo postconf -e 'relayhost = [smtp.example.net]:587'
sudo postconf -e 'smtp_sasl_auth_enable = yes'
sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'
sudo postconf -e 'smtp_sasl_security_options = noanonymous'
sudo postconf -e 'smtp_tls_security_level = encrypt'
認証情報は別ファイルに書き、権限を絞ってからデータベース化します。
# /etc/postfix/sasl_passwd(中身はダミー。実際の値に置き換える)
[smtp.example.net]:587 your-smtp-username:your-smtp-password
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo systemctl reload postfix
relayhost のホスト名を角かっこで囲むと、MXレコードを引かずにそのホストへ直接接続します。sasl_passwd の左側の書き方は relayhost と一字一句そろえてください。ずれていると認証情報が使われず、ログに認証エラーが出ます。新しいディストリビューションでは hash: 形式(Berkeley DB)が使えない場合があり、postconf default_database_type で既定の形式を確認し、lmdb: などに読み替えます。認証情報のファイルはGitなどで管理しないようにします。
送信テストとログの読み方
まずはテストメールを自分宛に送ります。
echo "Postfixからのテスト送信です" | mail -s "Postfix test" you@example.org
結果はログで確認します。Debian/Ubuntuでは /var/log/mail.log、RHEL系では /var/log/maillog に出力されることが多く、どちらの環境でも journalctl -u postfix で見られる場合があります(ログの出力先は構成によって異なります)。
sudo journalctl -u postfix -n 50 --no-pager
sudo tail -n 50 /var/log/mail.log
1通ごとにキューIDが付き、to=<...> の行の status= で結果が分かります。
- status=sent: 相手のサーバーが受け取りました。届いていない場合は、迷惑メールフォルダや相手側のフィルターを確認します。
- status=deferred: 一時的な失敗で、Postfixはあとで再送を試みます。
connect to ...:25: Connection timed outならポート25の制限、認証エラーならリレーの設定を疑います。 - status=bounced: 恒久的な失敗です。括弧内の相手サーバーのメッセージに、宛先不明・拒否の理由などが書かれています。
送信待ちのメールは postqueue -p で一覧でき、原因を直したあと postqueue -f で再送を試せます。
WordPressの wp_mail() は、既定ではPHPの mail() 経由でサーバーの sendmail コマンド(Postfixが提供)を使います。Postfixが正しく動いていれば、WordPress側の追加設定なしで通知メールが送られます。お問い合わせフォームのテスト送信でも、ログに記録が残るかを確認してください。
迷惑メール扱いを避けるためのDNS設定
Postfixが正しく送信できても、受信側で迷惑メールと判定されることがあります。主な要因は送信ドメインの認証です。
- SPF: 送信元ドメインのTXTレコードに、このサーバーのIPアドレス(またはリレー先サービス)を含めます。
- DKIM: OpenDKIMなどで署名を付け、公開鍵をDNSに登録します。
- DMARC: SPF・DKIMの結果をどう扱うかを受信側に伝えるポリシーです。最初は
p=noneで様子を見るのが一般的です。 - 逆引き(PTR): IPアドレスの逆引きが
myhostnameと一致しているかを確認します。
GmailやYahoo!メールなどの大手は、送信者に求める認証の要件を段階的に厳しくしています(2026年10月現在)。最新の要件は各社の送信者向けガイドラインで確認してください。
よくあるつまずき
- 自ドメイン宛だけ届かない:
mydestinationに自ドメインを入れていると、サーバー内で配送しようとして外部のメールボックスに届きません。 - ポート25が開いていない:
ss -ltnp | grep ':25'で待ち受けを確認できます。loopback-onlyの場合は127.0.0.1:25だけが表示されるのが正しい状態です。 - 設定を変えたのに反映されない:
reloadかrestartを忘れていないか、postconf -nで実際の値を確認します。
まとめ
- 最初にPostfixの役割(送信専用・リレー・受信サーバー)を決め、送信専用なら外部からの接続を受け付けない構成にします。
myhostnameはDNSの正引き・逆引きと一致させ、mydestinationに自ドメインを入れるかは受信の仕組みに合わせて判断します。- ポート25が制限されている環境では、587番でのリレーと
sasl_passwdによる認証を使います。 - 送信結果はログの
status=で判断し、deferredとbouncedの理由を読みます。 - 到達率はSPF・DKIM・DMARC・逆引きの設定で大きく変わります。