Contact Form 7 と Xserver で「ちゃんと届く・迷惑メールが来ない」お問い合わせフォームを作る完全手順

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 のサーバーパネルにログインし、メールアカウント設定 を開きます。

  1. 対象ドメインを選択
  2. 「メールアカウント追加」タブ
  3. メールアカウント名に info などを入力
  4. パスワードを設定して確認画面へ

転送設定をする

作ったアドレスを放置すると、そこに届いたメールに誰も気づきません。普段使っているアドレスへ転送しておきましょう。

メールアカウント設定 → 該当アドレスの「転送」

転送先に普段のアドレスを入力して「追加する」。

ここで一点、注意があります。

「メールボックスに残すかどうかの設定」を「残す」にしてください。

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


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|テスト送信

必ずこの順序で行ってください。

  1. リダイレクトのスニペットを無効にしたまま、テスト送信する
  2. メールが 2 通届くか確認(管理者宛・自動返信)
  3. 迷惑メールフォルダに入っていないか確認
  4. 問題なければリダイレクトのスニペットを有効化
  5. もう一度テスト送信して、リダイレクトを確認
  6. サンクスページのソースで 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 / キーワードブロック)

という問題が続いています。動いているように見えても、実は届いていない、というのが一番怖いところです。

もし何年も前に設置したまま触っていないフォームがあれば、この機会にチェックリストで点検してみてください。


この記事の内容は執筆時点のものです。プラグインやサービスの仕様は変わることがあるので、公式ドキュメントもあわせてご確認ください。

目次