2026年5月31日

2026年5月31日

WordPressのメールをSMTP送信に変更する方法|phpmailer_initとWP Mail SMTP

WordPressは、問い合わせフォームの通知やパスワード再設定などのメールを wp_mail() で送ります。初期状態では、サーバーのPHPの mail() 関数(実際にはサーバーのメール送信プログラム)を使うため、送信元のサーバーやドメインの設定によっては、メールが届かなかったり迷惑メールに分類されたりします。

送信を、認証つきのSMTPサーバー(契約しているメールサーバー、Gmail、メール配信サービスなど)経由に切り替えると、送信元として認証されたサーバーからメールが出るため、届きやすくなります。この記事では、プラグインを使わない方法とWP Mail SMTPを使う方法の両方を説明します。

SMTPに切り替える前に確認すること

  • 送信元アドレスのドメイン:送信元(From)には、自分のドメインのアドレスを使います。そのドメインのSPF・DKIMに、使うSMTPサーバーが含まれていないと、SMTP経由でも迷惑メールに分類されることがあります
  • SMTPの接続情報:ホスト名、ポート番号、暗号化方式(STARTTLSかSSL/TLSか)、ユーザー名、パスワード(またはAPIキー)を、メールサーバーやサービスの管理画面で確認しておきます
  • ポート:一般的には587番(STARTTLS)か465番(SSL/TLS)を使います。サーバーによっては外向きの通信が制限されていることがあるので、つながらないときはサーバー会社の案内を確認します

方法1:プラグインなしで設定する(phpmailer_init)

WordPressは wp_mail() で送信する直前に phpmailer_init アクションを実行し、送信に使うPHPMailerのオブジェクトを渡します。ここでSMTPの設定をすると、すべてのメールがSMTP経由になります。

接続情報を wp-config.php に書く

パスワードやAPIキーは、テーマのファイルではなく wp-config.php に定数として書きます。テーマのファイルはテーマの配布や編集画面を通じて見られやすく、テーマを替えると設定も消えるためです。

<?php
// wp-config.php の「編集が必要なのはここまでです」より上に追加
define( 'SMTP_HOST', 'smtp.example.com' );
define( 'SMTP_PORT', 587 );
define( 'SMTP_SECURE', 'tls' );            // 587 は 'tls'(STARTTLS)、465 は 'ssl'
define( 'SMTP_USER', 'noreply@example.com' );
define( 'SMTP_PASS', 'ここにパスワードまたはAPIキー' );
define( 'SMTP_FROM', 'noreply@example.com' );
define( 'SMTP_FROM_NAME', 'サイト名' );

SMTP_ で始まる名前は、この記事のコードで使うために決めたものです。WordPress本体が読む設定ではありません。

送信処理を mu-plugin にする

設定のコードは、テーマに依存しないように mu-plugin(有効化の操作なしで常に読み込まれるプラグイン)にします。wp-content/mu-plugins/ フォルダーを作り(なければ)、次の内容で smtp.php を置きます。mu-plugin は置くだけで有効になります。

<?php
/**
 * Plugin Name: SMTP送信設定
 * Description: wp-config.php の SMTP_* 定数を使って wp_mail() を SMTP 送信にする。
 */

add_action( 'phpmailer_init', function ( $phpmailer ) {
    if ( ! defined( 'SMTP_HOST' ) ) {
        return; // 定数がなければ何もしない(従来の mail() 送信のまま)
    }

    $phpmailer->isSMTP();
    $phpmailer->Host       = SMTP_HOST;
    $phpmailer->Port       = defined( 'SMTP_PORT' ) ? SMTP_PORT : 587;
    $phpmailer->SMTPSecure = defined( 'SMTP_SECURE' ) ? SMTP_SECURE : 'tls';
    $phpmailer->SMTPAuth   = true;
    $phpmailer->Username   = SMTP_USER;
    $phpmailer->Password   = SMTP_PASS;
} );

// 送信元アドレスと送信者名(既定は wordpress@サイトのドメイン)
add_filter( 'wp_mail_from', function ( $email ) {
    return defined( 'SMTP_FROM' ) ? SMTP_FROM : $email;
} );

add_filter( 'wp_mail_from_name', function ( $name ) {
    return defined( 'SMTP_FROM_NAME' ) ? SMTP_FROM_NAME : $name;
} );

// 送信に失敗したら、理由をエラーログに残す
add_action( 'wp_mail_failed', function ( $error ) {
    error_log( 'wp_mail failed: ' . $error->get_error_message() );
} );

送信元は wp_mail_from と wp_mail_from_name のフィルターで変えます。何も設定しないと、送信元は wordpress@サイトのドメイン になり、存在しないアドレスから送ることになります。wp_mail_failed は送信に失敗したときに実行されるアクションで、SMTPサーバーが返したエラーの内容を記録できます。

方法2:WP Mail SMTPで設定する

コードを書きたくない場合は、プラグイン「WP Mail SMTP」を使います。管理画面の「プラグイン」→「新規プラグインを追加」で検索してインストールし、表示されるセットアップウィザード、または「WP Mail SMTP」→「設定」で、メーラーに「その他の SMTP」(Other SMTP)を選んでホスト名・暗号化・ポート・ユーザー名・パスワードを入力します。

管理画面で入力したパスワードはデータベースに保存されます。避けたい場合は、wp-config.php に定数で書くと、その項目は定数の値が使われ、画面からは変更できなくなります。

<?php
// wp-config.php に追加(WP Mail SMTP の「その他の SMTP」を定数で設定)
define( 'WPMS_ON', true );
define( 'WPMS_MAILER', 'smtp' );
define( 'WPMS_SMTP_HOST', 'smtp.example.com' );
define( 'WPMS_SMTP_PORT', 587 );
define( 'WPMS_SSL', 'tls' );               // 'tls'、'ssl'、暗号化なしは ''
define( 'WPMS_SMTP_AUTH', true );
define( 'WPMS_SMTP_USER', 'noreply@example.com' );
define( 'WPMS_SMTP_PASS', 'ここにパスワードまたはAPIキー' );
define( 'WPMS_MAIL_FROM', 'noreply@example.com' );
define( 'WPMS_MAIL_FROM_NAME', 'サイト名' );

方法1のコードとWP Mail SMTPを同時に使うと、どちらの設定が効いているのか分かりにくくなります。どちらか一方にしてください。

主なSMTPサービスの接続情報

サービス ホスト ポート・暗号化 ユーザー名 パスワード
Gmail smtp.gmail.com 587(STARTTLS)または 465(SSL) Gmailのアドレス アプリ パスワード
SendGrid smtp.sendgrid.net 587(STARTTLS) 固定の文字列 apikey SendGridのAPIキー
Amazon SES(東京リージョン) email-smtp.ap-northeast-1.amazonaws.com 587(STARTTLS) SESのSMTP認証情報のユーザー名 SESのSMTP認証情報のパスワード

Gmailを使う場合

Gmailのパスワードそのものではなく、「アプリ パスワード」(16桁)を使います。アプリ パスワードは、Googleアカウントで2段階認証プロセスを有効にしたうえで、https://myaccount.google.com/apppasswords から作成します。2段階認証にセキュリティキーしか使っていない場合や、高度な保護機能を有効にしている場合、職場や学校などの組織のアカウントでは、アプリ パスワードを作れないことがあります(2026年10月時点のGoogleのヘルプによる)。

Gmailで送る場合、送信元をログインに使ったアドレス以外にすると、Gmail側で送信元が書き換えられることがあります。自分のドメインのアドレスから大量に送るサイトでは、次のようなメール配信サービスのほうが向いています。

SendGrid・Amazon SESを使う場合

SendGridは、ユーザー名に固定の文字列 apikey、パスワードにAPIキーを使います。Amazon SESは、SESのコンソールで作成する「SMTP認証情報」を使います。AWSのアクセスキーやIAMユーザーのパスワードとは別物なので注意してください。どちらのサービスも、送信元のドメインやアドレスをサービス側で認証してから使います。Amazon SESは、作成直後のアカウントがサンドボックスと呼ばれる制限状態で、認証済みのアドレスにしか送れません。

送信をテストする

WP-CLI が使える場合は、次のコマンドで管理者のメールアドレスにテストメールを送れます。bool(true) が表示されれば、WordPressからSMTPサーバーへの受け渡しは成功しています。

wp eval 'var_dump( wp_mail( get_option( "admin_email" ), "SMTP test", "This is a test." ) );'

bool(false) の場合は、方法1のコードで記録した wp_mail failed: の行をエラーログで確認します。WP Mail SMTPを使っている場合は、「WP Mail SMTP」→「ツール」の「メールテスト」からも送信できます。

bool(true) でもメールが届かないときは、SMTPサーバーが受け付けたあとの配送で止まっています。迷惑メールフォルダー、送信元ドメインのSPF・DKIMの設定、サービス側の送信ログを確認します。

うまくいかないときのデバッグ

SMTPサーバーとのやり取りを確認したいときは、PHPMailerのデバッグ出力を一時的に有効にします。次のコードを mu-plugin に追加し、調査するときだけ wp-config.php に define( 'SMTP_DEBUG', true ); を書きます。

<?php
// 調査中だけ wp-config.php に define( 'SMTP_DEBUG', true ); を書いて有効にする
add_action( 'phpmailer_init', function ( $phpmailer ) {
    if ( ! defined( 'SMTP_DEBUG' ) || ! SMTP_DEBUG ) {
        return;
    }
    $phpmailer->SMTPDebug   = 2;           // クライアントとサーバーのやり取りを出力
    $phpmailer->Debugoutput = 'error_log'; // 画面ではなくエラーログへ
}, 20 );

出力先はPHPのエラーログです。wp-config.php で WP_DEBUG と WP_DEBUG_LOG を有効にしている場合は wp-content/debug.log に書かれます。よくあるエラーは次のとおりです。

  • SMTP connect() failed:ホスト名・ポートが違う、またはサーバーから外向きの接続ができない
  • Could not authenticate:ユーザー名・パスワード(APIキー)が違う。Gmailならアプリ パスワードを使っているかを確認する
  • 証明書のエラー:ポートと暗号化方式の組み合わせ(587と tls、465と ssl)が合っていない

調べ終わったら SMTP_DEBUG の定義を消し(または false にし)、ログファイルも削除します。デバッグ出力を残したままにすると、メールを送るたびにログが増え続けます。

HTMLメールを送る

HTML形式のメールを送るときは、wp_mail() の4番目の引数にヘッダーを渡すのがかんたんです。wp_mail_content_type フィルターを使う場合は、無名関数ではなく名前付きの関数で付け、送信後に同じ名前で外します。remove_filter() は、付けたときと同じ関数を指定しないと外れないためです(同じ内容の無名関数を新しく書いても、別の関数として扱われます)。

<?php
// 方法1: ヘッダーで指定する(フィルターを使わないので後始末が不要)
function myprefix_send_html_mail( $to, $subject, $html_body ) {
    $headers = [ 'Content-Type: text/html; charset=UTF-8' ];
    return wp_mail( $to, $subject, $html_body, $headers );
}

// 方法2: フィルターを使う場合は、名前付き関数で付けて同じ名前で外す
function myprefix_html_content_type() {
    return 'text/html';
}

function myprefix_send_html_mail_with_filter( $to, $subject, $html_body ) {
    add_filter( 'wp_mail_content_type', 'myprefix_html_content_type' );
    $result = wp_mail( $to, $subject, $html_body );
    remove_filter( 'wp_mail_content_type', 'myprefix_html_content_type' );

    return $result;
}

wp_mail_content_type を常に text/html にするフィルターを付けたままにすると、パスワード再設定などWordPress本体のテキストメールまでHTMLとして扱われ、改行が消えるなどの崩れが起きます。

注意点

  • パスワードやAPIキーは wp-config.php に書き、テーマのファイルや公開リポジトリに書かないでください。wp-config.php のパーミッションも、Webサーバー以外から読めないように設定します
  • SMTPの設定を変えたら、問い合わせフォームの通知など、サイトで実際に使っているメールも1通ずつ届くかを確認します
  • SMTPDebug を有効にしたコードやテスト用のコードは、調査が終わったら無効にします

まとめ

  • wp_mail() は既定でサーバーの mail() を使う。届かないときは、認証つきのSMTPサーバー経由に切り替える
  • プラグインなしなら、wp-config.php の定数と phpmailer_init を使う mu-plugin で設定する。プラグインならWP Mail SMTPを使い、パスワードは定数で渡せる
  • 送信元は wp_mail_from で自分のドメインのアドレスにし、そのドメインのSPF・DKIMも整える
  • wp eval と wp_mail_failed で送信結果を確かめ、必要なときだけ SMTPDebug を有効にする

関連記事

お気軽にご相談ください

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