# 画面設計書 17-受信メール一覧画面

## 概要

本ドキュメントは、Ruby on Railsフレームワークにおける「受信メール一覧画面」の設計仕様を定義する。Action Mailboxで受信したすべての受信メール（InboundEmail）を一覧表示し、テストメールの作成機能へのアクセスを提供する開発者向け管理画面である。

### 本画面の処理概要

この画面は、Action Mailboxの開発・テスト用管理インターフェース「Rails Conductor」の一部として、受信メールの一覧表示を行う画面である。開発環境でメール受信処理のテストやデバッグを行う際に、受信メールの状態を確認し、詳細画面への遷移やテストメールの作成を行うことができる。

**業務上の目的・背景**：Action Mailboxを使用したメール受信機能の開発において、実際にメールを送信せずにメール処理をテストする必要がある。この画面は、フォーム入力や生のメールソースからテストメールを作成し、受信メールの処理状況（pending、processing、delivered、failed、bounced）を確認できるConductorインターフェースを提供する。これにより、開発者はメール処理ロジックを効率的にテスト・デバッグできる。

**画面へのアクセス方法**：開発環境において、`/rails/conductor/action_mailbox/inbound_emails`にアクセスすることでこの画面が表示される。または、`rails_conductor_inbound_emails_path`ヘルパーを使用してリンクを生成する。

**主要な操作・処理内容**：
1. 受信メール一覧の表示 - すべてのInboundEmailを作成日時の降順で表示
2. メッセージIDの表示 - 各メールのMessage-IDを表示（詳細画面へのリンク）
3. ステータスの表示 - 各メールの処理ステータス（pending/processing/delivered/failed/bounced）を表示
4. フォームによるメール作成 - 新規テストメールをフォーム入力で作成する画面へのリンク
5. ソースによるメール作成 - 生のRFC822形式メールソースからメールを作成する画面へのリンク

**画面遷移**：
- 遷移元：直接URLアクセス、または他の画面からのリンク
- 遷移先：受信メール詳細画面（メッセージIDクリック）、メールフォーム作成画面、メールソース作成画面

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 10 | Action Mailbox | 主機能 | InboundEmail一覧の取得・表示処理 |
| 3 | Active Record | 補助機能 | InboundEmailモデルのクエリ実行（order created_at desc） |
| 5 | Action View | 補助機能 | メール一覧のHTML描画処理 |

## 画面種別

一覧

## URL/ルーティング

| HTTPメソッド | URL | ルート名 | コントローラー#アクション |
|-------------|-----|---------|------------------------|
| GET | /rails/conductor/action_mailbox/inbound_emails | rails_conductor_inbound_emails | rails/conductor/action_mailbox/inbound_emails#index |

## 入出力項目

本画面は一覧表示のみのため、ユーザー入力項目は存在しない。

| 項目 | 入出力 | 説明 |
|------|--------|------|
| なし | - | ユーザー入力を受け付けない |

## 表示項目

| 項目名 | データ型 | 説明 | ソース |
|--------|----------|------|--------|
| ページタイトル | String | "All inbound emails" | テンプレート固定値 |
| 新規メール作成リンク（フォーム） | URL | メールフォーム作成画面へのリンク | `new_rails_conductor_inbound_email_path` |
| 新規メール作成リンク（ソース） | URL | メールソース作成画面へのリンク | `new_rails_conductor_inbound_email_source_path` |
| メッセージID | String | メールのMessage-IDヘッダー値 | `inbound_email.message_id` |
| ステータス | String | 処理ステータス（pending/processing/delivered/failed/bounced） | `inbound_email.status` |
| 詳細リンク | URL | 受信メール詳細画面へのリンク | `rails_conductor_inbound_email_path(inbound_email)` |

## イベント仕様

### 1-メッセージIDリンク押下

**処理内容**：選択した受信メールの詳細画面に遷移する。

**トリガー**：メッセージIDリンクのクリック

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

**画面遷移**：受信メール詳細画面

### 2-New inbound email by formリンク押下

**処理内容**：フォーム入力によるメール作成画面に遷移する。

**トリガー**："New inbound email by form"リンクのクリック

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

**画面遷移**：メールフォーム作成画面

### 3-New inbound email by sourceリンク押下

**処理内容**：メールソース入力による作成画面に遷移する。

**トリガー**："New inbound email by source"リンクのクリック

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

**画面遷移**：メールソース作成画面

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 画面表示時 | action_mailbox_inbound_emails | SELECT | InboundEmail一覧の取得 |

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

#### action_mailbox_inbound_emails

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | id, message_id, status, created_at | ORDER BY created_at DESC | 全レコードを作成日時降順で取得 |

## メッセージ仕様

| メッセージID | メッセージ種別 | メッセージ内容 | 表示条件 |
|-------------|---------------|---------------|----------|
| MSG-001 | 情報 | "All inbound emails" | 常時h1に表示 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| 403 Forbidden | 開発環境以外でのアクセス | HTTPステータス403を返す |

## 備考

- `Rails::Conductor::BaseController`を継承し、`before_action :ensure_development_env`で開発環境チェックを実施
- レイアウトは`rails/conductor`を使用
- InboundEmailモデルはActive Storageを使用して生のメールソースを保存
- statusはenumで管理（pending: 0, processing: 1, delivered: 2, failed: 3, bounced: 4）

---

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

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

### 推奨読解順序

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

まず、InboundEmailモデルの構造とステータス管理を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | inbound_email.rb | `actionmailbox/app/models/action_mailbox/inbound_email.rb` | InboundEmailモデルの構造、statusのenum定義 |

**読解のコツ**:
- 27行目: `InboundEmail < Record`でActiveRecordを継承
- 28行目: `Incineratable, MessageId, Routable`のincludeで機能拡張
- 30行目: `has_one_attached :raw_email`でActive Storageとの関連
- 31行目: `enum :status, %i[ pending processing delivered failed bounced ]`でステータス定義

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

コントローラーの構造と基底クラスを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | base_controller.rb | `actionmailbox/app/controllers/rails/conductor/base_controller.rb` | 基底コントローラー、開発環境チェック |
| 2-2 | inbound_emails_controller.rb | `actionmailbox/app/controllers/rails/conductor/action_mailbox/inbound_emails_controller.rb` | indexアクションの実装 |

**主要処理フロー**:
- **base_controller.rb 5行目**: `Rails::Conductor::BaseController < ActionController::Base`
- **base_controller.rb 6行目**: `layout "rails/conductor"`でレイアウト指定
- **base_controller.rb 7行目**: `before_action :ensure_development_env`で開発環境チェック
- **inbound_emails_controller.rb 7-9行目**: `index`アクションでInboundEmailを作成日時降順で取得

#### Step 3: ルーティングを理解する

Action Mailboxのルーティング定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | routes.rb | `actionmailbox/config/routes.rb` | Conductorのルーティング定義 |

**主要処理フロー**:
- **18-25行目**: Conductorのルーティング定義
- **19行目**: `resources :inbound_emails`でRESTfulルート生成
- **20-21行目**: ソース作成画面のルーティング

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

一覧画面のテンプレートを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | index.html.erb | `actionmailbox/app/views/rails/conductor/action_mailbox/inbound_emails/index.html.erb` | 一覧表示テンプレート |
| 4-2 | conductor.html.erb | `actionmailbox/app/views/layouts/rails/conductor.html.erb` | Conductorレイアウト |

**主要処理フロー**:
- **1行目**: `provide :title`でページタイトルを設定
- **3行目**: h1で"All inbound emails"を表示
- **5-6行目**: 新規メール作成へのリンク
- **8-16行目**: テーブルで一覧表示、各行でメッセージIDとステータスを表示

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

```
HTTPリクエスト（GET /rails/conductor/action_mailbox/inbound_emails）
    │
    ├─ ActionDispatch::Routing
    │      └─ routes.rb の rails_conductor_inbound_emails にマッチ
    │
    ├─ Rails::Conductor::BaseController
    │      └─ before_action :ensure_development_env
    │             │
    │             ├─ 開発環境 → 処理続行
    │             └─ 本番環境 → head :forbidden
    │
    └─ Rails::Conductor::ActionMailbox::InboundEmailsController#index
           │
           ├─ ActionMailbox::InboundEmail.order(created_at: :desc)
           │      └─ SELECT * FROM action_mailbox_inbound_emails
           │             ORDER BY created_at DESC
           │
           └─ render
                  │
                  ├─ layouts/rails/conductor.html.erb
                  │      └─ yield
                  │
                  └─ inbound_emails/index.html.erb
                         │
                         ├─ link_to new_rails_conductor_inbound_email_path
                         ├─ link_to new_rails_conductor_inbound_email_source_path
                         │
                         └─ @inbound_emails.each do |inbound_email|
                                ├─ link_to inbound_email.message_id
                                └─ inbound_email.status
```

### データフロー図

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

HTTPリクエスト ───────▶ InboundEmailsController#index
GET /rails/conductor/          │
action_mailbox/                │
inbound_emails                 ▼
                         ensure_development_env
                               │
                         Rails.env.development?
                               │
                    ┌──────────┴──────────┐
                    │                     │
                    ▼                     ▼
               true → 続行          false → 403 Forbidden
                    │
                    ▼
         InboundEmail.order(created_at: :desc)
                    │
                    ▼
         @inbound_emails = [
           {message_id: "...", status: "delivered"},
           {message_id: "...", status: "pending"},
           ...
         ]
                    │
                    ▼
         index.html.erb
                    │
                    ▼
         HTMLレスポンス ───────▶ ブラウザ表示
                                    │
                                    ├─ h1: "All inbound emails"
                                    ├─ リンク: フォーム作成
                                    ├─ リンク: ソース作成
                                    └─ テーブル: メール一覧
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| inbound_emails_controller.rb | `actionmailbox/app/controllers/rails/conductor/action_mailbox/inbound_emails_controller.rb` | コントローラー | 一覧・詳細・作成アクション |
| base_controller.rb | `actionmailbox/app/controllers/rails/conductor/base_controller.rb` | コントローラー | 基底コントローラー、環境チェック |
| index.html.erb | `actionmailbox/app/views/rails/conductor/action_mailbox/inbound_emails/index.html.erb` | テンプレート | 一覧表示テンプレート |
| conductor.html.erb | `actionmailbox/app/views/layouts/rails/conductor.html.erb` | レイアウト | Conductorレイアウト |
| inbound_email.rb | `actionmailbox/app/models/action_mailbox/inbound_email.rb` | モデル | InboundEmailモデル |
| routes.rb | `actionmailbox/config/routes.rb` | ルーティング | Action Mailboxルーティング定義 |
