2026年8月7日
2026年8月7日
MailgunでSMTP送信を設定する方法(WordPressのwp_mailをMailgun経由で送る手順)
WordPressの通知メールやお問い合わせフォームのメールが届かない、迷惑メールに入るといった問題は、送信をMailgunのようなメール配信サービスに任せると改善することが多いです。この記事では、Mailgunで送信用ドメインを登録してDNSを設定し、SMTPの認証情報を作り、WordPressからMailgunのSMTPで送るまでの流れを説明します。プラグインを使う方法と、mu-pluginで phpmailer_init を使う方法の両方を扱い、テストとつまずきやすい点の確認方法も紹介します。
なぜMailgunのSMTPを使うのか
WordPressの wp_mail() は、既定ではPHPの mail() 関数を通じてサーバーの送信プログラムに渡します。この方法では、送信元サーバーのIPアドレスの評判やSPF・DKIMの設定がそのまま到達率に影響し、共有のレンタルサーバーやVPSでは迷惑メール扱いされやすくなります。
Mailgunを経由すると、送信はMailgunのサーバーから行われ、自分のドメインに対応したDKIM署名も付けられます。さらに、送信ログ(配信・バウンス・拒否など)を管理画面で確認できるので、「送ったはずのメールがどうなったか」を追えるようになります。
WordPressからMailgunに送る方法は、大きく2つあります。
- SMTP: 一般的なSMTPの設定(ホスト名・ポート・ユーザー名・パスワード)で送ります。WordPress以外のアプリやPostfixのリレー先にも同じ認証情報を使えます。
- HTTP API: プラグインがMailgunのAPIを呼び出して送ります。サーバーのSMTPポートが塞がれている環境でも、HTTPSで通信できれば送れます。
この記事はSMTPを中心に説明し、ポートが使えない場合の選択肢としてAPIにも触れます。
手順1:送信用ドメインを追加する
Mailgunのアカウントを作成すると、テスト用の「サンドボックス」ドメインが用意されます。サンドボックスは、あらかじめ登録して承認した受信者にしか送れないため、本番の送信には自分のドメインを追加します。
追加するドメインは、mg.example.com のようなサブドメインにするのがMailgunの推奨です。メインのドメイン(example.com)で使っているGoogle WorkspaceやMicrosoft 365などのメール設定と、DNSレコードがぶつからないためです。
ドメインの追加時には、データの保存場所となるリージョン(米国またはEU)を選びます。リージョンによってSMTPやAPIの接続先が異なり、あとから変更するのは手間がかかるため、個人情報の取り扱い方針に合わせて最初に決めます。
手順2:DNSレコードを設定する
ドメインを追加すると、Mailgunの管理画面に設定すべきDNSレコードが表示されます。値はアカウントやドメインごとに異なるため、画面に表示された値をそのままコピーしてDNSに登録します。一般的には次のような種類があります。
- TXT(SPF):
mg.example.comに、Mailgunからの送信を許可するSPFレコード(include:mailgun.orgを含むもの)を設定します。同じ名前にSPFのTXTレコードが2つあると無効になるため、既存のものがあれば1つにまとめます。 - TXT(DKIM):
セレクター._domainkey.mg.example.comの形の名前に、公開鍵を含む値を設定します。セレクター名は管理画面に表示されたものを使います。 - MX: Mailgunでバウンスや返信を受け取る機能を使う場合に設定します。
mg.example.comに設定するもので、メインドメインのMXは変えません。 - CNAME(トラッキング): 開封・クリックの計測に使う場合に設定します。CloudflareのDNSでは、このCNAMEはプロキシを無効(DNSのみ)にするよう求められることがあります。
登録後、管理画面で検証を実行します。DNSの反映には時間がかかることがあり、数分から長いと1日程度待つ場合もあります。dig +short TXT mg.example.com などで、登録した値が見えているかを先に確かめると切り分けが早くなります。
あわせて、メインドメインにDMARCレコード(_dmarc.example.com)がなければ設定しておくと、受信側の評価が安定します。最初は p=none で集計レポートを見ながら様子を確かめ、問題がなければ強めていくのが一般的です。
手順3:SMTPの認証情報を作る
SMTPの認証情報はドメインごとに作成します。管理画面のドメイン設定に、SMTP認証情報(SMTP credentials)を管理する画面があります。画面の構成や表記は変わることがあります(2026年10月現在)。
- ユーザー名:
postmaster@mg.example.comのように、送信用ドメインのアドレス形式になります。用途ごとに別のユーザーを作っておくと、漏えい時に1つだけ無効にできます。 - パスワード: 作成時や再設定時に表示されます。あとから同じ値を見られない場合があるため、パスワード管理ツールなど安全な場所に控えます。
- 接続先: 米国リージョンは
smtp.mailgun.org、EUリージョンはsmtp.eu.mailgun.orgです。 - ポートと暗号化: 587番(STARTTLS)が基本です。465番(SSL/TLS)や、587番が塞がれている環境向けの2525番も使えます。
認証情報はサイトのソースコードに直接書かず、Gitなどで管理するファイルにも含めないようにします。
手順4:WordPressから送る設定
方法A:SMTPプラグインを使う
WP Mail SMTP、FluentSMTP、Post SMTPなどのプラグインは、MailgunのAPI接続と一般的なSMTP接続の両方に対応しています。どちらも、プラグインの設定画面で送信方法(メーラー)を選び、必要な値を入れる流れです。
- Mailgunのメーラーを選ぶ場合(API): APIキー、送信用ドメイン(
mg.example.com)、リージョンを入力します。SMTPポートを使わないため、サーバーのポート制限の影響を受けません。 - 汎用のSMTPを選ぶ場合: ホスト名、ポート、暗号化方式、ユーザー名、パスワードに、手順3の値を入れます。
プラグインによっては、パスワードやAPIキーを管理画面ではなく wp-config.php の定数で指定する方法が用意されています。データベースに秘密情報を残さずに済むため、使えるなら定数での指定が安全です。定数名や対応する項目は、各プラグインのドキュメントで確認してください。
方法B:mu-pluginで phpmailer_init を使う
プラグインを増やしたくない場合は、WordPressが wp_mail() の送信直前に呼び出す phpmailer_init アクションで、PHPMailerをSMTP送信に切り替えられます。テーマを変えても動作が残るよう、wp-content/mu-plugins/ に置きます。
まず wp-config.php に認証情報を定数で書きます(値はダミーです)。
// wp-config.php("That's all, stop editing!" の行より上に追記)
define( 'MAILGUN_SMTP_HOST', 'smtp.mailgun.org' ); // EUリージョンは smtp.eu.mailgun.org
define( 'MAILGUN_SMTP_USER', 'postmaster@mg.example.com' );
define( 'MAILGUN_SMTP_PASS', 'your-smtp-password' );
次に wp-content/mu-plugins/mailgun-smtp.php を作成します。
<?php
/**
* Plugin Name: Mailgun SMTP for wp_mail
* Description: wp_mail() を Mailgun の SMTP 経由で送信する。
*/
defined( 'ABSPATH' ) || exit;
add_action( 'phpmailer_init', function ( $phpmailer ) {
// 認証情報が定義されていなければ、既定の送信方法のままにする
if ( ! defined( 'MAILGUN_SMTP_USER' ) || ! defined( 'MAILGUN_SMTP_PASS' ) ) {
return;
}
$phpmailer->isSMTP();
$phpmailer->Host = defined( 'MAILGUN_SMTP_HOST' ) ? MAILGUN_SMTP_HOST : 'smtp.mailgun.org';
$phpmailer->Port = 587;
$phpmailer->SMTPSecure = 'tls'; // 587番は STARTTLS
$phpmailer->SMTPAuth = true;
$phpmailer->Username = MAILGUN_SMTP_USER;
$phpmailer->Password = MAILGUN_SMTP_PASS;
} );
// 既定の差出人(wordpress@サイトのドメイン)だけを置き換える
add_filter( 'wp_mail_from', function ( $from_email ) {
if ( 0 === strpos( $from_email, 'wordpress@' ) ) {
return 'noreply@example.com';
}
return $from_email;
} );
// 送信失敗時はエラーメッセージだけを記録する(本文やパスワードは記録しない)
add_action( 'wp_mail_failed', function ( $error ) {
error_log( 'wp_mail failed: ' . $error->get_error_message() );
} );
wp_mail_from フィルターは、差出人が既定の wordpress@ のときだけ置き換えています。お問い合わせフォームのプラグインが独自に差出人を指定している場合は、その設定を優先させるためです。差出人のドメインは、Mailgunに登録したドメイン、またはその親ドメインにします。mg.example.com で認証し、差出人を noreply@example.com にする形は、DMARCの既定の判定(親ドメインが一致すればよいrelaxedモード)で整合が取れます。
wp_mail_failed に渡されるエラーには、SMTPサーバーの応答として宛先アドレスが含まれることがあります。ログファイルは公開ディレクトリに置かず、保存期間も決めておきます。SMTPプラグインと方法Bを同時に使うと設定が競合するため、どちらか一方にしてください。
手順5:送信テストと確認
設定ができたら、テストメールを送ります。SMTPプラグインには多くの場合テスト送信の機能があります。方法Bの場合は、パスワードリセットのメールを送る、お問い合わせフォームから送信するなどの方法で試せます。WP-CLIが使えるなら、次のように送れます。
wp eval 'var_dump( wp_mail( "you@example.org", "Mailgun test", "テスト送信です" ) );'
bool(true) が返れば、WordPressからMailgunへの受け渡しは成功しています。そのあと、Mailgunの管理画面の送信ログ(ログやイベントの一覧)で、配信されたか、拒否されたかを確認します。受信したメールのヘッダーを表示し、dkim=pass と spf=pass が含まれているかも確かめます。
うまく送れないときの確認順
- 接続できない(タイムアウト): サーバーやレンタルサーバーが外向きの587番を塞いでいる可能性があります。2525番や465番を試すか、HTTP APIで送る方法に切り替えます。
- 認証エラー(535など): ユーザー名がアドレス形式になっているか、パスワードを再設定していないか、リージョンと接続先ホストが一致しているかを確認します。
- 送信は成功するが届かない: Mailgunのログで、受信側に拒否されていないか、サンドボックスドメインのままになっていないかを確認します。
- 迷惑メールに入る: SPF・DKIMの検証が通っているか、差出人のドメインが送信用ドメインと一致しているか、DMARCレコードがあるかを確認します。
- 一部のメールだけ届かない: プラグインごとに差出人を独自に指定している場合、そのアドレスのドメインが認証されていないことがあります。
プランごとの送信上限や機能の範囲は変わることがあるため、送信量が多いサイトはMailgunの最新の案内を確認してください。
まとめ
- Mailgunを使うと、送信がMailgunのサーバーから行われ、DKIM署名と送信ログによって到達状況を追えるようになります。
- 送信用ドメインは
mg.example.comのようなサブドメインにし、管理画面に表示されたSPF・DKIMなどのDNSレコードをそのまま登録します。 - SMTPの接続先はリージョンで異なり、587番のSTARTTLSが基本です。認証情報は定数などで管理し、ソースコードやGitに含めません。
- WordPressからはSMTPプラグインか、mu-pluginの
phpmailer_initで送信方法を切り替えます。 - テスト後はMailgunのログと受信メールのヘッダーで、配信結果と認証の合否を確認します。