なぜ作ったのか——「メール1通」に月額料金を払いたくなかった
外部サービスに依存せず、自分のWordPressサーバーだけでサンクスメールを送りたかった。それがこのプラグインを作った動機です。 きっかけは、自分のデジタル商品をStripe Payment Linkで販売し始めたことでした。 Stripe自体にも決済完了時のメール機能はあります。でもそれはStripeブランドの領収書であって、自分のブランド名で「ご購入ありがとうございます」と送るサンクスメールではありません。ダウンロードリンクを含めたい、次回割引のクーポンを添えたい、日本語のお客さんには日本語で、英語のお客さんには英語で——そういったカスタマイズは、Stripeの標準メールでは対応しきれません。 最初に検討したのはZapierでした。「Stripe → Gmail」のZapを組めば5分で動きます。でも無料枠は月100タスクまで。商品が売れるたびにタスクが消費され、しかもGmailから送信するとSPF認証に失敗してスパム扱いされるリスクもある。 次にMakeを試しました。無料枠が広い分、設定画面が複雑で、たまにシナリオが止まる。「お客さんにメールが届いていなかった」ことに気づいたのは、問い合わせが来てからでした。 結局、自分のサーバーでStripeのwebhookを受け取って、wp_mail()でメールを送ればいいだけじゃないか、と。WordPressプラグインとして作れば、サーバー代以外のランニングコストはゼロ。外部サービスの障害にも巻き込まれない。そうして開発が始まりました。サンクスメール送信方法の比較表(Zapier / Make / Thanks Mail for Stripe)
仕組み——Stripe webhook × WordPress REST API
Thanks Mail for Stripeの動作はシンプルです。Stripeがwebhookで決済完了を通知し、プラグインがそれを受信してメールを送る。外部サービスは一切介在しません。 処理の流れは以下のとおりです。 お客さんがStripe Payment Linkで決済すると、Stripeがcheckout.session.completedイベントをwebhookで送信します。プラグインはWordPress REST APIのエンドポイント(/wp-json/thanks-mail/v1/webhook)でこれを受信し、HMAC-SHA256で署名を検証して正規のStripeリクエストであることを確認します。その後、Payment Link IDからテンプレートを自動判定し、対応するテンプレートでメールを送信。送信済みのCheckout Session IDをDBに記録し、二重送信を防止します。
StripeとあなたのWordPressサーバーの1対1の通信です。
動作フロー図(お客さん→Stripe→WordPress→メール送信)
開発中にハマったポイント
二重送信、SPF認証の失敗、XserverのREST API制限——開発中に遭遇した3つの問題とその対策を共有します。Webhookの二重送信問題
開発初期、テスト決済をしたら同じお客さんに2通メールが届きました。原因はStripeのwebhookリトライ仕様。ネットワークの一瞬の遅延で200レスポンスが遅れると、Stripeは「失敗した」と判断して同じイベントを再送します。 対策として、Checkout Session IDをデータベースに保存する冪等性チェックを実装しました。一度処理済みのSession IDが来たら、メールは送信せずに200を返す。これで二重送信は完全に防げます。フリーメールを送信元にすると届かない
テスト中、自分のGmailアドレスをFromに設定して送信したら、メールがまったく届きませんでした。サーバーのメールログを見ると送信自体は成功しているのに、受信側で弾かれている。 原因はSPF/DKIM/DMARCの認証失敗です。WordPressサーバーからGmailアドレスを名乗ってメールを送ると、受信側サーバーは「このサーバーはGmailの送信元として許可されていない」と判断して拒否します。 送信元(From)は必ず自分のドメインのメールアドレスを使うこと。これはこのプラグインに限らず、WordPressからメールを送るすべてのケースで言えることです。返信先(Reply-To)にGmailなどを設定するのは問題ありません。NG(Gmail)vs OK(自ドメイン)の比較図
XserverのREST API制限でwebhookが403になる
本番環境をXserver(エックスサーバー)に置いていたところ、Stripeからのwebhookがすべて403エラーに。StripeダッシュボードのWebhookログが真っ赤になって焦りました。 原因はXserverの「WordPressセキュリティ設定」にある「REST APIアクセス制限」。これがONだと、海外IPからのREST APIアクセスがブロックされます。Stripeのサーバーは海外にあるため、当然ブロック対象になります。 サーバーパネルからこの設定をOFFにすることで解決しました。同様に、Wordfenceなどのセキュリティプラグインを使っている場合は、webhookのURL(/wp-json/thanks-mail/v1/webhook)をホワイトリストに追加する必要があります。
インストール方法
WordPress管理画面から検索してインストールできます。FTPやZIPファイルのアップロードは不要です。ステップ1:プラグインの新規追加画面を開く
WordPress管理画面の左メニューから「プラグイン」→「新規プラグインを追加」をクリックします。
管理画面の左メニュー「プラグイン」→「新規プラグインを追加」
ステップ2:プラグインを検索する
画面右上の検索欄に「Thanks Mail for Stripe」と入力します。入力するとリアルタイムで検索結果が表示されます。
検索欄に「Thanks Mail for Stripe」と入力した状態。作者名「rapls」のプラグインが表示される
検索結果に「Thanks Mail for Stripe」が表示されます。作者名が「rapls」であることを確認してください。同名や類似名のプラグインと間違えないようにするためです。 検索で見つからない場合:「Thanks Mail Stripe」のようにスペースを減らして検索してみてください。WordPress.orgの検索は完全一致ではないため、短いキーワードの方がヒットしやすいことがあります。ステップ3:インストールする
プラグインカードの「今すぐインストール」ボタンをクリックします。
「今すぐインストール」をクリック。数秒でインストールが完了する
ボタンが「インストール中…」に変わり、数秒で完了します。完了すると「有効化」ボタンに変わるので、続けてクリックしてください。ステップ4:有効化を確認する
有効化が完了すると、プラグイン一覧画面に遷移します。「Thanks Mail for Stripe」の行に「設定」リンクが表示されるので、ここからプラグインの設定画面にアクセスできます。
有効化後のプラグイン一覧。「設定」リンクからすぐに設定画面に移動できる
次のセクションで、Stripeダッシュボードとの接続設定を行います。セットアップガイド——StripeとWordPressを接続する
プラグインのインストール後、StripeダッシュボードでWebhookを登録し、プラグインの設定画面で署名シークレットとメールテンプレートを設定すれば完了です。Step 1:Stripeダッシュボードでwebhookを登録
Webhook登録の概要図
Stripeダッシュボードにログインし、Developers → Webhooks → Add endpointを開きます。 Endpoint URLにはプラグイン設定画面に表示されるURLを貼り付けてください。https://あなたのドメイン/wp-json/thanks-mail/v1/webhook
イベントはcheckout.session.completedとcheckout.session.async_payment_succeededを選択します。保存後に表示されるSigning secret(whsec_...)をコピーしてください。

Stripeダッシュボードの Developers → Webhooks 画面

Add endpointでURL入力+イベント選択している画面

Signing secret(whsec_…)が表示されている画面
Step 2:プラグインの設定
WordPress管理画面の「設定」→「Thanks Mail for Stripe」を開き、以下の項目を入力します。
プラグインの設定画面全体
| 設定項目 | 設定する値 | 補足 |
|---|---|---|
| Webhook署名シークレット | whsec_...をペースト |
Stripeダッシュボードで取得したもの |
| ブランド名 | メール内の{brand}に表示される名前 | サービス名やショップ名 |
| 送信元メールアドレス | info@yoursite.com | 必ず自分のドメインのアドレス |
| 送信者名 | Fromに表示される名前 | |
| 返信先メールアドレス | Reply-Toに設定するアドレス | Gmail等でもOK |
Step 2.5:メールテンプレートの設定
v1.1.0から、メールテンプレートを最大10個まで動的に追加・削除できるようになりました。各テンプレートには以下の項目を設定します。| 設定項目 | 設定する値 | 補足 |
|---|---|---|
| ラベル | テンプレートの識別名(例:No.1, No.2) | 管理画面での表示用 |
| 言語(Locale) | JA / EN を選択 | Payment Link IDにマッチしない場合のフォールバック判定に使用 |
| Payment Link ID | plink_... |
StripeのPayment Link詳細URLから確認 |
| 件名 | メールの件名 | プレースホルダー使用可 |
| 本文 | メールの本文 | プレースホルダー使用可 |
Step 3:テストメールで動作確認
設定画面のテストメール機能を使えば、実際にテスト決済をしなくても動作確認ができます。テストメールが届いたら、Stripeのテストモードで実際に決済してみましょう。
テストメール送信ボタンと「送信成功」の表示

テストメールが実際に届いた受信箱
メールテンプレートのカスタマイズ
件名と本文は管理画面から自由に編集できます。プレースホルダーとフィルターフックで柔軟にカスタマイズできます。 以下のプレースホルダーが使えます。{brand}は設定で指定したブランド名、{email}は顧客のメールアドレス、{session_id}はCheckout Session ID(照合用)に置換されます。
さらに細かいカスタマイズが必要な場合は、フィルターフックを使えます。
CCやBCCを追加する
|
1 2 3 4 |
add_filter( 'tmfs_email_headers', function( $headers, $to, $lang, $session_id ) { $headers[] = 'Cc: sales@example.com'; return $headers; }, 10, 4 ); |
メールアドレスのドメインでテンプレートを切り替える
|
1 2 3 4 5 6 7 |
add_filter( 'tmfs_detect_language', function( $lang, $session ) { $email = $session['customer_details']['email'] ?? ''; if ( strpos( $email, '.jp' ) !== false ) { return '0'; // 最初のテンプレートを使用 } return '1'; // 2番目のテンプレートを使用 }, 10, 2 ); |
tmfs_detect_languageフィルターの戻り値が言語コード(ja/en)からテンプレートインデックス(’0′, ‘1’, ‘2’…)に変更されました。
利用可能なフィルターはtmfs_email_headers、tmfs_email_subject、tmfs_email_body、tmfs_detect_languageの4つです。
トラブルシューティング
Webhookの403エラー、メールが届かない、テスト→本番の切り替え——発生しやすい問題を整理しました。トラブルシューティング・フローチャート
Webhookが403エラーになる
Xserver(エックスサーバー)の場合:サーバーパネル → WordPressセキュリティ設定 → 「REST APIアクセス制限」をOFFにしてください。海外IPからのREST APIアクセスが制限されているため、StripeのWebhookがブロックされます。
Xserverサーバーパネルの「REST APIアクセス制限」設定画面
Wordfenceの場合:Firewall → All Firewall Options → Allowlisted URLsに/wp-json/thanks-mail/v1/webhookを追加してください。
Webhookは200なのにメールが届かない

Stripeダッシュボードの Webhook ログ画面(200 OK + sent: true の表示)
3つの原因が考えられます。 1. 送信元メールアドレスがフリーメールになっている。Gmailやyahoo.co.jpを送信元に設定するとSPF認証に失敗します。必ず自分のドメインのメールアドレスに変更してください。 2. 二重送信防止が作動している。プラグインの「最近の送信履歴」を確認してください。同じSession IDがすでに記録されていれば、正常な動作です。 3. サーバーのメール送信自体に問題がある。WP Mail SMTPなどのSMTPプラグインを導入し、信頼性の高いメール送信環境を構築してください。テスト環境から本番環境への切り替え
Stripeのテストモードと本番モードでは、Webhook署名シークレット(whsec_...)とPayment Link ID(plink_...)がすべて異なります。本番環境に切り替える際は、これらの値をLive用に更新し、StripeダッシュボードのWebhook設定もLive用で別途登録してください。
技術的な補足——データベースと送信履歴
プラグインは送信履歴をデータベースに保存し、冪等性チェックと管理画面からの履歴確認に使用します。アンインストール時に自動削除されます。 プラグインはwp_tmfs_sent_emailsテーブルを作成し、以下の情報を保存します。
データベーステーブル構造の図解
| カラム | 型 | 用途 |
|---|---|---|
| id | BIGINT | 自動採番ID |
| session_id | VARCHAR(255) | 冪等性チェック用のユニークキー |
| VARCHAR(255) | 送信先メールアドレス | |
| lang | VARCHAR(8) | テンプレートインデックス |
| product_name | VARCHAR(255) | 購入された商品名 |
| amount | VARCHAR(50) | 決済金額 |
| sent_at | DATETIME | 送信日時 |

管理画面の「最近の送信履歴」一覧
更新履歴
このプラグインはサンクスメール自動送信という一つの機能に集中して開発しています。1.1.0
メールテンプレートを1〜10個まで動的に追加・削除可能に。各テンプレートにラベル、言語(locale)、Payment Link IDを個別設定できるようになり、テンプレートごとの初期化ボタンでデフォルト値に復元可能。Payment Link IDまたはlocaleによるテンプレート自動マッチング機能を追加。旧バージョン(v1.0.x)の設定データは自動マイグレーションされる。tmfs_detect_languageフィルターの戻り値が言語コード(ja/en)からテンプレートインデックスに変更。




コメント