WordPress のお問い合わせフォームといえば Contact Form 7。定番中の定番で、私も 10 年以上使ってきました。
でも先日、知人のサイトで「毎日迷惑メールが届く」という相談を受けて作業をしたときに、自分でも知らなかったことがいくつも出てきました。フォームは設置して終わりではなく、その後ろにあるメールの仕組みまで整えて初めて完成する——そのことを、あらためて思い知らされた作業でした。
この記事では、Xserver で運用している WordPress サイトに Contact Form 7 を設置する手順を、最初から最後までまとめます。
- フォームの作り方だけでなく、メールが確実に届くための設定
- ボットによるスパムと、人間が手で送ってくる営業メール、それぞれへの対策
- 実際につまずいたエラーとその対処
新しくフォームを設置する方はもちろん、すでに設置済みの方の点検にも使える内容にしました。記事の最後にチェックリストを付けています。
この記事で作るもの
完成形はこうなります。
| 項目 | 内容 |
|---|---|
| フォーム本体 | Contact Form 7 |
| スパム対策 | Cloudflare Turnstile(無料) |
| 送信元アドレス | 独自ドメインのメールアドレス |
| メール認証 | SPF / DKIM / DMARC |
| 送信後 | サンクスページへリダイレクト |
| 自動返信 | 送信者へ控えを返す |
| 営業メール対策 | キーワードによるブロック |
作業時間は、はじめてなら半日程度。2 回目以降は 1〜2 時間で終わります。
全体の流れ
【Xserver 側】
1. 独自ドメインのメールアドレスを作る
2. SPF を確認する
3. DKIM を確認する
4. DMARC を設定する
【Cloudflare 側】
5. Turnstile のウィジェットを作る
【WordPress 側】
6. Contact Form 7 を入れて Turnstile と連携
7. フォーム本文を作る
8. メール設定(管理者宛)
9. メール設定(自動返信)
10. サンクスページを作る
11. Code Snippets でリダイレクトと noindex
12. 営業メール対策
13. テスト送信
Xserver 側から始めるのがポイントです。DNS の変更は反映に時間がかかることがあるので、先に済ませておくと後半で待たされません。
STEP 1|独自ドメインのメールアドレスを作る
なぜ必要なのか
ここがこの記事でいちばん伝えたいところです。
Contact Form 7 の「送信元」に、サイトのドメインとは関係ないアドレス——たとえば普段使っているプロバイダのアドレスや Gmail——を設定しているケースをよく見かけます。
これをやると、メールが届かなくなります。
理由はこうです。メールはサイトのサーバー(Xserver)から送信されます。ところが差出人だけ別のドメインを名乗ると、受信側から見て「そのドメインとは無関係なサーバーから届いた」という状態になります。
これは、なりすましメールとまったく同じ形です。当然、迷惑メール判定されるか、そもそも受け取ってもらえません。
送信元は必ず、サイトと同じドメインのアドレスにしてください。
作成手順
Xserver のサーバーパネルにログインし、メールアカウント設定 を開きます。
- 対象ドメインを選択
- 「メールアカウント追加」タブ
- メールアカウント名に
infoなどを入力 - パスワードを設定して確認画面へ


転送設定をする
作ったアドレスを放置すると、そこに届いたメールに誰も気づきません。普段使っているアドレスへ転送しておきましょう。
メールアカウント設定 → 該当アドレスの「転送」
転送先に普段のアドレスを入力して「追加する」。

ここで一点、注意があります。
「メールボックスに残すかどうかの設定」を「残す」にしてください。
「残さない」だと、転送に失敗したメールが消えます。サーバー上にコピーが残っていれば、後から確認できます。問い合わせフォーム程度の容量なら、保険として残しておくほうが安全です。

STEP 2|SPF を確認する
SPF とは、「このドメインのメールは、このサーバーから送られます」と宣言する仕組みです。受信側はこれを見て、正当な送信元かどうかを判断します。
Xserver では通常、自動で設定されています。
サーバーパネル → SPF設定
対象ドメインが「ON(標準設定)」になっていれば OK です。


念のため、DNS レコードも見ておきましょう。

サーバーパネル → DNSレコード設定
TXT レコードに、こういう行があるはずです。
v=spf1 +a:svXXXXX.xserver.jp +a:ドメイン名 +mx include:spf.sender.xserver.jp ~all
これがあれば問題ありません。

STEP 3|DKIM を確認する
DKIM は、メールに電子署名を付けて「改ざんされていないこと」を証明する仕組みです。SPF と組み合わせることで、信頼性がさらに上がります。
サーバーパネル → DKIM設定

未設定なら「DKIM設定追加」から有効化してください。

対象ドメインが登録されていて、default._domainkey.ドメイン名 という TXT レコードが発行されていれば OK です。


STEP 4|DMARC を設定する
SPF と DKIM を設定しても、なりすましを完全には防げません。DMARC は「認証に失敗したメールをどう扱うか」を指定する仕組みで、この三点セットが揃って初めて信頼性が担保されます。
サーバーパネル → DMARC設定

設定は「何もしない」から始める
ここで重要な注意があります。
DMARC のポリシーには 3 段階あります。
| ポリシー | 意味 |
|---|---|
| 何もしない(p=none) | 認証に失敗しても通常通り配送する |
| 迷惑メールとして配送する(p=quarantine) | 迷惑メールフォルダへ入れるよう指示 |
| メールを配送しない(p=reject) | 受信自体を拒否するよう指示 |

必ず「何もしない」から始めてください。
いきなり「メールを配送しない」にすると、認証に失敗したメールが完全に破棄されます。エラーも返らないので、送ったはずのメールが消えたことに誰も気づきません。
メーリングリストや他サービス経由の自動送信など、思わぬ経路を通っているメールがあると、それらが全部消えます。商用サイトでこれは致命的です。
「何もしない」でも、DMARC レコードが存在すること自体に効果があります。 Gmail などの送信者要件も、これで満たせます。
レポート通知は OFF でよい
DMARC にはレポート機能があり、認証の成功・失敗件数が届きます。
ただしこれは生の XML ファイルが毎日届くもので、人間が読むには向いていません。ポリシーを強めるつもりがないなら、OFF で構いません。
将来ポリシーを強めたくなったときだけ、一時的に ON にして数週間分を確認する——という使い方がおすすめです。
STEP 5|Cloudflare Turnstile のウィジェットを作る
Turnstile は Cloudflare が提供する CAPTCHA の代替サービスです。無料で、ユーザーに面倒な操作をさせずにボットを判定します。
Contact Form 7 の公式ドキュメントでも、reCAPTCHA を使う特別な理由がなければ Turnstile を推奨しています。
アカウントとウィジェット作成
Cloudflare のアカウントを作り(無料)、ダッシュボードにログインします。

アプリケーションセキュリティ → Turnstile → ウィジェットを追加
| 項目 | 設定 |
|---|---|
| ウィジェット名 | サイト名など、分かりやすい名前 |
| ホスト名 | ドメイン(https:// は含めない) |
| ウィジェットモード | 管理対象(Managed) |
| 事前クリアランス | いいえ |
ドメインを Cloudflare で管理していなくても Turnstile は使えます。 ネームサーバーを移す必要はありません。

作成後に表示されるサイトキーとシークレットキーを控えてください。
ホスト名についての補足
Turnstile の判定はホスト名(ドメイン)単位で、パスは見ていません。
つまり example.com を登録すれば、example.com/contact/ も example.com/sub/contact/ も同じウィジェットでカバーできます。同一ドメインなら、1 組のキーを使い回せます。
www ありでもアクセスできる設定なら、www.example.com も追加しておくと安全です。
STEP 6|Contact Form 7 と Turnstile を連携する
WordPress にプラグイン Contact Form 7 をインストールして有効化します。
Turnstile のインテグレーション機能は Contact Form 7 バージョン 6.1 以上で使えます。古い場合は更新してください。
お問い合わせ → インテグレーション → Turnstile →「インテグレーションのセットアップ」
先ほどのサイトキーとシークレットキーを入力して保存します。

STEP 7|フォーム本文を作る
お問い合わせ → 新規追加
タイトルを分かりやすく付けます(例:お問い合わせフォーム)。
フォームタブの中身を、以下に置き換えます。
<p style="color:#c00; font-size:0.9em; border:1px solid #c00; padding:8px;">
※営業・勧誘・広告目的でのお問い合わせはお断りしております。
</p>
<label> お名前 <span class="required">(必須)</span>
[text* your-name autocomplete:name size:70] </label>
<label> メールアドレス <span class="required">(必須)</span>
[email* your-email autocomplete:email size:70] </label>
<label> 電話番号 <span class="required">(必須)</span>
[tel* your-tel autocomplete:tel size:70] </label>
<label> お問い合わせ内容 <span class="required">(必須)</span>
[textarea* your-message size:100] </label>
[turnstile]
[submit "送信する"]

ポイント
項目名は意味のあるものにする
タグジェネレーターを使うと tel-839 のような自動生成の名前が付きます。動きますが、後でメール設定を見たときに何のタグか分からなくなります。your-tel のように意味のある名前にしておきましょう。
autocomplete を指定する
ブラウザの自動入力が効くようになり、入力の手間が減ります。
[turnstile] の位置
送信ボタンの直前に置くと収まりが良くなります。指定しない場合はフォーム上部に表示されます。
冒頭のお断り文
法的な強制力はありませんが、まっとうな営業会社は避けてくれます。地味に効きます。
ラジオボタンを入れる場合の注意
選択肢を追加したいときは、こう書きたくなります。
<label> お問い合わせ種別
[radio your-type use_label_element default:1 "商品について" "修理について" "その他"] </label>
これは保存時にエラーになります。
複数のフォームコントロールが単一の label 要素内に置かれています
[radio] は内部で複数の入力欄を生成するため、1 つの <label> で囲むと HTML として不正になるためです。
<label> ではなく <p> を使ってください。
<p> お問い合わせ種別 <span class="required">(必須)</span><br>
[radio your-type use_label_element default:1 "商品について" "修理について" "その他"] </p>
use_label_element を指定しておくと、各選択肢が個別に <label> で囲まれます。選択肢の文字をタップしても選べるようになるので、スマホでの操作性が上がります。
STEP 8|メール設定(管理者宛)
メールタブを開きます。
| 項目 | 設定値 |
|---|---|
| 送信先 | 実際に受け取るアドレス |
| 送信元 | サイト名 <info@ドメイン名> |
| 題名 | [サイト名] お問い合わせ:[your-name] 様 |
| 追加ヘッダー | Reply-To: [your-email] |
送信元は必ず独自ドメイン
STEP 1 で説明した通りです。ここに送信者のアドレス([your-email])を入れると、なりすまし判定されて届かなくなります。
Reply-To を設定する意味
送信元を info@ドメイン名 にすると、そのままでは返信ボタンを押しても info@ 宛になってしまいます。
Reply-To: [your-email] を入れておけば、返信ボタンでそのまま問い合わせ主に返信できます。
メッセージ本文
ホームページからお問い合わせがありました。
■お名前
[your-name]
■メールアドレス
[your-email]
■電話番号
[your-tel]
■お問い合わせ内容
[your-message]
--
送信日時: [_date] [_time]
送信元ページ: [_url]
[_url] を入れておくと、どのページから送信されたかが分かります。 1 つのサイトに複数フォームがある場合や、後から調査が必要になったときに役立ちます。
⚠️ HTML形式のチェックを外す
「HTML 形式のメールを使用する」のチェックは外してください。
本文をプレーンテキストで書いているのに HTML 形式にすると、改行がすべて無視されて 1 行につながります。 項目の区切りが崩れ、非常に読みにくいメールが届きます。
初期状態でチェックが入っていることがあるので、必ず確認してください。

STEP 9|メール設定(自動返信)
「メール (2) を使用」にチェックを入れます。
| 項目 | 設定値 |
|---|---|
| 送信先 | [your-email] |
| 送信元 | サイト名 <info@ドメイン名> |
| 題名 | 【サイト名】お問い合わせありがとうございます |
| 追加ヘッダー | Reply-To: 実際に受け取るアドレス |
こちらは Reply-To が逆になります。送信者が自動返信メールに返信したとき、管理者に届くようにするためです。
メッセージ本文
[your-name] 様
この度は、お問い合わせいただきありがとうございます。
以下の内容で承りました。
内容を確認のうえ、担当者より改めてご連絡いたします。
通常2営業日以内にお返事しております。
──────────────────────────
■お名前
[your-name]
■メールアドレス
[your-email]
■電話番号
[your-tel]
■お問い合わせ内容
[your-message]
──────────────────────────
※このメールは自動送信です。
※2日以上経っても連絡がない場合は、
正しく受信できていない可能性がございます。
恐れ入りますが、お電話にてご連絡ください。
──────────────────────────
サイト名
TEL:00-0000-0000
営業時間:10:00~18:00
定休日:毎週◯曜日
https://example.com/
──────────────────────────
入力内容の控えを返す
自動返信に入力内容を含めておくと、送信者が「何を書いて送ったか」を後から確認できます。親切ですし、問い合わせが二重に来るのを防げます。
「届かない場合」の案内を入れる
これは古くからよくある文面ですが、いまも有効です。メールは 100% 届く保証がないので、電話という代替経路を示しておくことで取りこぼしを防げます。
STEP 10|サンクスページを作る
固定ページで新規作成します。URL は /thanks/ など分かりやすいものに。
文面の例
<p style="text-align: center; font-size: 1.2em;"><strong>お問い合わせありがとうございました</strong></p>
<p>この度は、お問い合わせいただきありがとうございます。<br>
ご入力いただいたメールアドレス宛に、確認のメールをお送りしました。</p>
<p>内容を確認のうえ、担当者より改めてご連絡いたします。<br>
通常2営業日以内にお返事しております。今しばらくお待ちください。</p>
<p><strong>確認メールが届かない場合</strong><br>
迷惑メールフォルダに振り分けられている可能性があります。お手数ですがご確認ください。<br>
2日以上経っても連絡がない場合は、正しく受信できていない可能性がございますので、恐れ入りますがお電話にてご連絡をお願いいたします。</p>
<p style="text-align: center;">
<strong>サイト名</strong><br>
TEL:<a href="tel:00-0000-0000">00-0000-0000</a><br>
営業時間:10:00~18:00<br>
定休日:毎週◯曜日
</p>
ポイント
- 電話番号を
tel:リンクにする。スマホでタップすれば発信できます - 「確認メールを送りました」と明記する。自動返信が届く前提が伝わります
- 迷惑メールフォルダの確認を促す。これがないと問い合わせが二重に来ます
メニューに出ていないか確認
固定ページを作ると、テーマによっては自動でナビゲーションメニューに追加されることがあります。「送信完了」ページがメニューに並んでいると格好がつかないので、外観 → メニューで確認してください。
STEP 11|Code Snippets でリダイレクトと noindex
プラグイン Code Snippets をインストールして有効化します。
functions.php を直接触るより安全で、管理もしやすくなります。テーマを変えてもスニペットは残ります。
なぜフォーム本文に <script> を書かないのか
Contact Form 7 のフォーム本文に直接 <script> を書く方法が広く知られていますが、これは公式には非推奨です。フォーム編集画面の想定外の使い方で、将来のバージョンで動かなくなる可能性があります。
スニペット①:送信後にサンクスページへリダイレクト
スニペット → 新規追加
タイトル:CF7 送信後サンクスページへリダイレクト
add_action( 'wp_footer', function() {
if ( ! function_exists( 'wpcf7_enqueue_scripts' ) ) {
return;
}
?>
<script>
document.addEventListener('wpcf7mailsent', function(event) {
location = 'https://example.com/thanks/';
}, false);
</script>
<?php
}, 20 );
Location(実行場所):Only run on site front-end(フロントエンドのみ実行)

複数フォームがある場合
サイトに複数のフォームがあると、上記のコードでは全部が同じサンクスページに飛びます。フォーム ID で分岐させましょう。
document.addEventListener('wpcf7mailsent', function(event) {
if ('123' == event.detail.contactFormId) {
location = 'https://example.com/thanks/';
}
}, false);
123 の部分は、フォーム編集画面のショートコードに表示されている ID です。
スニペット②:サンクスページを noindex にする
サンクスページが検索結果に出ると、問い合わせしていない人が「送信完了」画面を見ることになります。
SEO 系プラグイン(SEO SIMPLE PACK、Yoast SEO、All in One SEO など)が入っていれば、固定ページの編集画面から個別に設定できます。
入っていない場合は、Code Snippets で対応できます。
タイトル:サンクスページを noindex にする
add_action( 'wp_head', function() {
if ( is_page( 'thanks' ) ) {
echo '<meta name="robots" content="noindex,nofollow">' . "\n";
}
}, 1 );
'thanks' の部分は固定ページのスラッグです。
Location:Only run on site front-end
確認方法
サンクスページを開いて、右クリック →「ページのソースを表示」。<head> 内に以下があれば成功です。
<meta name="robots" content="noindex,nofollow">
STEP 12|営業メール対策
ここからが、この記事のもう一つの本題です。
Turnstile では止まらないものがある
Turnstile を入れれば安心——と思いがちですが、Turnstile が判定するのは「機械か人間か」だけです。
つまり、こういうメールは通過します。
株式会社◯◯の△△と申します。
突然のご連絡失礼いたします。
弊社では、貴社の事業をより多くの方に知っていただくための
特集記事の掲載をご提案しております。
・受注率の向上
・新たな販路拡大
...
実在する会社の営業担当者が、サイトを見て、手で入力して送っています。人間が送っているので、Turnstile は正しく「人間」と判定して通します。
これは Turnstile の不具合ではなく、そういう性質のものです。
営業メールの特徴
こうしたメールを何通か観察すると、共通する言い回しが見えてきます。
- 「弊社」「貴社」「御社」
- 「ご担当者様」
- 「突然のご連絡」
- 「ご検討されていませんか」
- 「初期費用」「月額」
- 「販路拡大」「受注率」「集客」「業務効率化」
一方、一般のお客様がこういう語を使うことは、まずありません。ここに線を引けます。
キーワードブロックの実装
Code Snippets に追加します。
タイトル:CF7 営業メールのブロック
add_filter( 'wpcf7_spam', function( $spam, $submission ) {
if ( $spam ) {
return $spam;
}
$data = $submission->get_posted_data();
$text = '';
foreach ( array( 'your-message', 'your-name', 'your-company' ) as $key ) {
if ( ! empty( $data[ $key ] ) ) {
$text .= (string) $data[ $key ] . "\n";
}
}
// 営業メールに頻出する語
$ng_words = array(
'弊社',
'貴社',
'御社',
'ご担当者様',
'ご担当者さま',
'突然のご連絡',
'ご検討されて',
'ご提案',
'初期費用',
'月額',
'導入事例',
'無料でご案内',
'販路拡大',
'受注率',
'成約率',
'集客',
'コスト削減',
'業務効率化',
'生成AI',
'ランディングページ',
'記事化',
'特集記事',
'掲載させていただき',
);
$hit = 0;
foreach ( $ng_words as $word ) {
if ( false !== mb_strpos( $text, $word ) ) {
$hit++;
}
}
// 2語以上該当したらスパム判定
if ( $hit >= 2 ) {
return true;
}
return $spam;
}, 10, 2 );
Location:Only run on site front-end
設計の考え方
1 語だけでは弾かないのがポイントです。
「弊社は◯◯という店です」と書く一般の方もいます。1 語で判定すると誤爆します。
2 語以上が重なったときだけブロックすることで、営業文特有の「密度」を捉えられます。営業メールは短い文章の中にこれらの語がいくつも詰め込まれるので、この方式でよく引っかかります。
テストする
営業文を自作して送信してみてください。
株式会社テストの山田と申します。
突然のご連絡失礼いたします。
弊社では月額9,900円からのサービスをご提案しております。
ご検討いただけませんでしょうか。
「送信に失敗しました」と表示されればブロック成功です。
続けて、正常な問い合わせもテストします。
先日購入した商品について、修理をお願いしたいのですが、
木曜以外であればいつでも伺えます。
こちらは通るはずです。
注意点
ブロックされた送信は完全に消えます。 Contact Form 7 には記録が残りません。
サイトの業種によっては、正当な問い合わせに「掲載」「ご提案」などが含まれる可能性があります。導入後は、問い合わせが極端に減っていないかをしばらく気にしてください。誤爆が疑われる場合は $ng_words から該当語を外すか、判定しきい値を 3 に上げます。
Akismet について
Contact Form 7 は Akismet とも連携できます。ただし Akismet の無料プランは非商用サイト限定です。商用サイトで使う場合は有料プランが必要になります。
また、Akismet が得意なのは機械的なスパムで、人間が書いたまともな日本語の営業メールを弾けるかは未知数です。費用対効果を考えると、まずはキーワードブロックを試すのがおすすめです。
STEP 13|テスト送信
必ずこの順序で行ってください。
- リダイレクトのスニペットを無効にしたまま、テスト送信する
- メールが 2 通届くか確認(管理者宛・自動返信)
- 迷惑メールフォルダに入っていないか確認
- 問題なければリダイレクトのスニペットを有効化
- もう一度テスト送信して、リダイレクトを確認
- サンクスページのソースで noindex を確認
なぜこの順序なのか。
リダイレクトが有効だと、送信エラーが起きても画面が切り替わってしまい、Contact Form 7 のエラーメッセージが読めません。原因究明が非常に困難になります。
テスト用ページを使う
既存のフォームページで直接テストせず、テスト用の固定ページを作って試すほうが安全です。既存フォームは、新フォームの動作確認が完全に終わるまで残しておきましょう。
宛先を戻すのを忘れずに
テスト中は送信先を自分のアドレスにしておくと便利です。ただし、本番稼働前に必ず本来の宛先に戻してください。 これは非常に忘れやすいポイントです。
既存フォームからの移行手順
すでにフォームがある場合の、切り替え手順です。
1. 新しいページを作る
既存ページを編集するのではなく、新規に固定ページを作るほうが安全です。旧ページは残したまま新フォームを完成させ、動作確認してから切り替えます。
2. URL を変える
これがスパム対策として効きます。
長年同じ URL でフォームを公開していると、そのアドレスがボットや営業リストに登録されています。URL を変えるだけで、リストからは外れます。
例:/contact/ → /mail/
3. メニューのリンクを差し替える
ヘッダー、フッター、サイドバーのリンクを新しい URL に変更します。
それだけでは不十分です。 サイト内を一通り回って、以下も確認してください。
- トップページの「お問い合わせはこちら」ボタン
- 各ページ本文中のリンク
- ウィジェット内のリンク
4. 旧 URL から 301 リダイレクト
旧 URL は、名刺やチラシに記載されていたり、検索結果に残っていたりします。そのまま 404 にすると、そこへ来た方は問い合わせできずに離脱します。
まず旧ページをゴミ箱に入れてから、Code Snippets に以下を追加します。
add_action( 'template_redirect', function() {
if ( is_404() ) {
$path = trim( parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), '/' );
if ( 'contact' === $path ) {
wp_redirect( home_url( '/mail/' ), 301 );
exit;
}
}
} );
旧ページを先にゴミ箱へ入れてください。 同じスラッグの固定ページが存在していると、リダイレクトが効きません。

5. しばらく様子を見る
ゴミ箱のページも、旧プラグインも、1〜2 週間は残しておきましょう。 すべて問題なく動いていることを確認してから削除します。
サブディレクトリに別の WordPress がある場合
example.com と example.com/sub/ に別々の WordPress をインストールしているケースがあります。この場合の注意点です。
共通で使えるもの
- Turnstile のキー(同一ドメインなので使い回せる)
- メールアドレス(
[email protected]を両方の送信元に使える) - SPF / DKIM / DMARC(ドメイン単位の設定なので 1 回で済む)
別々に必要なもの
- Contact Form 7 のインストールと設定
- Code Snippets のインストールとスニペット
- サンクスページ
件名に識別子を入れる
同じアドレスで受け取る場合、どちらのサイトからの問い合わせか区別がつかなくなります。
件名に固定の文字列を入れておきましょう。
[本店] お問い合わせ:[your-name] 様
[◯◯部門] お問い合わせ:[your-name] 様
メールソフトの振り分け機能でこの文字列を使えば、自動でフォルダ分けできます。
リダイレクトのパス指定
サブディレクトリ側でリダイレクトを設定する場合、少し注意が要ります。
// $path はサーバーから見た実際のパスなので "sub/" を含める
if ( 'sub/contact' === $path ) {
// home_url() はサブディレクトリを指すので "/mail/" だけでよい
wp_redirect( home_url( '/mail/' ), 301 );
exit;
}
判定する $path にはサブディレクトリ名を含め、飛び先の home_url() には含めない——ここを間違えるとループします。
つまずきポイントまとめ
実際に作業して引っかかった箇所です。
| 症状 | 原因と対処 |
|---|---|
| メールが届かない | 送信元がサイトのドメインと違う。独自ドメインのアドレスにする |
| メールの改行が消える | 「HTML 形式のメールを使用する」のチェックを外す |
| 保存時に label のエラー | [radio] を <label> で囲んでいる。<p> に変える |
| リダイレクトが効かない | 旧ページと同じスラッグが残っている。先にゴミ箱へ |
| エラーの原因が分からない | リダイレクトを一時的に無効にしてテストする |
| Turnstile が表示されない | Contact Form 7 が 6.1 未満。更新する |
| 転送メールが消えた | 「メールボックスに残す」設定にする |
| DMARC 設定後にメールが消えた | p=reject にしている。p=none から始める |
作業チェックリスト
新規設置・既存サイトの点検、どちらにも使えます。
Xserver 側
- [ ] 独自ドメインのメールアドレスを作成した
- [ ] 転送設定をした
- [ ] 「メールボックスに残す」にした
- [ ] SPF が ON になっている
- [ ] DKIM が設定されている
- [ ] DMARC を「何もしない(p=none)」で設定した
Cloudflare 側
- [ ] Turnstile ウィジェットを作成した
- [ ] ホスト名にドメインを登録した(www も)
- [ ] サイトキー・シークレットキーを控えた
WordPress 側
- [ ] Contact Form 7 が 6.1 以上
- [ ] インテグレーションに Turnstile のキーを入力した
- [ ] フォーム本文に
[turnstile]を入れた - [ ] 項目名を意味のあるものにした
- [ ] 営業お断りの一文を入れた
- [ ] 送信元が独自ドメインのアドレスになっている
- [ ] Reply-To を設定した(管理者宛・自動返信の両方)
- [ ] 「HTML 形式のメールを使用する」のチェックを外した
- [ ] メール(2)(自動返信)を有効化した
- [ ] 件名に識別子を入れた(複数サイト運用の場合)
- [ ] サンクスページを作成した
- [ ] サンクスページを noindex にした
- [ ] サンクスページがメニューに出ていない
- [ ] Code Snippets でリダイレクトを設定した
- [ ] 営業メール対策のスニペットを入れた
移行の場合
- [ ] 既存フォームのデータを書き出した
- [ ] 既存フォームの設定内容を控えた
- [ ] フォームページの URL を変更した
- [ ] ヘッダー・フッターのリンクを差し替えた
- [ ] サイト内の他のリンクも確認した
- [ ] 旧 URL から 301 リダイレクトを設定した
テスト
- [ ] リダイレクト無効の状態でテスト送信した
- [ ] メールが 2 通届いた
- [ ] 迷惑メールフォルダに入っていない
- [ ] リダイレクトを有効化して再テストした
- [ ] 営業文でブロックされることを確認した
- [ ] 通常文が通ることを確認した
- [ ] 送信先を本来のアドレスに戻した
おわりに
Contact Form 7 は 10 年以上使ってきたプラグインですが、今回の作業で知らなかったことがいくつも出てきました。
特に痛感したのは、「フォームを設置する」という作業の範囲が、思っていたより広いということです。
フォームのタグを書いて、メールの宛先を入れれば動く。それは確かにその通りなのですが、その先には
- そのメールは本当に届いているのか(SPF / DKIM / DMARC)
- 送信者に控えは返っているか(自動返信)
- 送信後の体験は適切か(サンクスページ)
- 迷惑メールが来ないか(Turnstile / キーワードブロック)
という問題が続いています。動いているように見えても、実は届いていない、というのが一番怖いところです。
もし何年も前に設置したまま触っていないフォームがあれば、この機会にチェックリストで点検してみてください。
この記事の内容は執筆時点のものです。プラグインやサービスの仕様は変わることがあるので、公式ドキュメントもあわせてご確認ください。
