Configure a mail provider for workspace invitations, email verification, password resets, and notifications. Use a sender address the provider is authorized to send as.
Provider selection
There is no provider-selection flag. Every configured, usable provider participates in this fallback order:
Resend → AWS SES → SMTP → Azure Communication Services → Gmail
The first provider handles normal traffic. Later providers are tried only after a failure. Configure a single provider or verify the sender and permissions for every fallback you enable.
Shared settings
Configure a provider
Verify your sending domain and add Resend's DNS records before production delivery. See Resend domain setup.
Credentials use the AWS default provider chain: environment/shared configuration, ECS/EKS roles, EC2 instance profile, or SSO. For EKS, an IRSA role can provide ses:SendEmail and ses:SendRawEmail without static keys. Verify your sending identity and configure DKIM in the chosen SES region.
Use a reachable relay such as Postfix, SendGrid, Mailgun, Google Workspace SMTP relay, or a local test relay:
Set both SMTP_USER and SMTP_PASS for authenticated relays, or omit both for an unauthenticated relay. Port 465 enables implicit TLS automatically. Leave SMTP_SECURE unset for port 587/STARTTLS; forcing implicit TLS there prevents connection. Port 25 uses a non-implicit-TLS connection.
Sim derives its EHLO hostname from NEXT_PUBLIC_APP_URL. If the relay needs another identity, set SMTP_EHLO_NAME to a fully qualified hostname it accepts.
For a Google Workspace IP-authorized relay:
Configure the relay in Workspace administration to accept the deployment's public egress IP and permitted senders. This path does not require a service-account key or domain-wide delegation. If a stable IP is unavailable, consider authenticated SMTP or the Gmail API path. See Google SMTP relay settings.
Provision an Email Communication Service, verify its sending domain, and link that domain to the Communication Service. Use a sender from the linked domain. See Azure's email-domain connection guide.
Use a service account to impersonate a Google Workspace sender:
- Enable Gmail API in the Google Cloud project.
- Create a service account, enable domain-wide delegation, and download its JSON key.
- In Workspace administration, open Security → Access and data control → API controls → Domain-wide delegation → Add new. Add the service account's numeric
client_idwithhttps://www.googleapis.com/auth/gmail.send. - Set
GMAIL_SENDERto the Workspace user to impersonate. See Google service-account credentials.
Paid Workspace accounts currently allow up to 2,000 messages per user over a rolling 24-hour period, with lower trial and separate recipient limits. Check Google's sending limits before choosing this path for your volume. SMTP relay has separate limits.
For a single-line JSON secret:
Apply configuration
For Compose, save provider settings in .env beside the Compose file and recreate the app:
For a source checkout, save them in apps/sim/.env and restart the app.
Kubernetes
Choose one of the chart's secret strategies:
- Inline mode: set credentials under
app.env; Helm writes them to a Secret but also retains them in release values. Do not commit secret values to Git. - Existing Secret: add the provider keys to the pre-created app Secret. Credentials set explicitly under
app.envin this mode are inlined into pod specs. - ESO: map each credential under
externalSecrets.remoteRefs.app; the chart-managed inline Secret is disabled. Useapp.envDefaultsfor non-secret sender settings.
For example, merge this into a complete ESO configuration whose store and core secrets are already configured:
Restart the affected app pods after the credentials have synchronized:
Verify delivery
Invite a test member from workspace settings, confirm the message arrives, and accept it. If verification is required, also test a new account's verification message and a password reset.
Set LOG_LEVEL=INFO and restart/recreate the app before using logs to diagnose skipped delivery. The production default is ERROR; log-level values are uppercase.
For Compose, use docker compose -f docker-compose.prod.yml logs simstudio.