Skip to main content

Mail Configuration

All configuration is by environment variable. See .env.example for the full set.

Core

SMTP and IMAP

Sending

Security and tracking

Leave TRUST_PROXY_HOPS at 0 unless the service genuinely sits behind that many proxies β€” trusting more hops than exist lets a client spoof its IP past the tracking rate limit.

Webhooks

Multiple subscriptions live in a webhook_subscriptions table, each with its own URL, HMAC secret, and event filters supporting wildcards ("*", "flow.*", or exact names). Subscriptions can be scoped to a tenant. The legacy environment variables below seed a default subscription on first start. Events emitted:
  • Transactional β€” message.sent, message.failed, message.bounced, inbox.received
  • Marketing lifecycle β€” campaign.started, campaign.finished, profile.subscribed, profile.unsubscribed, message.opened, message.clicked, flow.run.started, flow.run.completed
Payloads are enriched with context: inbox.received carries the conversation, mailbox, domain, and tenant plus attachment metadata; bounce events carry the recipient; engagement events carry recipient and campaign.
Webhook targets are SSRF-guarded β€” validated at create time, re-resolved before each send, with loopback, private, link-local, and metadata addresses refused and redirects disabled.

Inbound adapters

Managed domains and conversations

Observability

Bulk import limits

POST /v1/profiles/bulk (JSON array), POST /v1/profiles/import (CSV body), and POST /v1/lists/:id/members/bulk are each capped at 1000 records per request.