OpenSend docs
Receiving Overview
Receiving is the OpenSend area for inbound email rows that OpenSend stores for a verified domain.
The current product surface includes a dashboard entry point, received-email read APIs, attachment metadata, short-lived attachment URLs, receiving routes, automatic forwarding rules, hosted SES receipt-rule provisioning, and standalone ingester endpoints for provider-to-Postgres MIME ingestion.
What is implemented
- Tenant-scoped API reads for
/emails/receivingand/emails/receiving/{id}. - Attachment listing and presigned attachment URL responses.
- Domain-level receiving controls in the dashboard UI.
- First-class receiving routes for exact addresses, aliases, and catch-all fallback on verified receiving domains.
- Automatic forwarding rules with persisted queued, skipped, and failed attempt visibility.
- Hosted SES receipt-rule provisioning when receiving is enabled for a domain.
- Standalone ingester MIME ingestion through
POST /events/inbound, including route resolution, attachment storage, provider-event idempotency, terminal failure records, and an internal durablereceivedevent after commit. - SES receipt-rule ingestion through
POST /events/inbound/ses-s3, where SNS points OpenSend at a raw MIME object saved by SES in S3. - Hosted quota accounting and
email.receivedwebhook delivery rows after inbound commit.
What must be configured
- MX records that route inbound messages to the SES inbound endpoint shown in the dashboard.
- Hosted deployments must set
SES_INBOUND_SNS_TOPIC_ARNandS3_BUCKET_NAMEorSES_INBOUND_BUCKET_NAMEso OpenSend can create SES receipt rules automatically. - The inbound SNS topic must subscribe to the ingester
/events/inbound/ses-s3endpoint, and SES must be allowed to write raw MIME objects to the configured bucket. - Deployment-specific authentication for provider callbacks. Production ingesters require
INGESTER_INBOUND_TOKENon inbound MIME callbacks, and provider-side network controls are still recommended.
Recommended setup order
- Verify the sending domain first so ownership and tenant mapping are clear.
- Enable receiving in the dashboard; hosted OpenSend provisions the SES receipt rule for the domain.
- Add the shown MX record only after deciding whether the root domain or a dedicated subdomain should receive mail.
- Keep raw MIME and attachments in a private bucket. For SES, set
SES_INBOUND_BUCKET_NAMEor reuseS3_BUCKET_NAMEso the ingester only reads expected receipt-rule objects. - Resolve route decisions with exact-address, alias, catch-all, then unrouteable precedence.
- Read messages through the tenant API rather than handing mailbox credentials to apps or agents.