phpmailer_initでWordPressのメール送信をSMTPへ切り替える例です。SMTPの接続情報を環境変数から読み取り、管理者の操作で1通送るテスト画面を用意します。
送信元と接続情報を準備
メール提供元が指定するSMTPホスト、認証ユーザー、パスワード、送信を許可されたFromアドレスを確認します。次の例は587番ポートのSTARTTLS用です。465番の暗黙TLSが指定された契約では、ポートと暗号化方式を両方変更してください。失敗したから暗号化を外す手順ではありません。
サーバーのPHP実行環境へWAZA_SMTP_HOST、WAZA_SMTP_USER、WAZA_SMTP_PASSWORD、WAZA_SMTP_FROMを設定します。環境変数の設定方法はホスティングに依存します。パスワードを記事、共有コード、画面ログへ記載しないでください。既存のSMTPプラグインやpre_wp_mailで別の配信経路へ送る処理とは併用しません。
SMTPの設定コード
テーマを切り替えても必要な処理なので専用プラグインなどへ追加します。子テーマfunctions.phpに入れる場合、既存PHP内では開始タグを省きます。環境変数が不足・不正ならpre_wp_mailでfalseを返して送信前に止めます。同じリクエスト内では最初に読んだ設定を使用します。旧版のようにphpmailer_initから設定不足の例外を投げません。
function waza_smtp_config() {
static $config = null;
if ($config !== null) return $config;
$config = array(
'host' => getenv('WAZA_SMTP_HOST'),
'user' => getenv('WAZA_SMTP_USER'),
'pass' => getenv('WAZA_SMTP_PASSWORD'),
'from' => getenv('WAZA_SMTP_FROM'),
);
foreach ($config as $value) {
if (!is_string($value) || $value === '') {
$config = false;
return false;
}
}
if (!is_email($config['from'])) $config = false;
return $config;
}
add_filter('pre_wp_mail', function ($result) {
if (waza_smtp_config() === false) {
do_action('wp_mail_failed', new WP_Error('waza_smtp_configuration', 'SMTP configuration is incomplete.'));
return false;
}
return $result;
});
function waza_configure_smtp($mailer) {
$config = waza_smtp_config();
if ($config === false) return; // pre_wp_mailで送信を止める。
$mailer->isSMTP();
$mailer->Host = $config['host'];
$mailer->SMTPAuth = true;
$mailer->Port = 587;
$mailer->SMTPSecure = \PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
$mailer->Username = $config['user'];
$mailer->Password = $config['pass'];
$mailer->SMTPDebug = 0;
$mailer->setFrom($config['from'], get_bloginfo('name'), false);
// 問い合わせフォームが指定したReply-Toは消さない。
}
add_action('phpmailer_init', 'waza_configure_smtp');
Reply-Toは問い合わせフォームが設定した値を維持します。Fromは契約で許可されたアドレスを使います。MXは受信先に関わる設定であり、SMTP接続の成功だけを決めるものではありません。SPF・DKIM・DMARCは提供元の案内に沿って確認します。
管理者が明示的に1通送るテスト画面
テスト時だけ次を追加し、WAZA_SMTP_TEST_TOへ自分が受信確認できる宛先を設定します。「ツール→SMTPテスト」のボタンを押したPOSTだけで送信し、権限とnonceを確認します。同じ利用者の通常の連続実行は60秒間抑制します。同時リクエストを厳密に1通へ制限するロックではありません。
function waza_smtp_test_page() {
if (!current_user_can('manage_options')) return;
echo '<div class="wrap"><h1>SMTPテスト</h1><p>環境変数WAZA_SMTP_TEST_TOで指定した、自分が受信確認できる宛先へ1通送ります。</p>';
echo '<form method="post" action="' . esc_url(admin_url('admin-post.php')) . '">';
echo '<input type="hidden" name="action" value="waza_smtp_test">';
wp_nonce_field('waza_smtp_test');
submit_button('テストメールを1通送信');
echo '</form></div>';
}
add_action('admin_menu', function () {
add_management_page('SMTPテスト', 'SMTPテスト', 'manage_options', 'waza-smtp-test', 'waza_smtp_test_page');
});
add_action('admin_post_waza_smtp_test', function () {
if (!current_user_can('manage_options') || ($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') {
wp_die('実行できません。', '', array('response' => 403));
}
check_admin_referer('waza_smtp_test');
$to = getenv('WAZA_SMTP_TEST_TO');
if (!is_email($to)) wp_die('テスト宛先を設定してください。');
$key = 'waza_smtp_test_' . get_current_user_id();
if (get_transient($key)) wp_die('続けて送信せず、受信結果を確認してください。');
set_transient($key, 1, MINUTE_IN_SECONDS);
$ok = wp_mail($to, 'WordPress SMTP test', 'SMTPの受信確認用メッセージです。');
wp_die($ok ? '送信処理は成功しました。受信箱と迷惑メールを確認してください。' : '送信処理に失敗しました。管理画面へ戻って設定を確認してください。');
});
送信成功と受信確認を分ける
wp_mailがtrueでも受信箱へ到着した保証はありません。受信箱・迷惑メール・送信サービスの結果を確認します。失敗時はホスト、ポートと暗号化の組、認証、Fromの許可、送信上限を調べます。生の認証情報をログへ出さないでください。テスト画面は調査後に停止します。
戻す場合はこのフック登録を停止し、元のメール送信設定を復元して確認します。過去の検証はPHPMailerオブジェクトの設定確認に限定し、実SMTP接続やメール配信を実行していません。2026年10月21日は設定不足を送信前に止める処理へ改訂しました。現在の実SMTP接続・実メール配送・テスト管理画面の操作は未検証です。
よくある質問:コードだけでSMTPを設定する方法(PHPMailer)
この記事では、何をしますか?
記事では、phpmailer_initでWordPressのメール送信をSMTPへ切り替える例を紹介しています。SMTPの接続情報を環境変数から読み取り、管理者の操作で1通送るテスト画面を用意します。
事前に、何を準備しますか?
メール提供元が指定するSMTPホスト、認証ユーザー、パスワード、送信を許可されたFromアドレスを確認します。記事では、サーバーのPHP実行環境へWAZA_SMTP_HOST、WAZA_SMTP_USER、WAZA_SMTP_PASSWORD、WAZA_SMTP_FROMを設定します。環境変数の設定方法はホスティングに依存します。パスワードを記事、共有コード、画面ログへ記載しないでください。
ポートや暗号化は、どう設定しますか?
記事の例は587番ポートのSTARTTLS用です。465番の暗黙TLSが指定された契約では、ポートと暗号化方式を両方変更してください。記事では、失敗したから暗号化を外す手順ではありません。
コードは、どこに追加しますか? 既存のSMTPプラグインとは?
テーマを切り替えても必要な処理なので専用プラグインなどへ追加します。子テーマのfunctions.phpに入れる場合、既存PHP内では開始タグを省きます。記事では、既存のSMTPプラグインやpre_wp_mailで別の配信経路へ送る処理とは併用しません。環境変数が不足・不正ならpre_wp_mailでfalseを返して送信前に止めます。同じリクエスト内では最初に読んだ設定を使用します。旧版のようにphpmailer_initから設定不足の例外を投げません。
ReplyToやFromは、どうなりますか?
記事では、Reply-Toは問い合わせフォームが設定した値を維持します。Fromは契約で許可されたアドレスを使います。MXは受信先に関わる設定であり、SMTP接続の成功だけを決めるものではありません。SPF・DKIM・DMARCは提供元の案内に沿って確認します。
テスト送信は、どうしますか?
テスト時だけ記事のコードを追加し、WAZA_SMTP_TEST_TOへ自分が受信確認できる宛先を設定します。記事では、「ツール→SMTPテスト」のボタンを押したPOSTだけで送信し、権限とnonceを確認します。同じ利用者の通常の連続実行は60秒間抑制します。同時リクエストを厳密に1通へ制限するロックではありません。テスト画面は調査後に停止します。
wp_mailがtrueなら、メールは届いていますか? 検証の範囲は?
記事では、wp_mailがtrueでも受信箱へ到着した保証はありません。受信箱・迷惑メール・送信サービスの結果を確認し、失敗時はホスト、ポートと暗号化の組、認証、Fromの許可、送信上限を調べます。生の認証情報をログへ出さないでください。過去の検証はPHPMailerオブジェクトの設定確認に限定し、実SMTP接続やメール配信を実行していません。2026年10月21日は設定不足を送信前に止める処理へ改訂しました。現在の実SMTP接続・実メール配送・テスト管理画面の操作は未検証です。戻す場合はこのフック登録を停止し、元のメール送信設定を復元して確認します。最新は公式で確認してください。



