# Changelog

Mail Studio の変更履歴。バージョン表記は [Semantic Versioning](https://semver.org/lang/ja/) に従います。

## [1.1.0] - 2026-08-03

### 追加

- **SMS（ショートメッセージ）配信に対応**。メールと同じ仕組みで、電話番号あての配信ができるようになりました
  - **SMSステップ配信** — 登録をトリガーに、SMSを順番に自動送信
  - **SMS一斉配信** — 1回かぎりのSMSを送信
  - **メールとSMSの混在シナリオ** — 1つのシナリオ内でステップごとにメール/SMSを選べます
- **配信メニューを4つに分離** — 📮メール一斉配信 / 📱SMS一斉配信 / 🪜メールステップ配信 / 📲SMSステップ配信。
  「単発かシリーズか」×「メールかSMSか」で画面が分かれ、混在シナリオは両方の一覧に「混在」バッジ付きで表示されます
- **登録フォームを3種類に拡張** — シナリオ一覧からワンクリックで発行できます
  - メールのみ（従来）／ SMSのみ（電話番号だけ・メール不要）／ メール＋SMS
- **SMS送信プロバイダの抽象化** — 業者を差し替えられる設計。標準で NTT C-Path（NTT CPaaS）と Twilio に対応
- **文字数・通数・概算コストのリアルタイム表示** — 入力しながら「◯文字＝◯通≒◯円/人」「あと◯文字で◯通」が分かります

### 安全設計（SMS）

- **SMSの送信オン/オフはメールと完全に独立**（`SMS_DRY_RUN`）。メールを本番運用しながらSMSだけ止められます
- **1日の上限はセグメント（課金通数）で管理** — `MAX_SMS_PER_DAY` がそのまま1日のコスト上限になります（既定100 ≒ 1,000円）
- **同意がない相手には送らない** — 電話番号を持っているだけでは送信対象になりません（特定電子メール法のオプトイン原則）。
  同意した日時と取得経路も保存します
- **送信者表示と配信停止URLを全SMSに自動付与**。停止URLは自ドメインのみ（短縮URLサービスはキャリアにブロックされるため不使用）
- **配信停止リンク1回でメールもSMSも停止**
- `SMS_PROVIDER=none` で SMS 機能を完全停止できます（初期値）

### 変更

- 新規セットアップ用スキーマ（`schema_full.sql`）にSMS関連の列を統合。既存環境からの移行は追加SQLで対応
- 既存のメール配信の動作は変更ありません（すべての列は既定値つきで追加）

## [1.0.1] - 2026-07-26

### 変更

- **セットアップ案内を「AIに任せる」1本に整理**。「はじめにお読みください」を、
  ①Claude Code を用意する ②フォルダを開く ③「セットアップを手伝ってください」と話しかける、の3手順に書き換え
- コマンド（`npm install` / `bash scripts/setup.sh`）の案内を「エンジニア向け」として末尾に移動。
  ターミナルに不慣れな方が最初に読む内容から外しました
- `VERSION.txt` を同梱。お手元のパッケージがどの版かひと目で分かるようになりました

## [1.0.0] - 2026-07-26

初回配布版。

### 機能

- **一斉配信** — 下書き → 予約 → 承認 → 自動送信。Cron（毎分）で予約時刻に自動実行
- **ステップメール** — 登録をトリガーに自動開始。即時 / N日後 / 時刻指定のタイミング制御
- **登録フォーム / Webhook** — 連携リンクを発行するだけで、埋め込みフォーム（iframe可）と汎用 Webhook 受信URLの両方が手に入る
- **ポイント & 抽選** — 開封・クリックでポイント付与、抽選くじ、ポイント交換（在庫・当選本数の上限管理つき）
- **読者マイページ** — 購読者ごとの固定URLで残高確認・抽選・交換
- **配信停止 / 到達率** — 全メールに配信停止リンクと送信者表示を自動付与。Resend のバウンス・苦情を購読者状態に反映
- **SNS 連携** — LINE / X 側の登録イベントを受け取ってメール配信を自動開始

### 安全設計

- 実送信は `DRY_RUN=false` **かつ** 配信が「承認済み」のときだけ。初期値は `DRY_RUN=true`
- 二重送信防止 — DB 一意制約 + 予約の楽観ロック + Resend `Idempotency-Key`
- 送信上限 — `MAX_SENDS_PER_TICK`（既定100）/ `MAX_SENDS_PER_DAY`（既定2000）
- 配信停止・バウンス済みのアドレスは送信対象から自動除外

### 品質

- 自動テスト 99 件（Cloudflare アカウント不要で実行可能）
- TypeScript strict モード / 型チェック通過
- ポイント消費・抽選・交換は競合状態（同時多重リクエスト）を単一 SQL 文で原子的に処理し、残高マイナス・在庫超過・当選本数超過が起きないことをテストで担保

### セットアップ

- `bash scripts/setup.sh` の対話ウィザードで、D1 作成 → スキーマ適用 → シークレット登録 → デプロイまで一括実行
- `schema_full.sql` 1本でデータベースを初期化（再実行しても安全）
- Claude Code 用の指示書 `CLAUDE.md` を同梱。セットアップと運用の相談相手として使えます
