Transmitmail(お問い合わせフォーム)にGoogle reCAPTCHA v3を設置する方法
カテゴリ:WEB制作
※当サイトはアフィリエイト広告を利用しています。
TransmitmailはPHP5.6以上で動作するMITライセンスのメールフォームです。
最新版はv2.6.2でコードはこちらよりダウンロードできます。
最終更新は2022年頃でGoogle reCAPTCHAには対応していないようです。
Google reCAPTCHAはコンピュータを操作しているのが人間かボットかを見分けるシステムです。
お問い合わせフォームを設置していると度々、ボットによる攻撃を受けることがあります。
今回はこのGoogle reCAPTCHA v3をTransmitmailに導入する方法を説明します。
Transmitmailの設置方法についてはこちらに説明がありますので割愛します。
form内にGoogle reCAPTCHAのフィールドを設置する
input.html内のformタグ内に以下をフィールドを設置します。
<input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response">
Javascriptを設置
APIの読み込みとページを読み込む際にトークンを取得します。
footerやheaderなどに以下のコードを設置してください。
<script src="https://www.google.com/recaptcha/api.js?render=サイトキーを入力"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('サイトキーを入力', {action: 'submit'}).then(function(token) {
document.getElementById('g-recaptcha-response').value = token;
});
});
</script>
フォームの動作部分を改修する
lib/TransmitMail.phpにGoogle reCAPTCHAの取得、検証などを追加します。
入力項目として除外する項目を編集
46行目に『public $exclusion_item =』という項目がありますがここに『input.html』で設置したreCAPTCHAのフィールドのname属性の値を設置します。
以下は該当箇所の変更後のソースです。
// 入力情報として除外する項目
public $exclusion_item = '[
"x",
"y",
"page_name",
"required",
"hankaku",
"hankaku_eisu",
"hankaku_eiji",
"num",
"num_hyphen",
"hiragana",
"zenkaku_katakana",
"zenkaku",
"zenkaku_all",
"email",
"match",
"len",
"url",
"num_range",
"file",
"file_remove",
"file_required",
"csrf_token",
"g-recaptcha-response"
]';
913行目あたりに入力内容をセットする箇所があるのでここの中に
if (!empty($_POST['g-recaptcha-response'])) {
$_SESSION['g-recaptcha-response'] = $_POST['g-recaptcha-response'];
}
if (isset($_SESSION['g-recaptcha-response'])) {
$this->tpl->set('g_recaptcha_response', $_SESSION['g-recaptcha-response']);
$hiddens[] = $this->getInputHidden('g-recaptcha-response', $_SESSION['g-recaptcha-response']);
}
1094行目にあるメールの送信を行う箇所(sendmail)に
// reCAPTCHAの設定
$recaptcha_secret = 'シークレットキーを入力';
$recaptcha_response = $_POST['g-recaptcha-response'];
// reCAPTCHAの検証
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_data = array(
'secret' => $recaptcha_secret,
'response' => $recaptcha_response
);
$options = array(
'http' => array(
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'content' => http_build_query($recaptcha_data),
)
);
$context = stream_context_create($options);
$response = file_get_contents($recaptcha_url, false, $context);
$result = json_decode($response, true);
// デバッグ情報の出力
error_log(print_r($result, true));
if (!($result['success'] && $result['score'] >= 0.5)) {
// reCAPTCHA検証に失敗した場合、エラーメッセージを表示して終了
echo 'reCAPTCHAの検証に失敗しました。もう一度お試しください。';
exit; // スクリプトを終了
}
ファイルの編集は以上です。
検証について
まず右下にreCAPTCHAのアイコンが出ているか確認しましょう。
実際に問い合わせフォームを動作させます。
そのあと、Google reCAPTHAのv3 Admin Consoleに入ってリクエスト回数を確認してください。(タイムラグがありますので翌日に確認しましょう。)
カウントが入っていれば無事に稼働しています。
※本記事の動作確認はPHP8.3で行っています。




