SES Troubleshooting
Diagnose common SES, outbox, webhook, and worker issues.
SES Troubleshooting
Emails Do Not Send
Check the driver:
php bin/console debug:container Vortos\\Ses\\Contract\\MailerInterfaceThen confirm env:
VORTOS_MAILER_DRIVER=ses
AWS_SES_REGION=us-east-1
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
SES_FROM_ADDRESS=no-reply@example.comIf the driver is log, email is intentionally written to logs. If the driver is null, email is intentionally dropped for tests.
MailerInterface Throws Outside Transaction
This is expected for the transactional path. Call it from a command handler through the command bus, or inject:
StandaloneMailerInterfacefor standalone async outbox writes.ImmediateMailerInterfacefor direct provider calls.
Outbox Rows Are Pending Forever
Check:
- Is
aws-ses-outbox-relayinstalled in supervisor? - Is the worker container running?
- Does
php bin/console vortos:ses:outbox:relay --onceprocess rows? - Are provider credentials valid inside the worker container?
- Is the SES account throttling the worker?
Provider Says Address Is Not Verified
The account is likely in SES sandbox or the sender identity is not verified in that region. Verify the domain or email identity and request production access from AWS.
Bounces Do Not Update Local Suppression
Check:
- SNS topic is attached to the SES identity or configuration set.
- SNS subscription is confirmed.
- Webhook URL is reachable over HTTPS.
webhooks()->enabled(true).- Route path matches AWS.
- Signature verification succeeds.
- A bounce or complaint handler is registered.
Rate Limit Errors
Run:
php bin/console vortos:ses:quotaThen lower:
$config->rateLimit()->maxSendRate(10)->burst(10);Increase only after SES quota is raised and worker metrics are stable.
Duplicate Emails
Outbox delivery is at-least-once. Handlers and providers can fail after a side effect. Use business-level idempotency where duplicate notification would be harmful, and include stable metadata such as a domain event ID.
Attachments Fail Or Memory Spikes
Email attachments are held in memory as encoded MIME content. Keep attachments small. For large files, store the file in object storage and send a temporary download link.