PHP で動作する汎用メールフォーム TransmitMail で、WordPress の機能にあるようなパスワード保護(パスワードを知ってる人だけが本文を閲覧可能)を設定して、パスワードを入れないとフォームが表示されない仕組みを作ってみました。

JavaScript で実装することもできますが、ブラウザのソースを見たらフォーム部分がわかりますし、デベロッパーツールでソースを編集してフォームを表示することもできてしまいます。

一方、TransmitMail は PHP で動作しますので、PHP で実装することにしました。PHP を使えばブラウザのソースには現れません。

TransmitMail のテンプレートは HTML ファイルなので、これに直接 PHP を書くことはできません。これについては以前の記事「TransmitMail のテンプレートで PHP を使う」で書いてます。

この記事で編集した index.php を元に、ChatGPT と話しながら完成したのが以下です。

まず、パスワード認証用のページを lock.php として作成します。

<?php // パスワード認証ページ
session_start();

$password = "12345678"; // パスワード

if (isset($_POST['password'])) {
    if ($_POST['password'] === $password) {
        $_SESSION['tm_auth'] = true;
        
        // 認証後にフォームへ
        header("Location: index.php");
        exit;
    }
    $error = "パスワードが違います。";
}

include 'header.php';
?>
<p><label for="password">パスワードを入力してください。</label></p>

<?php if(!empty($error)): ?>
<p style="color:#c00;"><?= $error ?></p>
<?php endif; ?>

<form method="post">
  <input type="password" name="password" id="password">
  <button type="submit">送信</button>
</form>
<?php
include 'footer.php';
?>

これを index.php の先頭に読み込んで認証済みかどうかをチェックし、認証してなければ lock.php へ飛ばします。

<?php

// パスワード保護
session_start();
if (empty($_SESSION['tm_auth'])) {
  header("Location: lock.php");
  exit;
}

include 'header.php';

require_once 'lib/TransmitMail.php';
$tm = new TransmitMail();
$tm->init('config/config.yml');
$tm->run();

include 'footer.php';

これで WordPress のパスワード保護と同様の仕組みが出来上がりました。