9月に燕メール(tsubamemail.com)を出しました。サイトの問い合わせを webhook で受けて、メールで通知するだけのサービスです。「だけ」なんですが、ここが毎回地味に詰まるので作りました。
困っていたこと
いまどきの CMS やフォームサービスは、問い合わせが来たら webhook を飛ばせます。Slack や Chatwork には一発でつながる。ところが「メールで通知したい」となると、急に手段がなくなるんですよね。宛先を設定する場所がないか、あっても差出人がサービス側の共有ドメイン。
制作会社がクライアントに納品するときは、ここが要件になります。「問い合わせは info@ のメールで受けたい」「差出人は自社のドメインにしてほしい」「問い合わせた人に受付メールを返してほしい」。全部まっとうな要望で、全部、CMS の標準機能だと届かない。結局、案件ごとにサーバーレス関数を書いて、メール送信サービスを契約して、DNS を設定して、という作業を繰り返すことになります。
このサイトの問い合わせも Tessera の webhook から Chatwork に飛ばしていて、メールの経路がない。自分でも困っていた、という話です。
最初の構想は違うものだった
白状すると、最初に作っていたのは別物です。
7月の時点では「Harigami Forms」という名前で、静的サイトに JavaScript を1行貼ると、ページ内のフォームを自動で見つけて、送信を受け取ってくれるフォームバックエンドを作っていました。フォームの項目をページの HTML から自動で読み取る、というのが売りで、そこまでは動いていた。
で、7月18日にやめました。理由は二つあって、一つは「貼るだけでフォームが動く」は大手がすでにやっていて、同じ土俵に立つ意味が薄いこと。もう一つは、作っていて気づいたんですが、本当に困っているのはフォームの受け口ではなくて、その後の「メールでどう出すか」だったこと。フォームは CMS やフォームサービスが持っていて、そこから webhook は出る。足りないのはメールの配信先だけ。
なので同じ日に、widget も自動検出も全部捨てて「webhook を受けてメールを出す」に作り直しました。最初は自社の Tessera の webhook を受ける前提だったんですが、これも同じ日に「送信元は問わない。JSON が飛んでくれば何でも受ける」に一般化しています。microCMS でも、フォームサービスでも、自作のサーバーでも同じ。
名前も変えました。「貼る」動作がなくなったので Harigami(貼り紙)だと由来が失効する。燕は便りを運ぶ鳥なので、受け取って届けるという役割そのものです。入口や仕組みの名前を名乗っていないので、機能が増えても名前が壊れない、というのも気に入っています。
入口は4つ、出口は1つ
受け取り方は4つ用意していて、受信口ごとに1つ選びます。
- webhook — CMS やフォームサービスの webhook 設定に、発行された URL を貼る
- API — 自分のサーバーのコードから直接送る。webhook を持たない自作フォーム向け
- サイトのフォーム — サーバーを持たない静的サイト向け。ページのスクリプトから直接送る
- メール転送 — webhook も API もない古いシステム向け。専用の受信アドレスを発行して、そこに通知メールを送ってもらえば拾える
4つ目は、前に書いた「作った会社と連絡が取れないシステム」みたいな環境を拾うためです。メールだけは出せる、というシステムは意外と多い。
受け取った後の処理は全部共通で、登録した宛先に通知メール、問い合わせた本人に自動返信(任意)、受信ログに記録。選んでいない入口宛のリクエストは拒否します。使わない口を開けっ放しにしたくなかったので。
差出人をクライアントのドメインにする
課金の軸はここにしました。受信口に差出人アドレスを登録すると DNS のレコードが表示されるので、それを設定して検証が通れば、通知メールも自動返信も contact@client.co.jp から出せます。
作っていて一番気を使ったのが「検証が済むまでの間」です。DNS の設定は、クライアント側の担当者にお願いすることが多くて、すぐには終わらない。その間にメールが止まると「設定を始めたら問い合わせが来なくなった」になる。なので未検証の間は燕メールの既定の差出人で送って、検証が通った時点で自動で切り替わるようにしました。壊れ方の方を先に決めた格好です。
料金
ワークスペース(だいたいクライアント1サイト)ごとに、無料・月500円・月2,000円の3段です。無料は月100件まで、差出人は共有ドメイン。独自ドメインから出したいサイトだけ500円にする、という使い方を想定しています。制作会社が10サイト抱えていても、独自ドメインが要るのは数サイトだと思うので。
上限に達したときは、受信は続けて受信ログには残し、通知メールだけ止めて翌月に再開します。問い合わせそのものを取りこぼす作りにはしていません。
裏側
Cloudflare Workers の上で動いていて、データは D1、セッションは KV、メールの実送信は Resend です。自前で SMTP は持っていません。管理画面は Next.js で、同じく Workers に載せています。
MCP サーバーも付けたので、Claude Code や Cursor から受信口の作成・通知先の登録・受信ログの閲覧ができます。CMS 側も MCP に対応していれば、スキーマを作って webhook を登録して燕メールにつなぐまで、エージェントに通しで頼めます。
これから
9月10日に本番でメールが出ることと独自ドメイン送信を確認して、9月14日に決済を一巡させて、そこからは自分のサイトで使いながら直しています。Zenrei のときと同じで、まだ「作って自分で使ってみた」の次くらいの段階です。
無料で始められてクレジットカードも要らないので、CMS の webhook をメールに出したい人は試してみてください。「この CMS の webhook の形だと値が取れなかった」みたいなのがあれば、お問い合わせからそのまま送ってもらえると、次の修正に入れます。
また書きます。