2026年9月14日
2026年9月14日
PostfixからSendGrid・MailgunへSMTPリレーする設定方法|relayhostとSASL認証・送信テスト
自分のサーバーからメールを直接送ると、送信元IPアドレスの評価や逆引きの設定、クラウド事業者による25番ポートの制限などで、メールが届きにくくなることがあります。SendGridやMailgunなどのメール配信サービスを SMTPリレー(中継先)にすると、サーバー上のPostfixは配信サービスにメールを渡すだけになり、相手への配送は配信サービスが行います。
この記事では、Linuxサーバー(Debian/Ubuntu、RHEL系)のPostfixから、SendGridまたはMailgunを経由して送る設定を説明します。接続先などの情報は2026年10月時点の各社の公式ドキュメントで確認しています。
WordPressのメールだけを外部に送りたい場合は、Postfixを使わずにWordPressから直接SMTPで送る方法もあります(WordPressのメールをSMTP送信に変更する方法)。Postfixを経由させると、cronの通知やWordPress以外のアプリのメールもまとめて配信サービスから送れます。
全体の流れ
- 配信サービスで送信ドメインを認証し、DNSにレコードを登録する
- SMTP接続用の認証情報(ユーザー名とパスワード)を用意する
- PostfixにSASL認証の部品を入れ、
relayhostと認証を設定する - テスト送信してログで確認する
手順1:配信サービスで送信ドメインを認証する
配信サービスは、認証していないドメインを差出人(From)にしたメールを受け付けないか、届きにくくします。先に送信ドメインを登録します。
- SendGrid:管理画面の Settings > Sender Authentication で、Domain Authentication の Get Started から送信ドメインを登録します。表示されたCNAMEやTXTのレコードをDNSに登録すると、SPFとDKIMはSendGrid側の設定で検証されるようになります。DNSの反映を確認するまで最大48時間かかることがあります。
- Mailgun:管理画面で送信ドメイン(
mg.example.comのようなサブドメインを使うことが多い)を追加し、表示されたTXT(SPF・DKIM)などのレコードをDNSに登録して検証します。
DMARCは配信サービスではなく、自分のドメインのDNSに _dmarc のTXTレコードとして登録します。最初は v=DMARC1; p=none; rua=mailto:dmarc-report@example.com のように監視だけの設定から始め、認証に通っていることを確かめてから強めます。設定後の確認方法は SPF・DKIM・DMARCの設定を確認する方法 で説明しています。
手順2:SMTP接続の認証情報を用意する
| 項目 | SendGrid | Mailgun |
|---|---|---|
| SMTPサーバー | smtp.sendgrid.net |
smtp.mailgun.org(EUリージョンのドメインは smtp.eu.mailgun.org) |
| ポート | 587(STARTTLS、推奨)/2525・25/465(SSL) | 587(STARTTLS、推奨)/2525・25/465(TLS) |
| ユーザー名 | 文字列 apikey(固定) |
ドメインごとのSMTPユーザー(例:postmaster@mg.example.com) |
| パスワード | APIキー | SMTPユーザーのパスワード |
| 作成場所 | Settings > API Keys で、少なくとも Mail Send の権限を持つキーを作る | Sending > Domain Settings で対象ドメインを選び、SMTP Credentials タブで作る |
SendGridのユーザー名は、APIキーではなく apikey という文字列そのもの です。APIキーは作成時に一度しか表示されないので、その場で控えてください。Mailgunの認証情報はドメインとリージョンごとに分かれており、USのドメインの認証情報でEUのサーバーには接続できません。
手順3:Postfixを設定する
パッケージを入れる
Postfixが外部のSMTPサーバーにSASL認証でログインするには、SASLの認証方式のモジュールが必要です。入っていないと、設定が正しくても認証できません。
# Debian / Ubuntu
sudo apt install postfix libsasl2-modules
# RHEL / AlmaLinux / Rocky Linux
sudo dnf install postfix cyrus-sasl-plain
sudo systemctl enable --now postfix
Debian/Ubuntuでインストール時に構成の種類を聞かれた場合は、「Internet Site」か「Internet with smarthost」(日本語環境では訳語で表示されます)を選び、メール名に送信ドメインを入れます。リレーの設定はこのあと postconf で行うので、ここで中継先を入れなくてもかまいません。
認証情報のファイルを作る
/etc/postfix/sasl_passwd に、接続先と「ユーザー名:パスワード」を1行で書きます。接続先は、このあと relayhost に書く値と 一字一句同じ にします。
SendGridの場合:
[smtp.sendgrid.net]:587 apikey:SG.xxxxxxxxxxxxxxxxxxxxxxxx
Mailgunの場合:
[smtp.mailgun.org]:587 postmaster@mg.example.com:xxxxxxxxxxxxxxxx
[ ] で囲むと、Postfixはその名前のMXレコードを探さず、ホスト名に直接接続します。中継先の指定では通常この書き方を使います。
作ったファイルは root だけが読めるようにし、Postfixが読む検索表(データベース)に変換します。
sudo chmod 600 /etc/postfix/sasl_passwd
# このPostfixの既定の検索表の形式を確認する(hash または lmdb)
postconf -h default_database_type
# 確認した形式で変換する(hash の場合)
sudo postmap hash:/etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd.db
形式が lmdb と表示された場合は、hash: を lmdb: に読み替えます(作られるファイルは sasl_passwd.lmdb になります)。
main.cf を設定する
postconf -e で /etc/postfix/main.cf に設定を書き込みます。SendGridの例です(Mailgunは relayhost を [smtp.mailgun.org]:587 に変えます)。
sudo postconf -e 'relayhost = [smtp.sendgrid.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_sasl_tls_security_options = noanonymous'
sudo postconf -e 'smtp_tls_security_level = encrypt'
# 外部からのSMTP接続を受けない(このサーバーから送るだけの場合)
sudo postconf -e 'inet_interfaces = loopback-only'
sudo systemctl restart postfix
| 設定 | 意味 |
|---|---|
relayhost |
すべての外向きメールをこのサーバーに渡す |
smtp_sasl_auth_enable |
中継先へのSASL認証を有効にする |
smtp_sasl_password_maps |
認証情報を探す検索表。lmdb の環境では lmdb:/etc/postfix/sasl_passwd |
smtp_sasl_security_options / smtp_sasl_tls_security_options |
匿名の認証方式を使わない |
smtp_tls_security_level = encrypt |
中継先との接続でTLSを必須にする(パスワードを平文で送らない) |
inet_interfaces = loopback-only |
25番ポートをサーバーの内側だけで待ち受ける |
SendGridのPostfix向けの案内では、大きなヘッダーを持つメールのために header_size_limit = 4096000 を設定する例も示されています。必要に応じて追加します。
inet_interfaces を変えたときは、reload ではなく restart が必要です。
手順4:テスト送信してログを確認する
Postfixに付属の sendmail コマンドで送ります。差出人には、手順1で認証したドメインのアドレスを使います。
printf 'From: noreply@example.com\nTo: you@example.net\nSubject: relay test\n\nThis is a relay test.\n' \
| sendmail -f noreply@example.com you@example.net
ログを確認します。Debian/Ubuntuで /var/log/mail.log が無い場合(rsyslogが入っていない環境)は、journalで確認します。
# ファイルにログが出る環境
sudo tail -n 20 /var/log/mail.log
# journalに出る環境
sudo journalctl -u postfix --since "10 min ago"
# 送信待ちのメールが残っていないか
sudo postqueue -p
成功すると、relay=smtp.sendgrid.net[...]:587 と status=sent (250 ...) を含む行が出ます。受信したメールのヘッダーで、SPF・DKIMが pass になっていることも確認しておきます。
うまくいかないときの確認
| ログ・症状 | 原因と対処 |
|---|---|
SASL authentication failed; cannot authenticate to server ... no mechanism available |
SASLのモジュールが無い。libsasl2-modules(Debian系)または cyrus-sasl-plain(RHEL系)を入れて再起動する |
535 Authentication failed などの認証エラー |
ユーザー名・パスワードの誤り。SendGridはユーザー名が apikey か、APIキーに送信権限があるか。Mailgunはドメインとリージョン(US/EU)が合っているか |
| 認証情報を直したのに変わらない | postmap を実行し直していない。sasl_passwd の接続先が relayhost と同じ表記か |
Connection timed out で中継先に接続できない |
サーバーやクラウドのファイアウォールが外向きの587番を止めていないか。2525番に変えて試す |
| 配信サービスに拒否される・届かない | 差出人のドメインが配信サービスで認証済みか。配信サービスの管理画面の送信ログでブロックや宛先不明になっていないか |
status=deferred のまま残る |
ログの括弧内に相手サーバーのメッセージが出る。内容に応じて上の項目を確認し、直したら sudo postqueue -f で再送する |
Postfixのログの読み方は Postfixのログ確認とトラブルシューティング で詳しく説明しています。
注意点
sasl_passwdと変換後のファイルには、APIキーやパスワードが平文で入っています。権限を600にし、バックアップやGitに含めないようにします。漏れた場合は配信サービスの管理画面でキーを無効にし、作り直します。- 送信できる通数や料金は、配信サービスの契約プランによって異なります。大量に送る前に各社の料金ページと送信制限を確認してください。
- 送信先リストの管理(宛先不明のアドレスを外す、配信停止を受け付ける)は、配信サービスを使っても送信者の責任です。苦情が多いと、配信サービスからアカウントを止められることがあります。
まとめ
- 配信サービスで送信ドメインを認証し、表示されたDNSレコードを登録する。DMARCは自分のDNSに登録する
- SendGridはユーザー名
apikey・パスワードはAPIキー、Mailgunはドメインごとの SMTP ユーザーとパスワードを使う - PostfixはSASLのモジュールを入れ、
relayhost・smtp_sasl_*・smtp_tls_security_level = encryptを設定する sasl_passwdはrelayhostと同じ表記で書き、postmapで変換し、権限を600にする- テスト送信後、ログの
relay=とstatus=sentを確認する