# email-api — Internal Email Sending Service

Internal only. Reachable at `http://email-api:8080` within `myai-network`. Not exposed to the internet.

## Responsibilities

- Accepts `POST /api/email/send` requests from internal services (`api`, `cv-search-job`)
- Wraps the provided HTML body fragment in a branded HTML shell (blue header, white card, grey footer)
- Sends the email via SMTP using MailKit
- Attaches files from the shared `Files` volume when `AttachmentPath` is provided
- Protected by `X-Internal-Api-Key` via `UseInternalApiKeyProtection()`

## Key route

| Method | Route | Description |
|--------|-------|-------------|
| POST | `/api/email/send` | Send an HTML email. Returns 204 No Content. |

## Request body (`SendEmailRequest`)

| Field | Required | Notes |
|-------|----------|-------|
| `To` | ✅ | List of recipient addresses |
| `ReplyTo` | ❌ | Optional reply-to address |
| `Subject` | ✅ | Plain text (service prepends `[ENV_NAME]`) |
| `HtmlBody` | ✅ | HTML fragment — wrapped in branded shell by this service |
| `AttachmentPath` | ❌ | Path relative to `FileStorage:Path`, e.g. `"{cvDocumentId}.pdf"` |

## Consumers

- `api` — via `IEmailApiClient` Refit interface (contact, subscribe, file-download, match emails)
- `cv-search-job` — via `IEmailApiClient` Refit interface (job search results email)

## Settings

| Section | Env var | Notes |
|---------|---------|-------|
| `Smtp` | `Smtp__Host`, `Smtp__Username`, `Smtp__Password`, etc. | SMTP server config — only configured here, not in consumers |
| `FileStorage` | `FileStorage__Path` | Must match the shared `Files` volume mount path |
| `InternalApi` | `EmailApi__InternalApiKey` | API key enforced on every request |
