Thanks Mail for Stripe 開発者が解説|なぜ作ったか・セットアップ・ハマりポイントまで

WordPress
この記事は約14分で読めます。
Stripe Payment Linkで決済してくれたお客さんに、「ありがとうございます」のメールを自動で送りたい——たったそれだけのことに、意外と手間がかかりました。 Zapierを使えば月額数千円。Makeで組めば無料枠はあるけどフローが止まることもある。自分のWordPressサイトで完結させたいだけなのに、なぜ外部サービスに依存しなきゃいけないのか。 そんな不満から生まれたのが Thanks Mail for Stripe です。Stripeのwebhookを直接受信して、サンクスメールを送るだけのシンプルなWordPressプラグイン。この記事では、なぜこのプラグインを作ったのか、どんな仕組みで動いているのか、そしてセットアップ時にハマりやすいポイントまでを開発者自身が解説します。 WordPress.org:Thanks Mail for Stripe(無料 / GPLv2ライセンス / 日本語対応)

なぜ作ったのか——「メール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)

サンクスメール送信方法の比較表(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→メール送信)

動作フロー図(お客さん→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(自ドメイン)の比較図

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 for Stripe」が表示されます。作者名が「rapls」であることを確認してください。同名や類似名のプラグインと間違えないようにするためです。 検索で見つからない場合:「Thanks Mail Stripe」のようにスペースを減らして検索してみてください。WordPress.orgの検索は完全一致ではないため、短いキーワードの方がヒットしやすいことがあります。

ステップ3:インストールする

プラグインカードの「今すぐインストール」ボタンをクリックします。 「今すぐインストール」をクリック。数秒でインストールが完了する

「今すぐインストール」をクリック。数秒でインストールが完了する

ボタンが「インストール中…」に変わり、数秒で完了します。完了すると「有効化」ボタンに変わるので、続けてクリックしてください。

ステップ4:有効化を確認する

有効化が完了すると、プラグイン一覧画面に遷移します。「Thanks Mail for Stripe」の行に「設定」リンクが表示されるので、ここからプラグインの設定画面にアクセスできます。 有効化後のプラグイン一覧。「設定」リンクからすぐに設定画面に移動できる

有効化後のプラグイン一覧。「設定」リンクからすぐに設定画面に移動できる

次のセクションで、Stripeダッシュボードとの接続設定を行います。

セットアップガイド——StripeとWordPressを接続する

プラグインのインストール後、StripeダッシュボードでWebhookを登録し、プラグインの設定画面で署名シークレットとメールテンプレートを設定すれば完了です。

Step 1:Stripeダッシュボードでwebhookを登録

Webhook登録の6ステップ概要図

Webhook登録の概要図

Stripeダッシュボードにログインし、Developers → Webhooks → Add endpointを開きます。 Endpoint URLにはプラグイン設定画面に表示されるURLを貼り付けてください。 https://あなたのドメイン/wp-json/thanks-mail/v1/webhook イベントはcheckout.session.completedcheckout.session.async_payment_succeededを選択します。保存後に表示されるSigning secret(whsec_...)をコピーしてください。 Stripeダッシュボードの Developers → Webhooks 画面のスクリーンショット

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

Add endpoint でURL入力+イベント選択している画面のスクリーンショット

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

Signing secret(whsec_...)が表示されている画面のスクリーンショット

Signing secret(whsec_…)が表示されている画面

Step 2:プラグインの設定

WordPress管理画面の「設定」→「Thanks Mail for Stripe」を開き、以下の項目を入力します。 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から確認
件名 メールの件名 プレースホルダー使用可
本文 メールの本文 プレースホルダー使用可
テンプレートごとにPayment Link IDを紐付けておくと、どのリンクから購入されたかを自動判定して適切なテンプレートでメールを送信します。Payment Link IDにマッチしない場合は、locale設定によるフォールバック判定を行います。テンプレートごとに「初期値に戻す」ボタンも用意されているので、編集を間違えても安心です。 旧バージョン(v1.0.x)からのアップデート:v1.0.xの日本語用・英語用の設定データは、v1.1.0へのアップデート時に自動マイグレーションされます。手動での再設定は不要です。

Step 3:テストメールで動作確認

設定画面のテストメール機能を使えば、実際にテスト決済をしなくても動作確認ができます。テストメールが届いたら、Stripeのテストモードで実際に決済してみましょう。 テストメール送信ボタンと「送信成功」の表示画面

テストメール送信ボタンと「送信成功」の表示

テストメールが実際に届いた受信箱のスクリーンショット

テストメールが実際に届いた受信箱

メールテンプレートのカスタマイズ

件名と本文は管理画面から自由に編集できます。プレースホルダーとフィルターフックで柔軟にカスタマイズできます。 以下のプレースホルダーが使えます。{brand}は設定で指定したブランド名、{email}は顧客のメールアドレス、{session_id}はCheckout Session ID(照合用)に置換されます。 さらに細かいカスタマイズが必要な場合は、フィルターフックを使えます。

CCやBCCを追加する

メールアドレスのドメインでテンプレートを切り替える

注意:v1.1.0から、tmfs_detect_languageフィルターの戻り値が言語コード(ja/en)からテンプレートインデックス(’0′, ‘1’, ‘2’…)に変更されました。 利用可能なフィルターはtmfs_email_headerstmfs_email_subjecttmfs_email_bodytmfs_detect_languageの4つです。

トラブルシューティング

Webhookの403エラー、メールが届かない、テスト→本番の切り替え——発生しやすい問題を整理しました。 トラブルシューティング・フローチャート

トラブルシューティング・フローチャート

Webhookが403エラーになる

Xserver(エックスサーバー)の場合:サーバーパネル → WordPressセキュリティ設定 → 「REST APIアクセス制限」をOFFにしてください。海外IPからのREST APIアクセスが制限されているため、StripeのWebhookがブロックされます。 Xserverサーバーパネルの「REST APIアクセス制限」設定画面

Xserverサーバーパネルの「REST APIアクセス制限」設定画面

Wordfenceの場合:Firewall → All Firewall Options → Allowlisted URLsに/wp-json/thanks-mail/v1/webhookを追加してください。

Webhookは200なのにメールが届かない

Stripeダッシュボードの Webhook ログ画面(200 OK + sent: true の表示)

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) 冪等性チェック用のユニークキー
email 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)からテンプレートインデックスに変更。

1.0.4

内部プレフィックスを stm_ から tmfs_ に全面変更——WordPress.orgの4文字以上プレフィックス要件に対応。

1.0.3

メインクラスのリネーム、フィルターフック名の変更、アンインストール関数の整理——WordPress.org命名規則への準拠。

1.0.2

外部リソース(CDN画像)の読み込みを削除し、インラインJavaScriptを外部ファイルに分離——セキュリティレビューへの対応。

1.0.1

メール送信失敗時に送信済みとして記録される不具合を修正。Webhookエンドポイントにレート制限を追加(IPあたり60秒間に10リクエストまで)。

1.0.0

初回リリース。

まとめ

Thanks Mail for Stripeは、Stripe Payment Links決済後のサンクスメールをWordPressだけで完結させるプラグインです。 外部サービスへの月額課金も、フローが止まる心配もありません。Stripeのwebhookを直接受信し、署名検証・冪等性チェックを経てメールを送信します。最大10個のテンプレートを自由に追加・削除でき、Payment Link IDによるテンプレート自動判定やフィルターフックによるカスタマイズにも対応しています。デジタル商品の販売、ソフトウェアライセンスの発行、サービス予約の確認など、様々なシーンで活用できます。バグ報告や機能リクエストはWordPress.orgのサポートフォーラムからお願いします。
WordPress
この記事を書いた人
rapls

Web開発歴6年以上のフリーランスエンジニア。WordPressプラグイン開発とAIツール活用が専門。「現場で本当に役立つ情報」をモットーに、開発で遭遇したトラブルと解決策を発信しています。

raplsをフォローする
raplsをフォローする

コメント

タイトルとURLをコピーしました