# Copy to .env.docker and edit, then `docker compose up -d --build`: # cp .env.docker.example .env.docker # # Loaded by docker-compose.yml (env_file). Commented lines fall back to the # image defaults (see docs/self-hosting.md for the full reference). # ===== Basics ===== # Public URL behind a reverse proxy: password-reset links, the JMAP session # and inbound webhooks all use it. #APP_URL=https://mail.example.com # ===== Inbound mail: pick one (both can be on at once) ===== # Built-in SMTP listener (default). Uncomment the "25:25" port mapping in # docker-compose.yml, point the domain's MX at this host, and set # MAIL_HOSTNAME to that host's name. #SMTP_INBOUND_PORT=25 #MAIL_HOSTNAME=mail.example.com # Cloudflare Email Routing relay: keep MX on Cloudflare and deploy the Worker # in deploy/cloudflare-email-relay. Disables the built-in listener. #SMTP_INBOUND_PORT=0 # Shared HMAC secret; must match the relay Worker's INBOUND_WEBHOOK_SECRET # (npx wrangler secret put INBOUND_WEBHOOK_SECRET). #INBOUND_WEBHOOK_SECRET=change-me-to-a-long-random-string # ===== Outbound mail: at least one ===== # Any SMTP relay (host, Amazon SES, Postmark, Mailgun, your own Postfix): #SMTP_URL=smtps://user:pass@smtp.example.com:465 # Cloudflare Email Sending: the zone must have Email Sending enabled. #CF_ACCOUNT_ID= #CF_TOKEN= # ===== Optional ===== # Zone management: with zone + Email Routing permissions, adding a domain in # the app configures Email Routing and the sending subdomain automatically. #CF_TOKEN= # Resend / SES fallback credentials. Values saved on the domain page win. #RESEND_API_KEY= #AWS_ACCESS_KEY_ID= #AWS_SECRET_ACCESS_KEY= #AWS_REGION= # Bot protection on login and reset forms (site key at build time via # NEXT_PUBLIC_TURNSTILE_SITE_KEY). #TURNSTILE_SECRET_KEY= # Email assistant (OpenAI-compatible API). #AI_BASE_URL= #AI_API_KEY= #AI_MODEL=gpt-4o-mini