All of this is read by Settings in app/core/config.py, from .env locally or from Codespaces secrets anywhere else — see Using This Template for why secrets don’t belong in .env. Postgres variables have their own page: Database Setup.
Which encryption the provider expects — check their docs, don’t guess
EMAILS_FROM_EMAIL
Must be a sender address your provider has verified
If SMTP_HOST or EMAILS_FROM_EMAIL is blank, the app quietly disables email — password reset just won’t send anything, no error. That’s usually the first thing to check if “forgot password” seems broken.
Recommended: Zoho ZeptoMail — you’re already in the Zoho ecosystem, and it’s built for exactly this (transactional email, not marketing sends):
Variable
Value
SMTP_HOST
smtp.zeptomail.com (or .in / .eu depending on your account’s region)
SMTP_PORT
587
SMTP_TLS
True
SMTP_USER
emailapikey (literal string, not your Zoho login)
SMTP_PASSWORD
The Send Mail Token from your ZeptoMail Mail Agent’s SMTP settings
Paid-tier alternative: Resend — nicer dashboard and deliverability tooling if you outgrow ZeptoMail’s free tier:
Variable
Value
SMTP_HOST
smtp.resend.com
SMTP_PORT
587
SMTP_TLS
True
SMTP_USER
resend (literal string)
SMTP_PASSWORD
Your Resend API key
Either way, EMAILS_FROM_EMAIL has to be an address on a domain you’ve verified with that provider — an unverified sender gets silently dropped or bounced.