PLUGIN : Thanks Mail for Stripe
Thanks Mail for Stripe wordpress.org から最新版をダウンロード
WordPress.org 公式リポジトリで公開しているプラグインの技術リファレンスページです。Stripe Payment Links で決済が完了したとき、お客様に自動でサンキューメールを送信します。Webhook を直接受信して wp_mail() で送信するシンプルな構成で、Zapier・Make・IFTTT などの外部自動化サービスを使わずに WordPress 内で完結します。
ソースコード:GitHub – rapls/thanks-mail-for-stripe
実装の詳細は、このページ内の「FEATURES」「ADVANCED FILTERS」「CHANGE LOG」にまとめています。
DEMO : 決済完了からメール送信までの流れ
お客様が Stripe Payment Links で決済を完了すると、Stripe から WordPress サイトの Webhook エンドポイントに通知が送信されます。プラグインは署名(HMAC-SHA256)を検証して正規のリクエストかチェックし、wp_mail() でサンキューメールを送信します。
決済からメール送信まで通常 2〜5 秒以内に完結します。外部サービス(Zapier、Make、IFTTT 等)は不要です。
INSTALLATION : 設置方法
動作要件
- WordPress 5.0 以上
- PHP 7.4 以上
- Stripe アカウント(Payment Links 機能を使用)
- SSL 証明書(HTTPS 必須。Webhook は HTTPS でのみ動作)
- SMTP プラグイン推奨(メール到達率向上のため)
Stripe Dashboard 側の設定
- Stripe Dashboard > Developers > Webhooks で「Add endpoint」を選択
- Endpoint URL にプラグインの「Webhook URL」を入力
- 受信するイベントに
checkout.session.completedとcheckout.session.async_payment_succeededの 2 つを選択(後者はコンビニ決済など、支払いが後から確定する決済方法用) - 表示された Signing Secret(
whsec_xxxxx形式)をプラグイン設定にコピー
サーバー側の注意事項
サーバー側のセキュリティ設定で Stripe からのリクエストがブロックされていないか確認してください。Xserver の WAF(特に「REST API アクセス制限」)や Wordfence、Cloudflare のファイアウォールルールが Stripe IP を遮断することがあります。
セットアップ手順
- プラグインをインストール・有効化
- 「設定 > Thanks Mail for Stripe」を開く
- 「ステータス」欄の Webhook URL をコピー
- Stripe Dashboard でエンドポイント登録
- Signing Secret を「Stripe 設定」欄に貼り付け
- 「一般設定」で送信元メールアドレス・送信者名・ブランド名を設定
- 「メールテンプレート」で Payment Link ID・件名・本文を設定して保存
- 「テストメール送信」で動作確認
FEATURES : 機能一覧
1. Stripe Webhook による自動メール送信
Stripe Payment Links で決済が完了すると、プラグインが自動的にサンキューメールを送信します。Webhook を直接受信して wp_mail() で送信するシンプルな構成です。外部サービスは不要なので、月額の SaaS コストが発生しません。
コンビニ決済のように支払いが後から確定する決済方法では、入金が確定した時点(checkout.session.async_payment_succeeded)でメールを送ります。
2. 動的なテンプレート管理(最大 100 件)
メールテンプレートを最大 100 件まで追加・削除できます。各テンプレートには以下を個別に設定できます:
- テンプレート名(管理用)
- カテゴリ
- locale 設定(JA / EN)
- Payment Link ID(マッチング用、1 テンプレートに 1 つ)
- 件名(プレースホルダー使用可)
- 本文(プレースホルダー使用可)
テンプレートが増えても目的のものをすぐ探せるように、次の機能があります:
- カテゴリ:カテゴリ一覧を作って各テンプレートに割り当て。カテゴリ名を変更すると、割り当て済みの全テンプレートに反映
- 検索:名前・カテゴリ・ロケール・Payment Link ID・件名・本文から検索
- 絞り込みとページ送り:カテゴリでの絞り込み、1 ページ 10 件のページネーション
- 折りたたみ/展開:テンプレートごと、または「すべて展開」「すべて折りたたむ」
- 並べ替え・複製:「↑/↓」ボタンでの並べ替え、ワンクリックでの複製
- デフォルトに戻す:件名と本文だけを、テンプレートの locale に合った初期文面に戻す(名前・カテゴリ・Payment Link ID はそのまま)

3. テンプレートの自動選択
Webhook の内容から、お客様に送るテンプレートを次の順で選びます:
- Payment Link ID:購入に使われた Payment Link の ID と一致するテンプレート
- locale:一致がなければ、Checkout Session の
localeと言語が一致する最初のテンプレート(日本語以外は EN として扱います) - 先頭のテンプレート:それもなければ一番上のテンプレート
Payment Links では決済画面の言語が「自動(auto)」のままのことが多く、locale による判定はほとんど効きません。言語や商品ごとに出し分けたい場合は、Payment Link ごとにテンプレートを用意して ID を登録してください。
4. プレースホルダー対応のテンプレート
メールテンプレートには以下のプレースホルダーが使えます:
{brand}– 設定したブランド名{session_id}– Stripe Checkout Session ID{email}– お客様のメールアドレス
フィルターフック tmfs_email_body、tmfs_email_subject でさらにカスタマイズも可能です(「ADVANCED FILTERS」参照)。
5. カスタム送信元設定
「From Email」「From Name」「Reply-To」を独立して設定できます。
- 送信元:自社ドメイン(SPF/DKIM/DMARC 通過のため)
- 返信先:個人の Gmail アドレス(個人で対応する場合)
6. 重複送信防止(冪等性)
Stripe Webhook は同じイベントを複数回送信してくることがあります(リトライ仕様)。プラグインはメールを送る前に session_id を専用テーブルに登録し、同じ session_id への 2 回目以降の送信をスキップします。登録はデータベースの一意制約で行うため、同じイベントがほぼ同時に 2 回届いても送られるのは 1 通だけです。
メール送信に失敗した場合は登録を取り消すので、Stripe Dashboard からイベントを再送すれば送り直せます。
7. Webhook 署名検証(HMAC-SHA256)
Stripe からの Webhook リクエストは、Signing Secret を使って HMAC-SHA256 で署名検証されます。署名が一致しないリクエストや、タイムスタンプが 5 分以上ずれているリクエストは拒否されます。
8. 署名エラーのレート制限
署名の検証に失敗したリクエストが、同じ IP アドレスから 60 秒間に 10 回を超えると 429(Too Many Requests)を返します。数えるのは失敗したリクエストだけなので、1 回の購入で複数のイベントが届く場合や、プロキシ経由で全リクエストが同じ IP になる環境でも、Stripe からの正規の通知が制限されることはありません。
9. テスト送信機能
設定画面の「テストメール送信」から、任意のメールアドレス・任意のテンプレートで実際にメールを送信して動作確認できます。テスト決済は不要です。
テストメールには、画面に表示中のテンプレートの件名と本文がそのまま使われます。保存前の編集内容や、追加したばかりのテンプレートも確認できます(ブランド名・送信元・返信先は保存済みの設定を使用)。

10. メール送信ログ
送信したメールの履歴を管理画面で確認できます。送信日時、お客様のメールアドレス、使用したテンプレート(番号と名前)、Checkout Session ID が新しい順に表示されます。記録されるのは送信に成功したメールだけです。

11. 無料の購入への送信(オプション)
100% 割引のクーポンコードや無料トライアルのように、支払いが発生しなかった購入(Stripe 上は no_payment_required)にもメールを送るかどうかを選べます。初期設定はオフです。
12. 個人データのエクスポート・消去
送信ログに保存されたお客様のデータは、WordPress 標準の「ツール > 個人データのエクスポート」「個人データの消去」で扱えます。
SETTINGS : プラグイン設定画面
WordPress の管理画面「設定 > Thanks Mail for Stripe」から設定します。

設定は 1 ページにまとまっており、上から次の順に並んでいます。
ステータス
- 有効化:サンキューメールの送信を有効にします。オフの間、Webhook は 503 を返し、Stripe は各購入の通知を最大 3 日間再送し続けます。再送期間中に有効へ戻すと、その時点でメールが送られます
- 無料の購入(Free purchases):支払いが発生しなかった購入(100% 割引クーポン、無料トライアルなど)にもメールを送ります。初期設定はオフ。テンプレートが「お支払いいただき…」のような文面ならオフのままにしてください
- Webhook URL:Stripe Dashboard に登録する URL(コピーボタン付き)
- 送信数:これまでに送信したメールの件数
Stripe 設定
- Webhook 署名シークレット:Stripe Dashboard の Webhook 詳細から取得した
whsec_xxxxx値。テストモードと本番モードでは値が異なるので、切り替え時に入れ替えてください

一般設定
- ブランド名:
{brand}プレースホルダーに展開される文字列 - 送信元メールアドレス(From Email):自社ドメインのアドレスを推奨
- 送信者名(From Name):メールソフトに表示される送信者名
- 返信先メールアドレス(Reply-To):お客様の返信が届くアドレス(Gmail なども可)
「From Email」に Gmail を設定すると、SPF/DKIM の問題で受信側で迷惑メール扱いされやすくなります。必ず自社ドメインのアドレスを使ってください。
カテゴリ
テンプレートに割り当てるカテゴリを追加・名前変更・削除します。削除したカテゴリが割り当てられていたテンプレートは「カテゴリなし」になります。
メールテンプレート
最大 100 件のテンプレートを編集できます。上部のツールバーで検索・カテゴリ絞り込み・すべて展開/折りたたみができます。各テンプレートの項目は「FEATURES」の 2 を参照してください。
名前・Payment Link ID・件名・本文がすべて空のテンプレートは、保存時に削除されます。保存せずにページを離れようとすると警告が表示されます。
テストメール送信
送信先メールアドレスとテンプレートを選んで、実際にメールを送信できます。
設定のリセット
すべての設定を初期値に戻します。Webhook 署名シークレットとすべてのテンプレートも消えるため、再設定するまで Stripe からの通知はエラーになります。送信ログは残ります。
最近の送信履歴
直近 20 件の送信履歴を表示します。
- 送信日時
- お客様メールアドレス
- 使用テンプレート(番号と名前)
- Checkout Session ID(全文)
TEMPLATE : テンプレート例
日本語のサンキューメール例
件名:【{brand}】ご購入ありがとうございます
{email} 様
このたびは {brand} の商品をご購入いただき、
誠にありがとうございます。
ご注文の確認は、Stripe から別途送られる領収書メールをご確認ください。
商品のダウンロード URL・ライセンスキーは、
本日中に別途メールでお送りいたします。
ご質問があれば、このメールに直接ご返信ください。
参考情報:
* Session ID:{session_id}
{brand}
https://yoursite.com/ 英語のサンキューメール例
Subject: Thank you for your purchase from {brand}
Hello,
Thank you for purchasing from {brand}.
Please check the receipt email from Stripe for your order details.
We will send the download URL and license key in a separate email today.
If you have any questions, please reply to this email.
Reference:
* Session ID: {session_id}
{brand}
https://yoursite.com/ FAQ : よくある質問
Webhook で 403 エラーが出る場合は?
サーバーのセキュリティ設定が Stripe のリクエストをブロックしている可能性があります:
- Wordfence:Firewall > Allowlisted URLs に Webhook URL を追加
- Xserver WAF:「REST API アクセス制限」をオフ(海外 IP ブロックが Stripe を遮断)
- Cloudflare:Stripe IP を許可するファイアウォールルールを作成
- その他のセキュリティプラグイン:Webhook エンドポイントをホワイトリスト登録
Webhook で 429 エラーが出る場合は?
署名の検証に失敗したリクエストが、同じ IP アドレスから 1 分間に 10 回を超えています。プラグインに設定した Webhook 署名シークレットが正しいか(テスト用と本番用を取り違えていないか)を確認してください。
Webhook は 200 を返しているのにメールが届かない場合は?
「最近の送信履歴」を確認してください。Session ID が記録されている場合、プラグインは「すでに送信済み」と判定して 2 回目をスキップしています(重複防止機能)。これは意図した動作です。
Stripe Dashboard の Webhook ログで応答が no_payment_required_skipped の場合は、無料の購入(100% 割引クーポンや無料トライアル)です。送りたい場合は設定の「無料の購入」をオンにしてください。
応答が "sent": false の場合は、wp_mail() の送信失敗です。SMTP プラグイン(WP Mail SMTP 等)の導入をご検討ください。
お客様の言語をどう検出しますか?
次の順にテンプレートを選びます:
- Payment Link ID:日本語用と英語用の Payment Link を別々に作って、それぞれの ID をテンプレートに登録すると確実に出し分けられます
- locale:一致する Payment Link ID がなければ、Checkout Session の
localeで判定(日本語以外は EN 扱い) - 先頭のテンプレート:それでも決まらなければ一番上のテンプレート
Payment Links は決済画面の言語が「auto」のままのことが多く、2 の locale 判定はほとんど効きません。
WooCommerce で使えますか?
このプラグインは Stripe Payment Links(単独チェックアウト)専用です。WooCommerce で Stripe を使っている場合は、WooCommerce 標準のメール送信機能を使ってください。
Webhook のテスト方法は?
- Stripe をテストモードに切り替え
- テストモードの Signing Secret をプラグインに設定
- テストカード
4242 4242 4242 4242で擬似決済 - Stripe Dashboard の Webhook ログで 200 応答を確認
- プラグインの「最近の送信履歴」で送信記録を確認
言語ごとに別 Payment Link を作る理由は?
Payment Link ID は Webhook イベントに必ず含まれるので、ID で判定すれば確実です。locale による判定は、Payment Links が決済画面の言語を「auto」のままにしていることが多いため、ほとんど当てになりません。
メールテンプレートで使えるプレースホルダーは?
{brand}– 設定したブランド名{session_id}– Stripe Checkout Session ID(参照用){email}– お客様のメールアドレス
テストモードでもメールが送信されますか?
はい。テストモードの Signing Secret を設定していれば送信されます。本番運用前の動作確認に活用してください。
wp_mail() が失敗した場合は?
Webhook は 200 と "sent": false を返し、送信ログには記録しません。Stripe は 200 を受け取ると自動では再送しないので、原因を直したあと Stripe Dashboard > Developers > Webhooks から該当イベントを再送してください。SMTP プラグイン(WP Mail SMTP、Post SMTP、FluentSMTP 等)の導入で到達率を上げることをおすすめします。
「sent: true」なのに届かない場合は?
メール認証の問題が原因のことが多いです。「From Email」の設定を確認してください。
重要:From Email は自社ドメインのアドレスを使う
- 良い例:info@yoursite.com、support@yoursite.com
- 悪い例:yourname@gmail.com、yourname@yahoo.com
サーバーが「@gmail.com から送信」と主張すると、受信側のサーバーは「なりすまし」と判定します(SPF / DKIM / DMARC のいずれかで失敗)。「Reply-To」には自由なアドレスを使えますが、「From」は必ず自社ドメインに。
お客様データは保存されますか?
はい。重複送信防止のためにメールアドレス・Session ID・金額・送信日時が独自テーブル(wp_tmfs_sent_emails)に保存されます。プライバシーポリシーへの記載が必要です。プラグインアンインストール時にデータは自動削除されます。
GDPR に準拠していますか?
プラグインはお客様のメールアドレスを「重複メール防止のため」「送信履歴のため」という正当な業務目的で保存します。プライバシーポリシーに「決済データを保存していること」を明示する必要があります。データは WordPress データベース内のみに保存され、第三者と共有されることはありません。
お客様から開示や削除を求められた場合は、WordPress 標準の「ツール > 個人データのエクスポート」「個人データの消去」で対応できます。消去するとその購入の重複送信防止も外れるため、Stripe からイベントを再送するとメールがもう一度送られます。
ADVANCED FILTERS : フィルターフック
functions.php にフィルターを設定してメールの送信内容や挙動をカスタマイズできます。tmfs_email_subject・tmfs_email_body・tmfs_email_headers は、値のほかに送信先メールアドレス $to、テンプレートインデックス $lang、Checkout Session ID $session_id を受け取ります。
メール本文を送信前に加工
add_filter( 'tmfs_email_body', function( $body, $to, $lang, $session_id ) {
$body .= "\n\n---\n株式会社サンプル\nhttps://example.com/";
return $body;
}, 10, 4 ); メール件名を送信前に加工
add_filter( 'tmfs_email_subject', function( $subject, $to, $lang, $session_id ) {
// 2 番目のテンプレート(インデックス '1')の件名にだけ付ける
if ( '1' === $lang ) {
$subject = '[English]' . $subject;
}
return $subject;
}, 10, 4 ); CC / BCC ヘッダーの追加
add_filter( 'tmfs_email_headers', function( $headers, $to, $lang, $session_id ) {
$headers[] = 'Bcc: backup@yoursite.com';
return $headers;
}, 10, 4 ); テンプレート選択のカスタマイズ
tmfs_detect_language は、送信に使うテンプレートのインデックス(文字列。'0' が一番上)と、Checkout Session のデータ(配列)を受け取ります。1.1.0 以降、戻り値は言語コードではなくテンプレートインデックスです('ja' や 'en' を返すと一番上のテンプレートになります)。中国語向けのテンプレートを 3 番目に登録しているケースの例:
add_filter( 'tmfs_detect_language', function( $template_index, $session ) {
$cn_link_ids = array( 'plink_xxxxx', 'plink_yyyyy' );
if ( in_array( $session['payment_link'] ?? '', $cn_link_ids, true ) ) {
return '2'; // 3 番目のテンプレート(0 始まり)
}
return $template_index;
}, 10, 2 ); インデックスは並び順で決まるため、管理画面でテンプレートを並べ替えると指す先が変わります。
CHANGE LOG : バージョン履歴
- 1.2.1不具合修正と改善のリリースです。Webhook のレート制限が Stripe からの正規の通知まで拒否することがあった問題を修正(署名の検証に失敗したリクエストだけを数えるように変更)。同じイベントがほぼ同時に 2 回届くとメールが 2 通送られることがあった問題を修正。日本円など小数のない通貨の金額が送信履歴に 100 分の 1 で記録されていた問題を修正(記録済みの履歴は変更されません)。カテゴリ名の変更中に入力欄を空にすると全テンプレートからカテゴリが外れていた問題、テンプレートの「デフォルトに戻す」で Payment Link ID が消えたりテンプレート自体が削除されたりしていた問題、テストメールに未保存の編集内容が反映されなかった問題、HTTP の管理画面でコピーボタンが動かなかった問題、本文だけのテンプレートが保存時に削除されていた問題を修正。新機能として、支払いが発生しなかった購入(100% 割引クーポン、無料トライアル)にもメールを送れる「無料の購入」設定(初期設定はオフ)と、WordPress の個人データのエクスポート・消去への対応を追加。送信履歴にテンプレート名・Session ID 全文・サイト設定の日時形式を表示、未保存の変更がある場合の離脱警告、送信履歴テーブルがない場合の自動作成などを改善しました。日本語翻訳の同梱をやめ WordPress.org の言語パックを使うように変更(今回追加した文言は翻訳が公開されるまで英語で表示されます)。WordPress 7.1 で動作確認済み。
- 1.2.0テンプレート管理を大幅に強化しました。設定できるメールテンプレートを最大 100 件に拡張(従来は 10 件)。カテゴリ機能を追加し、カテゴリ一覧を管理して各テンプレートに割り当て可能に(カテゴリ名を変更すると、それを使う全テンプレートへ自動反映)。名前・カテゴリ・ロケール・Payment Link ID・件名・本文による検索、カテゴリ絞り込み、各テンプレートの折りたたみ/展開(「すべて展開」「すべて折りたたむ」)、1 ページ 10 件のページネーション、「↑/↓」ボタンでの並び替え、ワンクリック複製(コピー)に対応。既存の設定データは保存時に自動移行されます。あわせて同梱の日本語翻訳を確実に読み込むよう改善しました。
- 1.1.2WordPress 7.0 に対応しました。Tested up to を 7.0 に更新。WordPress 7.0 RC・PHP 8.3 環境で全機能(Webhook 署名検証・テンプレート移行・言語検出・REST エンドポイント・管理画面描画)の動作を検証済み。コードの機能変更はありません。
- 1.1.1Plugin URI を新しいプラグインページ (https://raplsworks.com/plugins/thanks-mail-for-stripe/) に更新しました。
- 1.1.0動的なテンプレート管理(1〜10 件、追加/削除ボタン付き)。各テンプレートに個別ラベル・locale・Payment Link ID・件名・本文を設定可能、テンプレート単位のリセットボタンも追加。Webhook はテンプレートと Payment Link ID または locale fallback でマッチ。設定データはフラット形式から配列形式へ自動マイグレーション。破壊的変更:
tmfs_detect_languageフィルターは言語コードではなくテンプレートインデックス(文字列)を返すように変更。 - 1.0.4すべての内部 prefix を
stm_からtmfs_に変更(オプション名・テーブル名・設定グループ・transient キー・JS グローバル変数)して WordPress.org の 4 文字以上 prefix 要件に準拠。Plugin URI を公開ページ公開後に復活。 - 1.0.3メインクラスを
TMFS_Thanks_Mailにリネームして WordPress.org 命名規約に準拠。すべてのフィルターフック(tmfs_email_subject、tmfs_email_body、tmfs_email_headers、tmfs_detect_language)にtmfs_prefix を適用。アンインストール関数をtmfs_uninstall_cleanupにリネーム。テンプレートのグローバル変数($tmfs_recent_emails、$tmfs_email)にも prefix。カスタムテーブルクエリにphpcs:ignoreを追加。load_plugin_textdomain()呼び出しを削除(WordPress 4.6 以降は不要)。 - 1.0.2外部リソース読み込み(BuyMeACoffee CDN 画像)を削除しローカルテキストリンクに置き換え。インライン JavaScript を
assets/js/admin.jsとして正しく enqueue。グローバル定数をSTM_からTMFS_prefix にリネームし、define()衝突ガードを追加。$_SERVER['REMOTE_ADDR']アクセスにwp_unslash()とfilter_var()(FILTER_VALIDATE_IP)を適用。error_log()呼び出しをWP_DEBUGチェックでラップ。テーブル名サニタイズ用にesc_sql()をuninstall.phpで復活。/testエンドポイントに REST API スキーマ定義(バリデーション付き)を追加。 - 1.0.1メール送信失敗が誤って「sent」としてデータベースに記録されるバグを修正。送信前のメールアドレスバリデーション(
is_email())を追加。Webhook エンドポイントに IP ごとのレート制限(60 秒で 10 リクエスト)を追加。Data & Privacy ドキュメントを readme でより明確に記述。 - 1.0.0初回リリース。Webhook ベースの自動サンキューメール送信、日本語と英語のテンプレート対応、Payment Link ID または locale による言語検出、カスタム送信元メール・名前設定、session ID トラッキングによる重複防止、テスト送信機能、最近の送信履歴付きメール送信ログ、安全な Webhook 署名検証、クイックセットアップガイド付き管理画面、日本語翻訳付属。

