# API設計書

## 概要

本ドキュメントは、Ruby on Rails フレームワークに組み込まれている2つの主要なAPI群（Active Storage および Action Mailbox）のエンドポイント設計を記載しています。これらのAPIは Rails アプリケーションにファイルストレージ機能とメール受信機能を提供します。

## 共通仕様

### ベースURL

```
Active Storage: {アプリケーションURL}/rails/active_storage
Action Mailbox: {アプリケーションURL}/rails/action_mailbox
Conductor (開発用): {アプリケーションURL}/rails/conductor/action_mailbox
```

### 認証方式

| API群 | 認証方式 | 説明 |
| --- | --- | --- |
| Active Storage | 署名付きURL | signed_id による署名検証。URLの改ざん防止のため署名付きトークンを使用 |
| Action Mailbox (Postmark, SendGrid, Relay) | HTTP Basic認証 | ユーザー名: `actionmailbox`、パスワード: credentials または環境変数 |
| Action Mailbox (Mandrill) | HMAC-SHA1署名 | X-Mandrill-Signature ヘッダーによる署名検証 |
| Action Mailbox (Mailgun) | HMAC-SHA256署名 | timestamp + token の署名検証 |
| Conductor | なし | 開発環境専用、認証不要 |

### 共通ヘッダー

| ヘッダー名 | 必須 | 説明 |
| --- | --- | --- |
| Content-Type | - | リクエストに応じて application/json または message/rfc822 |
| Accept | - | application/json |
| Authorization | 条件付き | HTTP Basic認証が必要なエンドポイントのみ |
| X-Mandrill-Signature | 条件付き | Mandrill ingress のみ |

### 共通エラーレスポンス

| ステータスコード | 説明 |
| --- | --- |
| 401 | Unauthorized - 認証エラー（署名不正、パスワード不正） |
| 404 | Not Found - リソース未検出、または ingress が設定されていない |
| 415 | Unsupported Media Type - メディアタイプ不正（Relay ingress のみ） |
| 422 | Unprocessable Entity - パラメータ不正、整合性エラー |
| 500 | Internal Server Error - サーバー設定エラー |

## API一覧

| カテゴリ | エンドポイント | メソッド | 説明 |
| --- | --- | --- | --- |
| Active Storage - Blobs | /rails/active_storage/blobs/redirect/:signed_id/*filename | GET | Blob のサービスURLへリダイレクト |
| Active Storage - Blobs | /rails/active_storage/blobs/proxy/:signed_id/*filename | GET | Blob をプロキシ経由で配信 |
| Active Storage - Representations | /rails/active_storage/representations/redirect/:signed_blob_id/:variation_key/*filename | GET | 画像バリエーションのサービスURLへリダイレクト |
| Active Storage - Representations | /rails/active_storage/representations/proxy/:signed_blob_id/:variation_key/*filename | GET | 画像バリエーションをプロキシ経由で配信 |
| Active Storage - Disk | /rails/active_storage/disk/:encoded_key/*filename | GET | Disk サービスからファイル取得 |
| Active Storage - Disk | /rails/active_storage/disk/:encoded_token | PUT | Disk サービスへファイルアップロード |
| Active Storage - Direct Uploads | /rails/active_storage/direct_uploads | POST | ダイレクトアップロード用の Blob 作成 |
| Action Mailbox - Postmark | /rails/action_mailbox/postmark/inbound_emails | POST | Postmark からのメール受信 |
| Action Mailbox - Relay | /rails/action_mailbox/relay/inbound_emails | POST | SMTP リレーからのメール受信 |
| Action Mailbox - SendGrid | /rails/action_mailbox/sendgrid/inbound_emails | POST | SendGrid からのメール受信 |
| Action Mailbox - Mandrill | /rails/action_mailbox/mandrill/inbound_emails | GET | Mandrill ヘルスチェック |
| Action Mailbox - Mandrill | /rails/action_mailbox/mandrill/inbound_emails | POST | Mandrill からのメール受信 |
| Action Mailbox - Mailgun | /rails/action_mailbox/mailgun/inbound_emails/mime | POST | Mailgun からのメール受信 |
| Conductor | /rails/conductor/action_mailbox/inbound_emails | GET | 受信メール一覧（開発用） |
| Conductor | /rails/conductor/action_mailbox/inbound_emails | POST | テストメール作成（開発用） |
| Conductor | /rails/conductor/action_mailbox/inbound_emails/:id | GET | 受信メール詳細（開発用） |
| Conductor | /rails/conductor/action_mailbox/inbound_emails/sources/new | GET | ソースからのメール作成フォーム（開発用） |
| Conductor | /rails/conductor/action_mailbox/inbound_emails/sources | POST | ソースからメール作成（開発用） |
| Conductor | /rails/conductor/action_mailbox/:inbound_email_id/reroute | POST | メールの再ルーティング（開発用） |
| Conductor | /rails/conductor/action_mailbox/:inbound_email_id/incinerate | POST | メールの削除（開発用） |

## 各APIエンドポイント定義

### Active Storage - Blobs

#### 1. Blob リダイレクト取得

Blob の署名付きIDを受け取り、ストレージサービスの一時URLへリダイレクトします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `GET /rails/active_storage/blobs/redirect/:signed_id/*filename` |
| 認証 | 署名付きID（signed_id）による検証 |
| 権限 | URLの署名が有効であること |

**パスパラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| signed_id | string | ○ | Blob の署名付きID |
| filename | string | ○ | ファイル名（URLの一部として使用） |

**クエリパラメータ**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| disposition | string | - | inline | ダウンロード時の disposition（inline / attachment） |

**レスポンス（成功時）**

ステータスコード: `302 Found`

ストレージサービスの一時URLへリダイレクト。レスポンスヘッダーに `Location` が含まれます。

**レスポンス（エラー時）**

ステータスコード: `404 Not Found`

署名が無効な場合、または Blob が存在しない場合。

---

#### 2. Blob プロキシ取得

Blob をアプリケーションサーバー経由でプロキシ配信します。リダイレクトを避けたい場合やキャッシュを有効にしたい場合に使用します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `GET /rails/active_storage/blobs/proxy/:signed_id/*filename` |
| 認証 | 署名付きID（signed_id）による検証 |
| 権限 | URLの署名が有効であること |

**パスパラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| signed_id | string | ○ | Blob の署名付きID |
| filename | string | ○ | ファイル名 |

**クエリパラメータ**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| disposition | string | - | inline | ダウンロード時の disposition |

**レスポンス（成功時）**

ステータスコード: `200 OK`

レスポンスヘッダー:
- `Accept-Ranges: bytes`
- `Content-Length: {byte_size}`
- `Content-Type: {content_type}`
- `Cache-Control: max-age=3155695200, public`

レスポンスボディ: ファイルのバイナリデータ（ストリーミング）

**Range リクエスト対応**

`Range` ヘッダーが指定された場合、部分コンテンツ（206 Partial Content）として応答します。

**レスポンス（エラー時）**

ステータスコード: `404 Not Found`

---

### Active Storage - Representations

#### 3. Representation リダイレクト取得

画像の変換バリエーション（サムネイル等）のサービスURLへリダイレクトします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `GET /rails/active_storage/representations/redirect/:signed_blob_id/:variation_key/*filename` |
| 認証 | 署名付きID（signed_blob_id）による検証 |
| 権限 | URLの署名が有効であること |

**パスパラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| signed_blob_id | string | ○ | 元画像 Blob の署名付きID |
| variation_key | string | ○ | 変換パラメータのキー |
| filename | string | ○ | ファイル名 |

**クエリパラメータ**

| パラメータ名 | 型 | 必須 | デフォルト | 説明 |
| --- | --- | --- | --- | --- |
| disposition | string | - | inline | ダウンロード時の disposition |

**レスポンス（成功時）**

ステータスコード: `302 Found`

変換済み画像のサービスURLへリダイレクト。

**レスポンス（エラー時）**

ステータスコード: `404 Not Found`

---

#### 4. Representation プロキシ取得

画像の変換バリエーションをプロキシ経由で配信します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `GET /rails/active_storage/representations/proxy/:signed_blob_id/:variation_key/*filename` |
| 認証 | 署名付きID（signed_blob_id）による検証 |
| 権限 | URLの署名が有効であること |

**パスパラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| signed_blob_id | string | ○ | 元画像 Blob の署名付きID |
| variation_key | string | ○ | 変換パラメータのキー |
| filename | string | ○ | ファイル名 |

**レスポンス（成功時）**

ステータスコード: `200 OK`

レスポンスヘッダー:
- `Cache-Control: max-age=3155695200, public`

レスポンスボディ: 変換済み画像のバイナリデータ

---

### Active Storage - Disk Service

#### 5. Disk ファイル取得

Disk サービスに保存されたファイルを取得します。署名付きエンコードキーによる認証が必要です。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `GET /rails/active_storage/disk/:encoded_key/*filename` |
| 認証 | エンコードされた署名付きキー |
| 権限 | 署名が有効であること |

**パスパラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| encoded_key | string | ○ | 署名付きエンコードキー（service_name, key, content_type, disposition を含む） |
| filename | string | ○ | ファイル名 |

**レスポンス（成功時）**

ステータスコード: `200 OK`

ファイルのバイナリデータ。

**レスポンス（エラー時）**

ステータスコード: `404 Not Found`

署名が無効、またはファイルが存在しない場合。

---

#### 6. Disk ファイルアップロード

Disk サービスへファイルをアップロードします。ダイレクトアップロードの一部として使用されます。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `PUT /rails/active_storage/disk/:encoded_token` |
| 認証 | エンコードされた署名付きトークン |
| 権限 | 署名が有効であること |

**パスパラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| encoded_token | string | ○ | 署名付きトークン（service_name, key, content_type, content_length, checksum を含む） |

**リクエストボディ**

アップロードするファイルのバイナリデータ。

**リクエストヘッダー**

| ヘッダー名 | 必須 | 説明 |
| --- | --- | --- |
| Content-Type | ○ | トークンに含まれる content_type と一致すること |
| Content-Length | ○ | トークンに含まれる content_length と一致すること |

**レスポンス（成功時）**

ステータスコード: `204 No Content`

**レスポンス（エラー時）**

| ステータスコード | 説明 |
| --- | --- |
| 404 Not Found | トークンが無効 |
| 422 Unprocessable Entity | Content-Type/Content-Length 不一致、またはチェックサム不一致 |

---

### Active Storage - Direct Uploads

#### 7. ダイレクトアップロード Blob 作成

クライアントサイドからの直接アップロードに先立ち、サーバー側で Blob レコードを作成します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `POST /rails/active_storage/direct_uploads` |
| 認証 | CSRF トークン（Rails のフォーム認証） |
| 権限 | アプリケーション依存 |

**リクエストボディ**

```json
{
  "blob": {
    "filename": "example.pdf",
    "byte_size": 1024000,
    "checksum": "GQ5SuexOyOXUTg==",
    "content_type": "application/pdf",
    "metadata": {
      "custom_key": "custom_value"
    }
  }
}
```

| フィールド名 | 型 | 必須 | バリデーション | 説明 |
| --- | --- | --- | --- | --- |
| blob[filename] | string | ○ | - | ファイル名 |
| blob[byte_size] | integer | ○ | - | ファイルサイズ（バイト） |
| blob[checksum] | string | ○ | - | ファイルの MD5 チェックサム（Base64エンコード） |
| blob[content_type] | string | - | - | コンテンツタイプ |
| blob[metadata] | object | - | - | カスタムメタデータ |

**レスポンス（成功時）**

ステータスコード: `200 OK`

```json
{
  "id": 1,
  "key": "xtapjjcjiudrlk3tmwyjgpuobabd",
  "filename": "example.pdf",
  "content_type": "application/pdf",
  "byte_size": 1024000,
  "checksum": "GQ5SuexOyOXUTg==",
  "created_at": "2024-01-15T10:30:00.000Z",
  "signed_id": "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--...",
  "direct_upload": {
    "url": "https://storage.example.com/upload/...",
    "headers": {
      "Content-Type": "application/pdf",
      "Content-MD5": "GQ5SuexOyOXUTg=="
    }
  }
}
```

**レスポンス（エラー時）**

ステータスコード: `422 Unprocessable Entity`

バリデーションエラーの場合。

---

### Action Mailbox - Postmark Ingress

#### 8. Postmark メール受信

Postmark からの Webhook を受け取り、受信メールを処理します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `POST /rails/action_mailbox/postmark/inbound_emails` |
| 認証 | HTTP Basic認証（ユーザー名: actionmailbox） |
| 権限 | config.action_mailbox.ingress = :postmark が設定されていること |

**リクエストボディ**

```json
{
  "RawEmail": "RFC 822形式の生メールデータ",
  "OriginalRecipient": "recipient@example.com"
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| RawEmail | string | ○ | RFC 822形式の生メールデータ |
| OriginalRecipient | string | - | 元の受信者アドレス |

**レスポンス（成功時）**

ステータスコード: `204 No Content`

**レスポンス（エラー時）**

| ステータスコード | 説明 |
| --- | --- |
| 401 Unauthorized | Basic認証失敗 |
| 404 Not Found | ingress が postmark に設定されていない |
| 422 Unprocessable Entity | RawEmail パラメータが不足 |
| 500 Server Error | パスワード未設定、DB/Storage/Job 設定不正 |

---

### Action Mailbox - Relay Ingress

#### 9. SMTP リレーメール受信

SMTP サーバーからリレーされたメールを受信します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `POST /rails/action_mailbox/relay/inbound_emails` |
| 認証 | HTTP Basic認証（ユーザー名: actionmailbox） |
| 権限 | config.action_mailbox.ingress = :relay が設定されていること |

**リクエストヘッダー**

| ヘッダー名 | 必須 | 説明 |
| --- | --- | --- |
| Content-Type | ○ | message/rfc822 |
| Authorization | ○ | Basic認証ヘッダー |

**リクエストボディ**

RFC 822形式の生メールデータ（バイナリ）

**レスポンス（成功時）**

ステータスコード: `204 No Content`

**レスポンス（エラー時）**

| ステータスコード | 説明 |
| --- | --- |
| 401 Unauthorized | Basic認証失敗 |
| 404 Not Found | ingress が relay に設定されていない |
| 415 Unsupported Media Type | Content-Type が message/rfc822 でない |
| 422 Unprocessable Entity | リクエストボディが空 |
| 500 Server Error | パスワード未設定、設定不正 |

---

### Action Mailbox - SendGrid Ingress

#### 10. SendGrid メール受信

SendGrid Inbound Parse からの Webhook を受け取ります。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `POST /rails/action_mailbox/sendgrid/inbound_emails` |
| 認証 | HTTP Basic認証（ユーザー名: actionmailbox） |
| 権限 | config.action_mailbox.ingress = :sendgrid が設定されていること |

**リクエストボディ**

```json
{
  "email": "RFC 822形式の生メールデータ",
  "envelope": "{\"to\":[\"recipient@example.com\"]}"
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| email | string | ○ | RFC 822形式の生メールデータ |
| envelope | string (JSON) | - | 受信者情報を含むJSON文字列 |

**レスポンス（成功時）**

ステータスコード: `204 No Content`

**レスポンス（エラー時）**

| ステータスコード | 説明 |
| --- | --- |
| 401 Unauthorized | Basic認証失敗 |
| 404 Not Found | ingress が sendgrid に設定されていない |
| 422 Unprocessable Entity | email パラメータ不足、またはJSONパースエラー |

---

### Action Mailbox - Mandrill Ingress

#### 11. Mandrill ヘルスチェック

Mandrill が Webhook URL の存在確認のために送信する HEAD/GET リクエストに応答します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `GET /rails/action_mailbox/mandrill/inbound_emails` |
| 認証 | なし |
| 権限 | なし |

**レスポンス（成功時）**

ステータスコード: `200 OK`

---

#### 12. Mandrill メール受信

Mandrill からの Webhook を受け取ります。署名検証により認証を行います。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `POST /rails/action_mailbox/mandrill/inbound_emails` |
| 認証 | HMAC-SHA1 署名検証（X-Mandrill-Signature ヘッダー） |
| 権限 | config.action_mailbox.ingress = :mandrill が設定されていること |

**リクエストヘッダー**

| ヘッダー名 | 必須 | 説明 |
| --- | --- | --- |
| X-Mandrill-Signature | ○ | HMAC-SHA1署名（Base64エンコード） |

**リクエストボディ**

```json
{
  "mandrill_events": "[{\"event\":\"inbound\",\"msg\":{\"raw_msg\":\"RFC 822形式のメール\"}}]"
}
```

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mandrill_events | string (JSON array) | ○ | イベント配列のJSON文字列 |

**レスポンス（成功時）**

ステータスコード: `200 OK`

**レスポンス（エラー時）**

| ステータスコード | 説明 |
| --- | --- |
| 401 Unauthorized | 署名検証失敗 |
| 404 Not Found | ingress が mandrill に設定されていない |
| 422 Unprocessable Entity | パラメータ不足またはJSONパースエラー |
| 500 Server Error | Mandrill API キー未設定 |

---

### Action Mailbox - Mailgun Ingress

#### 13. Mailgun メール受信

Mailgun からの Webhook を受け取ります。タイムスタンプとトークンによる署名検証を行います。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `POST /rails/action_mailbox/mailgun/inbound_emails/mime` |
| 認証 | HMAC-SHA256 署名検証（timestamp + token） |
| 権限 | config.action_mailbox.ingress = :mailgun が設定されていること |

**リクエストボディ**

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| body-mime | string | ○ | RFC 822形式の生メールデータ |
| timestamp | string | ○ | UNIXタイムスタンプ（秒） |
| token | string | ○ | ランダム生成された50文字のトークン |
| signature | string | ○ | HMAC-SHA256署名（16進数） |
| recipient | string | - | 元の受信者アドレス |

**レスポンス（成功時）**

ステータスコード: `204 No Content`

**レスポンス（エラー時）**

| ステータスコード | 説明 |
| --- | --- |
| 401 Unauthorized | 署名検証失敗、またはタイムスタンプが2分以上古い |
| 404 Not Found | ingress が mailgun に設定されていない |
| 422 Unprocessable Entity | 必須パラメータ不足 |
| 500 Server Error | Mailgun Signing key 未設定 |

---

### Conductor（開発用）

#### 14. 受信メール一覧

開発環境で受信したメールの一覧を表示します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `GET /rails/conductor/action_mailbox/inbound_emails` |
| 認証 | なし（開発環境専用） |
| 権限 | なし |

**レスポンス（成功時）**

ステータスコード: `200 OK`

HTML ページ（受信メール一覧）

---

#### 15. テストメール作成フォーム

テスト用のメールを作成するフォームを表示します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `GET /rails/conductor/action_mailbox/inbound_emails/new` |
| 認証 | なし |
| 権限 | なし |

---

#### 16. テストメール作成

フォームから送信されたデータでテストメールを作成します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `POST /rails/conductor/action_mailbox/inbound_emails` |
| 認証 | なし |
| 権限 | なし |

**リクエストボディ**

```json
{
  "mail": {
    "from": "sender@example.com",
    "to": "recipient@example.com",
    "cc": "cc@example.com",
    "bcc": "bcc@example.com",
    "x_original_to": "original@example.com",
    "in_reply_to": "<message-id@example.com>",
    "subject": "Test Subject",
    "body": "Test body content",
    "attachments": ["(multipart file data)"]
  }
}
```

**レスポンス（成功時）**

ステータスコード: `302 Found`

作成されたメールの詳細ページへリダイレクト。

---

#### 17. 受信メール詳細

指定したIDの受信メール詳細を表示します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `GET /rails/conductor/action_mailbox/inbound_emails/:id` |
| 認証 | なし |
| 権限 | なし |

**パスパラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| id | integer | ○ | InboundEmail の ID |

---

#### 18. ソースからのメール作成フォーム

生のメールソースからメールを作成するフォームを表示します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `GET /rails/conductor/action_mailbox/inbound_emails/sources/new` |
| 認証 | なし |
| 権限 | なし |

---

#### 19. ソースからメール作成

RFC 822形式の生データからメールを作成します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `POST /rails/conductor/action_mailbox/inbound_emails/sources` |
| 認証 | なし |
| 権限 | なし |

**リクエストボディ**

| フィールド名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| source | string | ○ | RFC 822形式の生メールデータ |

---

#### 20. メール再ルーティング

処理済みまたは処理失敗したメールを再度ルーティングします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `POST /rails/conductor/action_mailbox/:inbound_email_id/reroute` |
| 認証 | なし |
| 権限 | なし |

**パスパラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| inbound_email_id | integer | ○ | InboundEmail の ID |

---

#### 21. メール削除（焼却）

指定したメールを完全に削除（焼却）します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| エンドポイント | `POST /rails/conductor/action_mailbox/:inbound_email_id/incinerate` |
| 認証 | なし |
| 権限 | なし |

**パスパラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| inbound_email_id | integer | ○ | InboundEmail の ID |

---

## 備考

### Active Storage について

- Active Storage のコントローラーはデフォルトで公開アクセス可能です
- 署名付きURLは推測困難ですが、永続的な設計です
- より高いセキュリティが必要な場合は、独自の認証付きコントローラーの実装を検討してください
- `ActiveStorage.routes_prefix` で URL プレフィックスをカスタマイズ可能です
- `ActiveStorage.draw_routes` を false に設定するとルーティングを無効化できます

### Action Mailbox について

- 各 ingress は `config.action_mailbox.ingress` の設定と一致する必要があります
- 一致しない場合は 404 Not Found が返されます
- パスワードは `credentials` または環境変数 `RAILS_INBOUND_EMAIL_PASSWORD` で設定します
- HTTPS の使用を強く推奨します（Basic認証のパスワードが平文で送信されるため）

### Conductor について

- 開発環境でのテスト・デバッグ専用のインターフェースです
- 本番環境では使用しないでください
- 認証機能は実装されていません
