Fincs

横断/運用基盤 / メール配信エンジン

横断/運用基盤 / メール配信エンジン

本ページは 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 対応 等)

関連ドキュメント


このページの内容を AI に質問しますか?
関連 spec を自動抽出して ChatGPT / Claude などに渡せます。
AI Prompt で開く →