# Plan: Bypass Messenger Queue for Example/Test Emails

## Context
All emails sent via `MailerInterface::send()` get routed through the Symfony Messenger queue (`messenger_messages` table, config at `docroot/app/config/config.php:99`). With 31k+ campaign emails in the queue, test/example emails wait hours to be delivered. Test emails should send instantly.

## Root Cause
`MailHelper::send()` (line 394) calls `$this->mailer->send($this->message)` which uses `MailerInterface`. Symfony's messenger routing routes ALL `SendEmailMessage` to the `email` transport (doctrine queue).

## Key Finding
`MailHelper` already has `$this->transport` (line 63, set at line 248) which is the actual SES `TransportInterface` extracted via reflection. Calling `$this->transport->send()` sends directly via SES, bypassing messenger. This pattern is already used in `AjaxController::sendTestEmailAction()` (line 184).

## Implementation — 1 file to modify

**File:** `docroot/app/bundles/EmailBundle/Helper/MailHelper.php`

### Change 1: Add `$directSend` property (near line 63)
```php
protected bool $directSend = false;
```

### Change 2: Set flag in `getSampleMailer()` (lines 289-292)
Set `$this->directSend = true` so example emails use the transport directly.

### Change 3: Use transport directly when `$directSend` is true (lines 392-396)
In `send()`, check `$this->directSend`:
- **true** -> `$this->transport->send($this->message, $this->message->getEnvelope())` (direct SES, no queue)
- **false** -> `$this->mailer->send($this->message)` (existing behavior, goes through queue)
Reset `$this->directSend = false` after use.

### Change 4: Reset flag in `reset()` (line ~600)
Add `$this->directSend = false;` in the always-reset block.

## Why campaign emails are NOT affected
- Campaign emails call `getMailer()` which does NOT set `directSend = true`
- `directSend` defaults to `false` -> `send()` uses `$this->mailer->send()` -> messenger queue (unchanged)
- Only `getSampleMailer()` sets the flag -> only "Send Example" button uses direct send
- Flag resets in `reset()` so it can't leak between calls

## Verification
1. `php -l MailHelper.php` -- syntax check
2. Cache clear: `/opt/cpanel/ea-php82/root/usr/bin/php bin/console cache:clear --env=prod`
3. Send example email from UI -- should arrive instantly
4. Confirm campaign emails still queue normally
