<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>問い合わせフォーム | けゆきブログ / Keyuki Blog</title>
    <link>https://blog.keyuki.net/tags/%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0/</link>
    <description>けゆきブログは、お金・IT・AI活用と暮らしの工夫を、実体験をもとに整理する個人ブログです。</description>
    <language>ja-JP</language>
    <atom:link href="https://blog.keyuki.net/tags/%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>問い合わせフォームは送れていた。でも通知が来ていなかった</title>
      <link>https://blog.keyuki.net/posts/contact-form-notification-resend/</link>
      <pubDate>Mon, 07 Sep 2026 09:00:00 &#43;0900</pubDate>
      <guid>https://blog.keyuki.net/posts/contact-form-notification-resend/</guid>
      <description>&lt;p&gt;ブログの問い合わせフォームを見直していて、変なことに気づきました。&lt;/p&gt;
&lt;p&gt;フォームに入力して送信すると、「お問い合わせありがとうございます」のページへ移動します。送った内容も Cloudflare の KV に保存されています。&lt;/p&gt;
&lt;p&gt;ここまでは動いていました。&lt;/p&gt;
&lt;p&gt;でも、私には何の通知も来ません。&lt;/p&gt;
&lt;p&gt;誰かが問い合わせを送っても、自分から Cloudflare の管理画面を見に行かない限り気づけない状態でした。&lt;/p&gt;
&lt;p&gt;問い合わせなんて、そんなにたくさん来ないとは思います。だからといって、せっかく来た問い合わせに気づかないのはさすがにまずいです。&lt;/p&gt;
&lt;p&gt;そこで今回は、フォームにスパム対策を付け、送信内容を保存したあと、メールでも通知するところまで作りました。&lt;/p&gt;
&lt;p&gt;途中で Cloudflare のメール機能を使おうとしてやめ、最終的には Resend というメール送信サービスを使っています。&lt;/p&gt;
&lt;h2 id=&#34;今回作ったもの&#34;&gt;今回作ったもの&lt;/h2&gt;
&lt;p&gt;先に全体を図にすると、こうなります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;読者がフォームを送る
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Turnstileで人間か確認する
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;問い合わせ内容をCloudflare KVに保存する
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Resendから通知メールを送る
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Google Workspaceの受信箱に届く
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;知らない名前がいくつか出てきますが、役割は単純です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Turnstile&lt;/strong&gt;：Cloudflareのスパム対策&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KV&lt;/strong&gt;：問い合わせ内容を置いておくCloudflare上の保存場所&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resend&lt;/strong&gt;：プログラムからメールを送るためのサービス&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;フォームを表示しているのは Hugo ですが、送信後の処理は Cloudflare Pages Functions で動かしています。&lt;/p&gt;
&lt;h2 id=&#34;まずフォームにturnstileを付けた&#34;&gt;まずフォームにTurnstileを付けた&lt;/h2&gt;
&lt;p&gt;最初に行ったのはスパム対策です。&lt;/p&gt;
&lt;p&gt;Cloudflare Turnstileのwidgetをフォームへ置き、送信されたtokenをPages FunctionからCloudflareへ送り、本物かどうかを確認します。&lt;/p&gt;
&lt;p&gt;画面にTurnstileが表示されているだけでは対策になりません。サーバー側でも確認する必要があります。今回は確認結果に加えて、フォーム用の &lt;code&gt;action&lt;/code&gt; とブログの &lt;code&gt;hostname&lt;/code&gt; が一致するかも見ています。&lt;/p&gt;
&lt;p&gt;設定に使う鍵は二つあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;site key：ブラウザに表示してよい公開値&lt;/li&gt;
&lt;li&gt;secret key：外へ出してはいけない値&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;secret keyはCloudflare PagesのSecretに入れました。リポジトリや作業メモには書きません。&lt;/p&gt;
&lt;p&gt;ここで早速つまずきました。&lt;/p&gt;
&lt;p&gt;CloudflareのAdd Widget画面でブログのHostnameを追加しようとしたら、候補が &lt;code&gt;No results&lt;/code&gt; のまま進まなかったのです。最終的には &lt;code&gt;Turnstile Spin&lt;/code&gt; という別の作成画面から、同じHostnameを登録できました。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
