Thanks Mail for Stripe

説明

Thanks Mail for Stripe は、Stripe Payment Links での購入完了後に、カスタマイズしたサンクスメールを顧客に自動送信する軽量プラグインです。デジタル商品の販売、ソフトウェアライセンス、サービスビジネスに最適です。

👉 セットアップガイドと開発者向けメモ : 開発の背景と Stripe Webhooks の設定方法

外部サービス不要 – Stripe Webhooks と直接連携

このプラグインは Stripe Webhook イベントを直接受信し、WordPress 組み込みのメール関数を使用してメールを送信します。Zapier、Make、その他のサードパーティ自動化サービスは不要です。

主な機能

  • メール自動送信 – Stripe Webhook 経由でサンクスメールを自動送信する
  • 多言語サポート – ロケール設定付きのカスタマイズ可能なメールテンプレート最大 10 種類
  • スマート言語検出 – Payment Link ID またはロケールから顧客の言語を自動検出する
  • カスタマイズ可能なテンプレート – プレースホルダーを使用してメールの件名と本文を自由にカスタマイズ可能
  • カスタム送信者設定 – 差出人メールアドレスと送信者名をカスタマイズする
  • 重複送信防止 – 組み込みの冪等性処理によりメールの重複送信を防止する
  • テストメール機能 – 本番稼働前にテストメールを送信して設定を確認する
  • メールログ – 管理画面で送信済みメールの履歴を表示する
  • セキュアな Webhook 検証 – Stripe Webhook 署名を検証する (HMAC-SHA256)

仕組み

  1. 顧客が Stripe Payment Link で購入する
  2. Stripe が WordPress サイトに Webhook イベントを送信する
  3. セキュリティのために Webhook 署名を検証する
  4. Payment Link ID に基づいて顧客の言語を検出する
  5. サンクスメールを wp_mail() を使用して顧客に送信する
  6. リトライ時の重複送信を防止するためにトランザクションをログに記録する

ユースケース

  • デジタル商品の販売 (ソフトウェア、電子書籍、コース)
  • ソフトウェアライセンスキーの配布 (手動フォローアップ)
  • サービス予約の確認メール
  • 寄付のサンクスメッセージ
  • Stripe Payment Links を使用したすべてのチェックアウト

要件

  • WordPress 5.0以上
  • PHP 7.4以上
  • Payment Links が有効な Stripe アカウント
  • SSL 証明書 (HTTPS) – Webhook に必要
  • 確実なメール配信のために SMTP プラグインを推奨

メール送信のベストプラクティス

重要:「差出人メールアドレス」の設定には必ず独自ドメインのメールアドレスを使用してください。

  • 良い例: info@yoursite.com, support@yoursite.com
  • 悪い例: yourname@gmail.com, yourname@yahoo.com

Gmail やその他のフリーメールサービスを差出人に使用すると、SPF/DKIM/DMARC 認証により配信が失敗します。サーバーは Gmail の代わりにメールを送信する権限がありません。

「返信先」の設定には任意のメールアドレス (Gmail を含む) を使用できます。この設定は返信先のみに影響し、メール配信には影響しません。

推奨 SMTP プラグイン

確実なメール配信のために、SMTP プラグインの使用を推奨します:

  • WP Mail SMTP
  • Post SMTP
  • FluentSMTP

これらのプラグインは PHP の mail() 関数の代わりに適切な SMTP サーバーを通じてメールを送信し、配信率を向上させます。

テストモードとライブモード

テストモードからライブモードに切り替える際は、設定の更新を忘れないでください:

  • Webhook 署名シークレット – テストとライブで異なるシークレットを持つ (whsec_…)
  • Payment Link ID – テストとライブで異なる ID を持つ (plink_…)
  • Webhook エンドポイント – Stripe ダッシュボードでテストモードとライブモードの両方にエンドポイントを登録する

セキュリティのベストプラクティス

  • プラグインは HMAC-SHA256 を使用して Stripe Webhook 署名を検証する
  • Webhook リクエストは5分間の許容範囲内で検証される
  • メールの重複送信を防止するためにセッション ID を保存する
  • すべての設定が適切にサニタイズおよびエスケープされている

利用可能なフィルターフック

プラグインはカスタマイズ用のフィルターフックを提供します:

  • tmfs_email_headers – 送信前にメールヘッダーを変更する
  • tmfs_email_subject – メール件名をカスタマイズする
  • tmfs_email_body – メール本文をカスタマイズする
  • tmfs_detect_language – 言語検出ロジックをオーバーライドする

例: メールに CC を追加

add_filter( 'tmfs_email_headers', function( $headers, $to, $lang, $session_id ) {
    $headers[] = 'Cc: sales@example.com';
    return $headers;
}, 10, 4 );

例: カスタム言語検出

add_filter( 'tmfs_detect_language', function( $lang, $session ) {
    // Custom logic based on session data
    if ( strpos( $session['customer_details']['email'], '.jp' ) !== false ) {
        return 'ja';
    }
    return $lang;
}, 10, 2 );

データベーステーブル

プラグインは送信済みメールを追跡するためにテーブル {prefix}stm_sent_emails を作成します:

  • id – 自動採番 ID
  • session_id – Stripe Checkout セッション ID (ユニーク)
  • email – 顧客のメールアドレス
  • lang – 検出された言語 (ja/en)
  • product_name – 商品名 (利用可能な場合)
  • amount – 購入金額
  • sent_at – メール送信時のタイムスタンプ

Webhook の問題のトラブルシューティング

Webhook が動作しない場合は、以下の一般的な問題を確認してください:

  1. SSL 証明書 – Stripe は Webhook に HTTPS を必要とする
  2. Webhook URL – URL が正しくアクセス可能であることを確認する
  3. 署名シークレット – テスト/ライブモードに正しいシークレットを使用しているか確認する
  4. サーバーファイアウォール – 海外 IP からのリクエストをブロックするホスティングがある
  5. セキュリティプラグイン – REST API エンドポイントをブロックする場合がある
  6. WAF ルール – サーバーレベルの WAF が Webhook リクエストをブロックする場合がある

Stripe ダッシュボード > Developers > Webhooks で詳細なエラーログを確認してください。

データとプライバシー

このプラグインは、メールの重複送信を防止し、管理者が配信履歴を確認できるよう、WordPress データベースにメール配信ログを保存します。このプラグインが外部サービスにデータを送信することはありません。

保存されるデータ

プラグインはカスタムデータベーステーブル ({prefix}stm_sent_emails) に以下のデータを保存します:

  • session_id – Stripe Checkout セッション ID (重複送信防止用のユニークキーとして使用)
  • email – 顧客のメールアドレス (どの顧客にメールが送信されたかの確認用)
  • lang – 検出された言語コード、ja または en (使用されたテンプレートの記録用)
  • product_name – 商品名 (将来の使用のために予約)
  • amount – 購入金額と通貨 (管理者の参照用)
  • sent_at – メール送信時のタイムスタンプ

さらに、プラグインの設定 (Webhook シークレット、メールテンプレート、Payment Link ID など) は wp_options テーブルにキー stm_settings で保存されます。

目的

  • 重複送信防止 – Stripe は Webhook イベントをリトライする場合がある。セッション ID により同じメールの二重送信を防止する
  • 配信確認 – 管理者がメールが正しいアドレスに送信されたことを確認できる
  • カスタマーサポート – 顧客からの問い合わせに対応するためのトランザクション参照

データ保持

  • メールログはデフォルトで無期限に保存される
  • 管理者はデータベースアクセスにより個別のレコードを手動で削除可能
  • WordPress 管理画面からプラグインをアンインストールすると、すべてのデータ (ログと設定) が自動的に削除される

外部サービス

  • このプラグインは Stripe からの Webhook イベントを受信するのみで、Stripe への外部 API 呼び出しは行わない
  • このプラグインが顧客データをサードパーティサービスに送信することはない
  • メールは WordPress 組み込みの wp_mail() 関数を使用して送信される (配信はサーバーまたは SMTP プラグインの設定に依存)

GDPR に関する考慮事項

  • 顧客のメールアドレスは、メールの重複送信防止と配信記録の管理という正当な業務目的で保存される
  • サイトのプライバシーポリシーにこのデータ保存について記載する必要がある
  • 顧客からの要求に応じて、データベースへの直接アクセスによりデータのエクスポートまたは削除が可能

スクリーンショット

  • 設定ページ – Stripe Webhook とメール送信者の設定
  • メールテンプレート – メール内容のカスタマイズ
  • テストメール – 設定を確認するためのテストメール送信
  • メールログ – 送信済みサンクスメールの履歴を表示

インストール

  1. thanks-mail-for-stripe フォルダーを /wp-content/plugins/ ディレクトリにアップロードする
  2. WordPress の「プラグイン」メニューからプラグインを有効化する
  3. 「設定」>「Thanks Mail for Stripe」に移動して設定する
  4. Webhook URL をコピーして Stripe ダッシュボードに登録する
  5. Stripe の Webhook 署名シークレットを入力する
  6. 言語検出用の Payment Link ID を設定する
  7. メールテンプレートをカスタマイズする
  8. テストメールを送信して設定を確認する

Stripe ダッシュボードの設定

  1. Stripe ダッシュボード > Developers > Webhooks に移動する
  2. “Add endpoint” をクリックする
  3. プラグイン設定の Webhook URL を貼り付ける
  4. イベントを選択する: checkout.session.completedcheckout.session.async_payment_succeeded
  5. 署名シークレットをコピーしてプラグイン設定に貼り付ける

FAQ

詳しいドキュメントはどこで見られますか?

Stripe の Webhook 設定、テンプレートデザインのヒント、多言語対応の例、およびライセンスキーの自動発行におけるよくある落とし穴について、詳しく解説したガイド :

Webhook で403エラーが発生するのはなぜですか ?

これは通常、セキュリティプラグインまたはサーバーの WAF 設定が Webhook リクエストをブロックしていることが原因です。一般的な解決方法:

  • Wordfence: Webhook URL を許可リストに追加する (Firewall > All Firewall Options > Allowlisted URLs)
  • Xserver WAF: サーバーパネルで「REST API アクセス制限」を無効にする (海外 IP を含む Stripe からのアクセスがブロックされます)
  • Cloudflare: Stripe の IP を許可するファイアウォールルールを作成する
  • その他のセキュリティプラグイン: Webhook エンドポイント URL を許可リストに追加する

Xserver WAF および Webhook の 501 エラーのトラブルシューティングに関する詳細な事例については、 セットアップガイド をご覧ください。

Webhook が200を返しているのにメールが送信されないのはなぜですか ?

設定ページの「最近の送信メール」ログを確認してください。トランザクションが一覧に表示されている場合、プラグインの重複送信防止機能が動作しています。そのチェックアウトセッションに対してメールはすでに送信済みです。これは Stripe が Webhook をリトライした際の重複メールを防ぐための意図的な動作です。

顧客の言語を検出するには ?

プラグインは2つの方法で言語を検出します (優先順位順):

  1. Payment Link ID – 日本語と英語の顧客用に個別の Payment Links を作成し、設定に ID を入力すると、使用されたリンクに基づいて言語を検出します。
  2. ロケールフォールバック – Payment Link の一致に失敗した場合、チェックアウトセッションの locale パラメータを確認します。

WooCommerce と併用できますか ?

このプラグインは Stripe Payment Links (スタンドアロンチェックアウト) 専用に設計されています。WooCommerce で Stripe を使用している場合は、WooCommerce 組み込みの注文メール機能を使用してください。

Webhook をテストするには ?

  1. Stripe のテストモードを使用する
  2. テストモードの署名シークレットで Webhook をセットアップする
  3. カード番号 4242 4242 4242 4242 を使用してテスト決済を作成する
  4. Stripe ダッシュボードの Webhook ログで200レスポンスを確認する
  5. プラグイン設定の「最近の送信メール」を確認する

言語ごとに個別の Payment Links を使用すべき理由は ?

個別の Payment Links を使用するのが、顧客の言語を検出する最も確実な方法です。Payment Link ID はすべての Webhook イベントに含まれるため、言語検出が失敗することはありません。同じ Payment Link でロケール検出をフォールバックとして使用することもできますが、信頼性は低くなる場合があります。

メールテンプレートで使用できるプレースホルダーは ?

  • {brand} – ブランド名 (設定で構成)
  • {session_id} – Stripe Checkout セッション ID (参照/サポート用)
  • {email} – 顧客のメールアドレス

テストモードの購入でもメールは送信されますか ?

はい、テストモードの Webhook 署名シークレットを設定すれば送信されます。本番稼働前の設定確認に利用してください。

メール送信関数 wp_mail() が失敗するとどうなりますか ?

Webhook は Stripe に200を返しますが (リトライを防止するため)、メールは送信されません。より確実なメール配信のために、SMTP プラグイン (WP Mail SMTP など) の使用を検討してください。

Webhook で “sent: true” と表示されているのにメールが届かないのはなぜですか ?

これは通常、メール認証の問題が原因です。「差出人メールアドレス」の設定には独自ドメインのメールアドレス (例: info@yoursite.com) を使用してください。

Gmail、Yahoo、その他のフリーメールサービスを差出人アドレスに使用しないでください。サーバーが @gmail.com からのメールであると主張して送信すると、受信サーバーは以下の理由でなりすましとして検出します:

  • SPF チェック失敗 – Gmail の SPF レコードがサーバーを認可していない
  • DKIM チェック失敗 – サーバーが Gmail のキーで署名できない
  • DMARC ポリシー – Gmail の厳格なポリシーにより拒否される

解決方法:「差出人メールアドレス」の設定には、サイトのドメインと一致するメールアドレスを使用してください。「返信先」の設定には任意のメールアドレスを使用できます。

このプラグインは顧客データを保存しますか ?

はい、プラグインは顧客のメールアドレス、Stripe セッション ID、タイムスタンプを含む送信メールのログを保存します。このデータはメールの重複送信防止と配信履歴の提供に使用されます。プラグインをアンインストールすると、すべてのデータが自動的に削除されます。詳細は「データとプライバシー」セクションを参照してください。

このプラグインは GDPR に準拠していますか ?

このプラグインは、メールの重複送信防止と配信記録の管理という正当な業務目的で、顧客のメールアドレスを保存します。このデータ収集についてプライバシーポリシーに記載してください。データは WordPress データベースにのみ保存され、第三者と共有されません。

評価

このプラグインにはレビューがありません。

貢献者と開発者

Thanks Mail for Stripe はオープンソースソフトウェアです。以下の人々がこのプラグインに貢献しています。

貢献者

“Thanks Mail for Stripe” は1ロケールに翻訳されています。 翻訳者のみなさん、翻訳へのご協力ありがとうございます。

“Thanks Mail for Stripe” をあなたの言語に翻訳しましょう。

開発に興味がありますか ?

コードを閲覧するか、SVN リポジトリをチェックするか、開発ログRSS で購読してみてください。

変更履歴

1.1.1

  • プラグインの URI を新しいプラグインページ (https://raplsworks.com/plugins/thanks-mail-for-stripe/) に更新しました

1.1.0

  • 新機能:動的メールテンプレート – 追加/削除ボタンで1~10個のテンプレートを設定可能
  • 新機能:各テンプレートには固有のラベル、ロケール設定、 Payment Link ID 、件名、本文が設定されています
  • 新機能:テンプレートごとのリセットボタンでデフォルト値を復元
  • 新機能:テンプレートは、 Payment Link ID またはロケールフォールバックを介して Stripe webhook にマッチングされます
  • 改善点:設定データがフラットキーから配列形式へ自動的に移行されるようになりました
  • 速報:tmfs_detect_language フィルターが言語コードではなくテンプレートインデックス (文字列) を返すようになりました

1.0.4

  • 修正: WordPress.org の4文字以上のプレフィックス要件を満たすため、すべての内部プレフィックスを stm_ から tmfs_ に変更 (オプション名、テーブル名、設定グループ、トランジエントキー、JS グローバル変数)
  • 修正: ページ公開後に Plugin URI を復元

1.0.3

  • 修正: WordPress.org の命名規則準拠のためメインクラスを TMFS_Thanks_Mail に変更
  • 修正: すべてのフィルターフックを stm_ プレフィックスから tmfs_ プレフィックスに変更 (tmfs_email_subject, tmfs_email_body, tmfs_email_headers, tmfs_detect_language)
  • 修正: グローバル名前空間プレフィックス準拠のためアンインストール関数を tmfs_uninstall_cleanup に変更
  • 修正: テンプレートのグローバル変数にプレフィックスを追加 ($tmfs_recent_emails, $tmfs_email)
  • 修正: カスタムテーブルクエリに WordPress.DB.PreparedSQL.InterpolatedNotPrepared 用の phpcs:ignore を追加
  • 削除: load_plugin_textdomain() 呼び出しを削除 (WordPress.org でホストされるプラグインは WordPress 4.6以降不要)
  • 修正: Tested up to のバージョンフォーマットを修正 (メジャーバージョンのみ)

1.0.2

  • 修正: 外部リソースの読み込み (BuyMeACoffee CDN 画像) を削除し、ローカルテキストリンクに置き換え
  • 修正: インライン JavaScript を適切にエンキューされた外部ファイル (assets/js/admin.js) に移動
  • 修正: 他のプラグインとの競合を回避するためグローバル定数を STM_ プレフィックスから TMFS_ プレフィックスに変更
  • 修正: すべてのプラグイン定数に define() の競合ガードを追加
  • 改善: $_SERVER[‘REMOTE_ADDR’] のアクセスに wp_unslash() と filter_var() (FILTER_VALIDATE_IP) を使用するよう改善
  • 改善: error_log() 呼び出しを WP_DEBUG チェックでラップするよう改善
  • 改善: uninstall.php でテーブル名サニタイズ用の esc_sql() を復元
  • 追加: /test エンドポイントパラメータのバリデーションを含む REST API スキーマ定義を追加

1.0.1

  • 修正: メール送信失敗がデータベースに送信済みとして誤って記録されなくなるよう修正
  • 追加: 送信前のメールアドレスバリデーションを追加 (WordPress の is_email() を使用)
  • 追加: Webhook エンドポイントにレート制限を追加 (IP あたり60秒間に10リクエスト)
  • 改善: readme のデータとプライバシーに関するドキュメントをより明確に改善

1.0.0

  • 初回リリース
  • Webhook ベースのサンクスメール自動送信
  • 日本語と英語のテンプレート対応
  • Payment Link ID またはロケールによる言語検出
  • 送信者メールアドレスと名前のカスタム設定
  • セッション ID 追跡による重複送信防止
  • テストメール機能
  • 最近の履歴を含むメール送信ログ
  • セキュアな Webhook 署名検証
  • クイックセットアップガイド付きの管理画面設定ページ
  • 日本語翻訳を同梱