横断/運用基盤 / メール配信エンジン
横断/運用基盤 / メール配信エンジン
本ページは 2 段構成。上段が biz/CS 向け(ユーザー提示可)、下段(
## 🔧 実装詳細以降)が dev 向け。biz/CS がユーザーへ提示・転用してよいのは上段のみ。
概要
fincs サービスのメール送信・受信・配信実績集計をまとめた基盤レイヤ。外部メール配信プロバイダ(SendGrid)を介したメール送信、受信メールの社内転送、配信メールの開封・クリック等の集計を担当する。
主な構成要素:
- メール送信: テンプレートベースのシステム通知(領収書・メール認証・問い合わせ完了等)と、テンプレート無しの自由本文の 2 経路
- 配信メールのバッチ送信: 一斉配信・ステップ配信から呼び出される、大量送信処理
- メール受信解除(opt-out): 配信メール本文の解除リンクからの受信拒否設定
- 配信実績集計: メールの届いた件数・開封件数・クリック件数を集計
- メール転送: 受信メールを内部の関係ユーザーへ自動転送する仕組み
主な利用想定は、システムからの自動通知メール送信、講師による一斉配信・ステップ配信の実行、特電法対応の opt-out 受付、配信効果分析(開封率・クリック率)。本ページは基盤レイヤを扱い、配信機能の運用仕様は機能別ページ(../plan-management/bulk-delivery.md、../plan-management/step-delivery.md)を参照。
配信失敗時のリトライは未提供: SendGrid 側の障害・通信エラーによる送信失敗時、自動再送は行わない。失敗時は内部 Slack 通知が走る運用。再送が必要な場合は別途手動対応となる(改善対象)。
bounce・spam の自動ハンドリング未対応: メール送信先の bounce(配信不能)や spam 報告に対する自動的なハードリスト管理・以降の自動除外は提供していない。届かないメールは別途手動で対応が必要。
会社別の差出人切替: 配信メールの差出人(送信元)は、講座の事業者契約に応じて自動的に切り替わる仕組み。事業者ごとに異なるテンプレートを利用できる。
📝 レビュー観点:
- 目的: メール送信・配信集計の基盤
- 誰が使うか: 全機能(システム通知 / 一斉配信 / ステップ配信 / 領収書 / メール認証 等)
- どこで使うか: BE 全般、ユーザーへの直接 UI なし
- 隣接機能との関係: 一斉配信(
../plan-management/bulk-delivery.md)、ステップ配信(../plan-management/step-delivery.md)、通知基盤(./notification.md)、コンプライアンス(./compliance.md)- CS 問い合わせで頻発する論点: 「メール届かない」「迷惑メール扱い」「配信解除リンクを押したのに届く」「同名アカウントのメール転送経路」
- [本機能特有] 配信イベント webhook は DELIVERED / OPEN / CLICK のみ: bounce / spamreport / dropped 未対応
- [本機能特有] webhook 署名検証なし: SendGrid 公開鍵検証は未実装
- [本機能特有] 配信失敗時のリトライなし: 失敗時は内部 Slack 通知 + 例外
- [本機能特有] テンプレートは DB マスタ + Velocity 展開: 会社別(GLA / FPO)切替あり
利用シナリオ
シナリオ 1: 領収書メールの自動送信
決済完了時にシステムが領収書メールを自動送信。テンプレートに動的な情報(金額・日付・受講者名等)を埋め込んで送信する。
シナリオ 2: 一斉配信メールの送信
配信用横断軸所属の講師が一斉配信を予約 → バッチが予約日時に到達した配信を順次送信。送信先は受信解除済みユーザーを自動的に除外。
シナリオ 3: 受信解除リンクからの opt-out
ユーザーが配信メール本文の「受信解除はこちら」リンクから手続きすると、講座 × ユーザー単位で受信拒否が記録され、以降の配信が自動的に止まる。
シナリオ 4: メール開封・クリックの集計
ユーザーが受信メールを開封したり本文中のリンクをクリックしたりすると、外部プロバイダの通知経由で集計が更新される。配信機能の結果画面で開封率・クリック率を確認できる。
シナリオ 5: 受信メールの社内転送
特定の宛先に届いたメール(問い合わせ用代理アドレス等)を、内部で関係するユーザー全員に自動転送。本文・添付ファイルが転送される。
よくある失敗ケース
- メール配信プロバイダ障害: 外部障害時はシステム側からのメール送信が失敗する。リトライ機構がないため、復旧後の再送は別途対応
- bounce による不達: 受信側のメールアドレスが無効・bounce となるケース。自動除外機構がないため繰り返し送信されてしまう
- 迷惑メール扱い: SPF / DKIM / DMARC のドメイン認証関連で迷惑メール判定されるケース。インフラ側の整備対象
- 受信解除リンク後の届いてしまう配信: 解除直後の配信で既に処理が始まっているケースは届くことがある
権限別仕様
権限定義は ../user-roles.md 参照。
横断軸
メール配信エンジンは基盤機能のため、ユーザー権限軸での直接の操作は無い。配信機能側の権限軸は ../plan-management/bulk-delivery.md 等を参照。
| 操作 | 受講者 | 講師 | 運営アドミン |
|---|---|---|---|
| メール受信解除(opt-out) | ○(メール本文リンクから) | ○ | ○ |
| 受信解除一覧の参照 | ○(自分のみ) | ○ | ○ |
機能詳細(ふるまい)
メール送信
- テンプレート版: 内部のテンプレートマスタから件名・本文・差出人を取得し、動的な情報を埋め込んで送信。決済失敗 / 問い合わせ完了 / メール認証 / 領収書 / 銀行振込申込 等のシステム通知が該当
- テンプレート無し版: 配信メッセージなど自由本文を直接送信
- 大量送信時は内部で 1000 件単位のバッチに分割
- 受信解除済みユーザーは送信前に自動的に除外
- 本文末尾に「受信解除はこちら」リンクを自動付与(特電法対応)
配信実績の集計
- 外部メールプロバイダから送られてくる通知を受信し、各メールの「届いた」「開封された」「リンクがクリックされた」を集計
- 集計対象: 配信成功・開封・クリック
- 集計結果は配信機能の結果画面で参照可能
- 現時点で bounce・spam 報告・dropped 等のイベント処理は未対応
メール転送
- 特定の宛先に届いたメールを、関係する内部ユーザー全員に自動転送
- 本文・添付ファイルが転送される
- 問い合わせ用代理アドレス・受付窓口メール等の運用に利用
受信解除(opt-out)
- 配信メール本文の「受信解除はこちら」リンクから ユーザーが手続き
- 受講者 × 講座(配信主体)単位で受信拒否設定が記録される
- 以降の配信処理時、設定済みユーザーは自動的にスキップ
- メールクライアント側の一括解除(List-Unsubscribe ヘッダ)にも対応(RFC 準拠)
テンプレート展開・パラメータ置換
配信メール本文には、講師が以下のプレースホルダを記述することで、送信時に各受講者の情報に置換される:
- ユーザー名 / 本名
- 配信日付
- 契約年月日
- 住所 / 電話番号
- メールアドレス
プレースホルダの利用可否は配信元の事業者ポリシーや個人情報取扱い設定に依存する。
会社別差出人切替
- 講座の事業者契約に応じて、配信メールの送信元情報(差出人名・差出人アドレス)が自動的に切り替わる
- 同一サービス内で複数事業者の講座が混在しても、適切な差出人で送信可能
📝 レビュー観点:
- 入力 → 処理 → 出力: 配信トリガー → SendGrid 送信 → webhook 経由で集計 DB 更新
- エッジケース: bounce 自動除外なし、署名検証なし、リトライ機構なし
- エラー表示: 送信失敗時は内部 Slack 通知のみ
- [本機能特有] DELIVERED/OPEN/CLICK 以外の SendGrid イベント未処理
admin 操作
該当なし / 実装されていない
- テンプレート編集の運営アドミン UI: 専用画面は無し(DB 直接更新)
- bounce ハードリスト管理: 未実装
- 配信失敗の手動再送: 未実装
📝 レビュー観点:
- bounce 管理 UI の必要性
- テンプレート版管理の運用フロー
品質 / 約束事項
- 応答性: 送信は非同期(
@Async)。配信集計はメールイベント webhook 受信後に即時更新 - 信頼性: 失敗時は内部 Slack 通知 + 例外送出。リトライ機構なし
- 制限値:
- 1 配信バッチサイズ: 1000 件(SendGrid 制限)
- 配信集計対象イベント: DELIVERED / OPEN / CLICK のみ
- データ保持: 配信集計は配信単位で保持
📝 レビュー観点:
- [本機能特有] webhook 署名検証なし: 改善課題
- [本機能特有] bounce / spam 未対応: 改善課題
変更履歴(リリースノート候補)
v2.29.2: 2026-05-04(PSD 初版)
- [PSD 追加] 本ドキュメント初版作成。v2.29.2 時点の実装を起こし。機能追加・変更は含まない
📝 レビュー観点:
- 過去の主要変更(SendGrid 統合 / イベント webhook 対応 / RFC8058 対応 等)
関連ドキュメント
- 権限定義:
../user-roles.md - 用語辞書:
../terminology.md - 関連 PSD:
../plan-management/bulk-delivery.md— 一斉配信../plan-management/step-delivery.md— ステップ配信./notification.md— 通知基盤./compliance.md— 受信解除・特電法