Files
CFDivePlatform/openspec/specs/notification-email/spec.md
T
a620906209 0cd1047b10
Run Tests / test (pull_request) Successful in 30s
docs(openspec): 補齊所有 spec 缺少的 Purpose section 與規格標頭
repo 內 35/38 份既有 spec 都是舊版歸檔流程留下的原始 delta 內容(`##
ADDED Requirements`,缺標題與 Purpose),openspec CLI 現版本嚴格驗證
(--strict)會報錯或警告。逐一補上:

- 缺標題/Purpose 的 30 份:加上 `# <name> Specification` 標題 + 依內容
  撰寫的 Purpose 段落,`## ADDED Requirements` 改回 `## Requirements`
- compose-cloud-baseline、scheduler-container:已有標題與
  Requirements,只補 Purpose 包裝
- provider-verification:已有標題與 Purpose,只需把
  `## ADDED Requirements` 改回 `## Requirements`
- admin-user-management、notification-email:各有一條 requirement 缺
  SHALL/MUST 關鍵字(純敘述句或表格),補上規範用語,內容不變

`openspec validate --specs --strict`:38/38 全過(原本 4/38)。純文件
補齊,未變更任何 requirement 的實質內容或行為描述。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011LpcY9b7y9x4fusHBTXciQ
2026-08-03 04:11:06 +08:00

3.2 KiB
Raw Blame History

notification-email Specification

Purpose

定義透過 SMTP 非同步寄送 Email 通知的機制,涵蓋本地 Mailpit 攔截、Queue Worker 投遞、Markdown 模板與各事件的觸發條件。

Requirements

Requirement: Laravel Mail 設定

系統 SHALL 支援透過 SMTP 寄送 Email 通知。本地開發環境使用 MailpitDocker service)攔截所有寄出信件,不真實發送。.env 設定:MAIL_MAILER=smtpMAIL_HOST=mailpitDocker service name)、MAIL_PORT=1025

Scenario: 本地環境信件攔截

  • WHEN 系統觸發 Email 通知
  • THEN 信件出現在 Mailpit Web UIhttp://localhost:8025),未真實寄出

Requirement: Queue Worker 處理 Email 投遞

Email 通知 SHALL 透過 Laravel QueueQUEUE_CONNECTION=database)非同步投遞,不阻塞 HTTP response。Queue Worker 在 Docker Compose 中以獨立 service 啟動。

Scenario: Email 加入 Queue

  • WHEN 業務邏輯觸發 notifyvia() 包含 'mail'
  • THEN Email job 進入 jobs 資料表,HTTP response 立即回傳

Scenario: Queue Worker 處理後寄出

  • WHEN queue:work 讀取到 Email job
  • THEN Mailable 被實際執行,信件送至 SMTP(本地為 Mailpit

Scenario: 失敗重試

  • WHEN SMTP 連線失敗
  • THEN Job 重試最多 3 次($tries = 3),超過後寫入 failed_jobs

Requirement: Email Markdown 模板

每種通知場景 SHALL 有對應的 Laravel Markdown Mailable 模板,存放於 resources/views/emails/notifications/。模板須包含:平台名稱(CFDivePlatform)、通知標題、正文、行動連結按鈕(CTA)、底部免責聲明。

涵蓋場景(共 5 種,ReviewReceivedNotification 僅站內通知不寄 Email):

  • booking-created.blade.php(給 Provider
  • booking-confirmed.blade.php(給 Member
  • booking-rejected.blade.php(給 Member
  • booking-cancelled.blade.php(給對方)
  • booking-completed.blade.php(給 Member

Scenario: Email 內容包含行動連結

  • WHEN Member 收到「預約已確認」Email
  • THEN 信件包含「查看預約」按鈕,點擊後導向 {FRONTEND_URL}/my-bookings

Scenario: Email 主旨語言

  • WHEN 系統寄出任何通知 Email
  • THEN 主旨以繁體中文撰寫(例:「你的預約已確認 — CFDivePlatform」)

Requirement: Email 通知觸發條件與收件人

系統 SHALL 依下表定義的事件、收件人與主旨寄送 Email 通知:

事件 收件人 主旨
預約建立(pending Provider 你有新的預約申請
預約確認(confirmed Member 你的預約已確認
預約拒絕(rejected Member 你的預約申請未通過
預約取消(任一方) 對方 預約已取消
預約完成(completed Member 預約完成,歡迎留下評價

注意ReviewReceivedNotification 僅透過 database channel 站內通知,不寄 Email(告知性通知,避免打擾 Provider)。

Scenario: 預約建立後 Provider 收到 Email

  • WHEN Member 成功建立預約(status 為 pending
  • THEN 課程所屬 Provider 在 Queue 處理後收到「你有新的預約申請」Email