# Task 014 — Email Sending Engine

## Objective

Build internal SMTP sending for campaigns with queue, per-recipient records, and error handling.

## Scope

- SMTP client using env vars
- `campaign_sends` model and send job processor
- Personalization from template + recipient data
- `POST /api/campaigns/:id/send` and scheduled job runner
- Throttling and retry policy

**Out of scope:** Open/click tracking (Task 017).

## Requirements

1. Requires SMTP env vars; clear error if missing.
2. Updates campaign status to `sending` then `sent`.
3. Logs SMTP `Message-ID` on each send.
4. Failed sends recorded with reason.

## Files to create or modify

| Path | Action |
|------|--------|
| `src/services/email-send.service.ts` | Create |
| `src/lib/smtp.ts` | Create |
| `src/jobs/campaign-send.job.ts` | Create |
| `docs/05-email-system.md` | Outbound details |
| `docs/02-database-schema.md` | campaign_sends |
| `docs/16-changelog.md` | Entry |

## Acceptance criteria

- [ ] Test campaign sends to internal test addresses
- [ ] Send records visible on campaign detail
- [ ] Partial failure does not corrupt completed sends

## Documentation updates required

- `docs/05-email-system.md`
- `docs/02-database-schema.md`
- `docs/10-environment-variables.md` (if new vars)
- `docs/16-changelog.md`
