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を有効にする