# 画面設計書 18-受信メール詳細画面

## 概要

本ドキュメントは、Ruby on Railsフレームワークにおける「受信メール詳細画面」の設計仕様を定義する。Action Mailboxで受信した特定のメール（InboundEmail）の詳細情報を表示し、再ルーティングや削除（incinerate）操作を提供する開発者向け管理画面である。

### 本画面の処理概要

この画面は、Action Mailboxの開発・テスト用管理インターフェース「Rails Conductor」の一部として、個別の受信メールの詳細情報を表示する画面である。メールの処理ステータス確認、生のメールソースの閲覧、再ルーティング（処理のやり直し）、削除（incinerate）などの操作を行うことができる。

**業務上の目的・背景**：Action Mailboxを使用したメール受信機能のデバッグにおいて、個々のメールの処理状況を詳細に確認する必要がある。特に、処理が失敗したメールの原因調査や、ルーティングロジックの変更後に再処理を行う場合に重要である。この画面では、メールの完全なRFC822ソースを確認でき、問題の診断に役立つ。

**画面へのアクセス方法**：開発環境において、`/rails/conductor/action_mailbox/inbound_emails/:id`にアクセスすることでこの画面が表示される。通常は受信メール一覧画面からメッセージIDリンクをクリックして遷移する。

**主要な操作・処理内容**：
1. メール情報の表示 - メッセージIDと処理ステータスを表示
2. 再ルーティング（Route again） - メールをpending状態に戻し、再度ルーティング処理を実行
3. 削除（Incinerate） - メールを即座に削除（通常は処理完了後に自動で削除されるが、即時削除も可能）
4. メールソースの表示 - 生のRFC822形式メールソースを折りたたみ表示
5. 一覧への戻り - 受信メール一覧画面へのリンク

**画面遷移**：
- 遷移元：受信メール一覧画面（メッセージIDリンク）
- 遷移先：受信メール一覧画面（削除後）、同一画面（再ルーティング後）

**権限による表示制御**：
- 開発環境（`Rails.env.development?`）でのみアクセス可能
- 本番環境ではHTTPステータス403（Forbidden）が返される

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 10 | Action Mailbox | 主機能 | InboundEmailの詳細情報取得・表示処理 |
| 10 | Action Mailbox | 遷移先機能 | 再ルーティング処理（reroute）への遷移 |
| 10 | Action Mailbox | 遷移先機能 | 削除処理（incinerate）への遷移 |

## 画面種別

詳細

## URL/ルーティング

| HTTPメソッド | URL | ルート名 | コントローラー#アクション |
|-------------|-----|---------|------------------------|
| GET | /rails/conductor/action_mailbox/inbound_emails/:id | rails_conductor_inbound_email | rails/conductor/action_mailbox/inbound_emails#show |
| POST | /rails/conductor/action_mailbox/:inbound_email_id/reroute | rails_conductor_inbound_email_reroute | rails/conductor/action_mailbox/reroutes#create |
| POST | /rails/conductor/action_mailbox/:inbound_email_id/incinerate | rails_conductor_inbound_email_incinerate | rails/conductor/action_mailbox/incinerates#create |

## 入出力項目

本画面は詳細表示と操作ボタンのみのため、フォーム入力項目は存在しない。

| 項目 | 入出力 | 説明 |
|------|--------|------|
| なし | - | フォーム入力を受け付けない |

## 表示項目

| 項目名 | データ型 | 説明 | ソース |
|--------|----------|------|--------|
| ページタイトル | String | メッセージID | `@inbound_email.message_id` |
| ヘッダー | String | "メッセージID: ステータス" | `@inbound_email.message_id`, `@inbound_email.status` |
| Route againボタン | HTML | 再ルーティングを実行するボタン | `button_to` |
| Incinerateボタン | HTML | 削除を実行するボタン | `button_to` |
| メールソース | String | 生のRFC822形式メールソース（折りたたみ） | `@inbound_email.source` |
| 一覧へ戻るリンク | URL | 受信メール一覧画面へのリンク | `rails_conductor_inbound_emails_path` |

## イベント仕様

### 1-Route againボタン押下

**処理内容**：メールをpending状態に戻し、再度ルーティング処理を実行する。

**トリガー**："Route again"ボタンのクリック

**処理フロー**：
1. POSTリクエストを`/rails/conductor/action_mailbox/:inbound_email_id/reroute`に送信
2. `ReroutesController#create`が実行される
3. InboundEmailのステータスを`pending`に変更
4. `route_later`メソッドで非同期ルーティングをキュー投入
5. 同じ詳細画面にリダイレクト

**画面遷移**：同一画面（リダイレクト後）

### 2-Incinerateボタン押下

**処理内容**：メールを即座に削除する。

**トリガー**："Incinerate"ボタンのクリック

**処理フロー**：
1. POSTリクエストを`/rails/conductor/action_mailbox/:inbound_email_id/incinerate`に送信
2. `IncineratesController#create`が実行される
3. `inbound_email.incinerate`メソッドでメールを削除
4. 受信メール一覧画面にリダイレクト

**画面遷移**：受信メール一覧画面

### 3-Back to all inbound emailsリンク押下

**処理内容**：受信メール一覧画面に遷移する。

**トリガー**："Back to all inbound emails"リンクのクリック

**処理フロー**：
1. ユーザーがリンクをクリック
2. ブラウザが`/rails/conductor/action_mailbox/inbound_emails`に遷移
3. 受信メール一覧画面が表示される

**画面遷移**：受信メール一覧画面

### 4-Full email sourceの展開/折りたたみ

**処理内容**：メールソースの表示/非表示を切り替える。

**トリガー**："Full email source"サマリーのクリック

**処理フロー**：
1. ユーザーが`<details>`要素のサマリーをクリック
2. ブラウザのネイティブ機能で展開/折りたたみ

**画面遷移**：なし（同一画面内での表示切り替え）

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 画面表示時 | action_mailbox_inbound_emails | SELECT | 指定IDのInboundEmail取得 |
| Route again | action_mailbox_inbound_emails | UPDATE | statusをpendingに更新 |
| Incinerate | action_mailbox_inbound_emails | DELETE | InboundEmailレコードを削除 |
| Incinerate | active_storage_attachments | DELETE | 関連する添付ファイル参照を削除 |
| Incinerate | active_storage_blobs | DELETE | 関連するファイル実体を削除 |

### テーブル別更新項目詳細

#### action_mailbox_inbound_emails（Route again）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | status | 0（pending） | enum値をpendingに変更 |
| UPDATE | updated_at | 現在時刻 | タイムスタンプ更新 |

#### action_mailbox_inbound_emails（Incinerate）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | - | id = :inbound_email_id | レコード全体を削除 |

## メッセージ仕様

| メッセージID | メッセージ種別 | メッセージ内容 | 表示条件 |
|-------------|---------------|---------------|----------|
| MSG-001 | 情報 | "{message_id}: {status}" | 常時h1に表示 |
| MSG-002 | 情報 | "Full email source" | 常時details summaryに表示 |
| MSG-003 | 情報 | "Back to all inbound emails" | 常時リンクテキストとして表示 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| ActiveRecord::RecordNotFound | 指定IDのInboundEmailが存在しない | 404エラー |
| 403 Forbidden | 開発環境以外でのアクセス | HTTPステータス403を返す |

## 備考

- `<details>`/`<summary>`タグはHTML5のネイティブ折りたたみ機能を使用
- `button_to`ヘルパーはフォームを生成し、POSTリクエストを送信
- `incinerate`メソッドは即時削除ではなく、Active Jobを使用した非同期削除の場合もある
- 再ルーティング後、同じメールボックスに再度ルーティングされる

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、InboundEmailモデルのメソッドと関連機能を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | inbound_email.rb | `actionmailbox/app/models/action_mailbox/inbound_email.rb` | sourceメソッド、pending!メソッド |

**読解のコツ**:
- 28行目: `include Incineratable, MessageId, Routable`で機能追加
- 37-39行目: `source`メソッドでraw_emailをダウンロード
- enum :statusでステータス管理（pending!等のメソッドが自動生成）

#### Step 2: コントローラーを理解する

詳細表示と関連操作のコントローラーを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | inbound_emails_controller.rb | `actionmailbox/app/controllers/rails/conductor/action_mailbox/inbound_emails_controller.rb` | showアクション |
| 2-2 | reroutes_controller.rb | `actionmailbox/app/controllers/rails/conductor/action_mailbox/reroutes_controller.rb` | createアクション |
| 2-3 | incinerates_controller.rb | `actionmailbox/app/controllers/rails/conductor/action_mailbox/incinerates_controller.rb` | createアクション |

**主要処理フロー**:
- **inbound_emails_controller.rb 14-16行目**: `show`アクションでInboundEmailを取得
- **reroutes_controller.rb 8-13行目**: `create`アクションでpending!とroute_laterを実行
- **incinerates_controller.rb 8-11行目**: `create`アクションでincinerateを実行

#### Step 3: テンプレート構造を理解する

詳細画面のテンプレートを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | show.html.erb | `actionmailbox/app/views/rails/conductor/action_mailbox/inbound_emails/show.html.erb` | 詳細表示テンプレート |

**主要処理フロー**:
- **1行目**: `provide :title`でページタイトルを設定
- **3行目**: h1でメッセージIDとステータスを表示
- **5-8行目**: ulで操作ボタン（Route again、Incinerate）を配置
- **10-13行目**: detailsでメールソースを折りたたみ表示
- **15行目**: 一覧へ戻るリンク

### プログラム呼び出し階層図

```
HTTPリクエスト（GET /rails/conductor/action_mailbox/inbound_emails/:id）
    │
    ├─ Rails::Conductor::ActionMailbox::InboundEmailsController#show
    │      │
    │      ├─ ActionMailbox::InboundEmail.find(params[:id])
    │      │      └─ SELECT * FROM action_mailbox_inbound_emails WHERE id = :id
    │      │
    │      └─ render show.html.erb
    │             │
    │             ├─ @inbound_email.message_id
    │             ├─ @inbound_email.status
    │             │
    │             ├─ button_to "Route again"
    │             │      └─ POST /rails/conductor/action_mailbox/:id/reroute
    │             │
    │             ├─ button_to "Incinerate"
    │             │      └─ POST /rails/conductor/action_mailbox/:id/incinerate
    │             │
    │             └─ @inbound_email.source
    │                    └─ raw_email.download

HTTPリクエスト（POST /rails/conductor/action_mailbox/:id/reroute）
    │
    └─ Rails::Conductor::ActionMailbox::ReroutesController#create
           │
           ├─ inbound_email.pending!
           │      └─ UPDATE status = 0
           │
           ├─ inbound_email.route_later
           │      └─ Active Job キュー投入
           │
           └─ redirect_to rails_conductor_inbound_email_url

HTTPリクエスト（POST /rails/conductor/action_mailbox/:id/incinerate）
    │
    └─ Rails::Conductor::ActionMailbox::IncineratesController#create
           │
           ├─ inbound_email.incinerate
           │      └─ DELETE + Active Storage cleanup
           │
           └─ redirect_to rails_conductor_inbound_emails_url
```

### データフロー図

```
[入力]                    [処理]                              [出力]

GET /:id ─────────────▶ InboundEmailsController#show
                              │
                              ▼
                    InboundEmail.find(id)
                              │
                              ▼
                    @inbound_email = {
                      message_id: "abc123@example.com",
                      status: "delivered",
                      source: "From: ...\r\nTo: ..."
                    }
                              │
                              ▼
                    show.html.erb ────────────▶ HTMLレスポンス

POST /reroute ────────▶ ReroutesController#create
                              │
                              ├─ pending! ──────▶ UPDATE status
                              │
                              └─ route_later ──▶ Job Queue
                                     │
                                     └────────▶ redirect_to show

POST /incinerate ─────▶ IncineratesController#create
                              │
                              └─ incinerate ───▶ DELETE record
                                     │            DELETE attachments
                                     │
                                     └────────▶ redirect_to index
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| inbound_emails_controller.rb | `actionmailbox/app/controllers/rails/conductor/action_mailbox/inbound_emails_controller.rb` | コントローラー | showアクション |
| reroutes_controller.rb | `actionmailbox/app/controllers/rails/conductor/action_mailbox/reroutes_controller.rb` | コントローラー | 再ルーティング処理 |
| incinerates_controller.rb | `actionmailbox/app/controllers/rails/conductor/action_mailbox/incinerates_controller.rb` | コントローラー | 削除処理 |
| show.html.erb | `actionmailbox/app/views/rails/conductor/action_mailbox/inbound_emails/show.html.erb` | テンプレート | 詳細表示テンプレート |
| inbound_email.rb | `actionmailbox/app/models/action_mailbox/inbound_email.rb` | モデル | InboundEmailモデル |
| incineratable.rb | `actionmailbox/app/models/action_mailbox/inbound_email/incineratable.rb` | Concern | 削除機能 |
| routable.rb | `actionmailbox/app/models/action_mailbox/inbound_email/routable.rb` | Concern | ルーティング機能 |
| routes.rb | `actionmailbox/config/routes.rb` | ルーティング | Action Mailboxルーティング定義 |
