Amazonで商品を見る セール会場へ

WordPress│コードだけでSMTPを設定する方法│PHPMailer

phpmailer_initでWordPressのメール送信をSMTPへ切り替える例です。SMTPの接続情報を環境変数から読み取り、管理者の操作で1通送るテスト画面を用意します。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

送信元と接続情報を準備

メール提供元が指定するSMTPホスト、認証ユーザー、パスワード、送信を許可されたFromアドレスを確認します。次の例は587番ポートのSTARTTLS用です。465番の暗黙TLSが指定された契約では、ポートと暗号化方式を両方変更してください。失敗したから暗号化を外す手順ではありません。

サーバーのPHP実行環境へWAZA_SMTP_HOST、WAZA_SMTP_USER、WAZA_SMTP_PASSWORD、WAZA_SMTP_FROMを設定します。環境変数の設定方法はホスティングに依存します。パスワードを記事、共有コード、画面ログへ記載しないでください。既存のSMTPプラグインとは二重設定しません。

SMTPの設定コード

テーマを切り替えても必要な処理なので専用プラグインなどへ追加します。子テーマfunctions.phpに入れる場合、既存PHP内では開始タグを省きます。環境変数が未設定なら送信を失敗させ、別方式へ黙って切り替えません。

function waza_configure_smtp($mailer) {
    $host = getenv('WAZA_SMTP_HOST');
    $user = getenv('WAZA_SMTP_USER');
    $pass = getenv('WAZA_SMTP_PASSWORD');
    $from = getenv('WAZA_SMTP_FROM');
    if (!$host || !$user || !$pass || !is_email($from)) {
        throw new \PHPMailer\PHPMailer\Exception('SMTP configuration is incomplete.');
    }
    $mailer->isSMTP();
    $mailer->Host = $host;
    $mailer->SMTPAuth = true;
    $mailer->Port = 587;
    $mailer->SMTPSecure = \PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
    $mailer->Username = $user;
    $mailer->Password = $pass;
    $mailer->SMTPDebug = 0;
    $mailer->setFrom($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秒間抑制します。

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接続やメール配信を実行していません。

参照:phpmailer_init、wp_mail。

  • URLをコピーしました!

実装を任せたい方へ

WordPressのカスタマイズ代行

ブロックの追加、テーマの改修、管理画面の調整など、記事で紹介している内容の実装を承ります。1時間 ¥8,000〜(税込)。

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次