Set up transactional mail
Transactional mail carries email verification, password resets, teammate invitations, contact requests, and routine notices. A self-hosted deployment sends those messages through Resend or Lettermint when the mail driver and sender are configured together.
Configure Resend
- In Resend, create an API key that can send from the domain you will use.
- Verify the sender domain in Resend.
- Set these values in the backend environment or the
.envfile used by your deployment:
MAIL_DRIVER=resend
RESEND_MAIL_API_KEY=re_your_resend_api_key
MAIL_FROM_EMAIL=notifications@example.com
MAIL_FROM_NAME="Acme Support"- Restart the backend and worker with the same values.
- Invite a test teammate from Members, or request a password reset, and confirm the message reaches the mailbox.
MAIL_FROM_EMAIL is the verified sender address. MAIL_FROM_NAME defaults to Radioso when omitted. The worker also needs this mail configuration because it delivers contact and operator notices.
Configure Lettermint
- In your Lettermint team, add and verify the domain of
MAIL_FROM_EMAIL; Lettermint delivers live mail only from a verified domain. - In your Lettermint project, copy the project token (
lm_...) — it sends from the project’s default route. - Set these values in the backend environment or the
.envfile used by your deployment:
MAIL_DRIVER=lettermint
LETTERMINT_PROJECT_TOKEN=lm_your_project_token
MAIL_FROM_EMAIL=notifications@example.com
MAIL_FROM_NAME="Acme Support"- Restart the backend and worker with the same values.
- Invite a test teammate from Members, or request a password reset, and confirm the message reaches the mailbox.
Lettermint’s Free plan covers transactional mail with a fixed monthly message limit and no overage: once the limit is reached, Lettermint refuses further messages until the next month, so password resets and invitations stop with it. Check the team’s monthly volume against the plan before switching a deployment over.
Transactional mail only ever sends, so it reads LETTERMINT_PROJECT_TOKEN alone — the team token the email channel uses to read and manage inbound mail is a separate, channel-only setting.
Choose the driver deliberately
The transactional-mail driver accepts four values:
MAIL_DRIVER | Use it for | Delivery result |
|---|---|---|
resend | A deployment that sends mail through Resend’s API | Resend accepts the message for delivery |
lettermint | A deployment that sends mail through Lettermint’s API | Lettermint accepts the message for delivery |
log | Local inspection of outbound messages | The backend writes the message to its log |
noop | Tests or an environment that discards outbound messages | The backend records an undispatched result |
The repository’s .env.example sets MAIL_DRIVER=log. That value writes verification, reset, and invitation messages to the backend log for local inspection. Set MAIL_DRIVER=resend or MAIL_DRIVER=lettermint before testing a real invite or notice. Leaving MAIL_DRIVER unset picks Resend whenever RESEND_MAIL_API_KEY is set, and Lettermint when LETTERMINT_PROJECT_TOKEN is the only key, so adding Lettermint credentials to a Resend deployment changes nothing until MAIL_DRIVER=lettermint names it.
The Resend driver reads RESEND_MAIL_API_KEY; the Lettermint driver reads LETTERMINT_PROJECT_TOKEN. Both read MAIL_FROM_EMAIL and MAIL_FROM_NAME. Each delivers over its own HTTPS API; SMTP host, port, username, and password settings are outside this mail configuration surface.
Verify the sender and diagnose delivery
Send a teammate invitation from Members. The invitation dialog reports Emailed to when the provider accepts it and keeps a backup acceptance URL either way. The API reports the same fact as emailDelivered.
When the provider rejects a message, inspect the sender domain (Resend) or the project token’s permissions (Lettermint) first. When the driver is log or noop, the delivery result stays undispatched by design. Contact and routine notices also appear in the conversation and operator activity, so the Inbox still shows the work that needs a person.
Common failure modes
- The backend fails at startup with
RESEND_MAIL_API_KEY is required when MAIL_DRIVER is resend, or the equivalentLETTERMINT_PROJECT_TOKENerror. Add the key to the backend and worker environment. - Invitation delivery reports a failure. Check the verified sender address and provider key, then share the dialog’s acceptance URL with the teammate.
- Confirm the worker has the same
MAIL_DRIVER, key, and sender settings as the backend before testing a routine hand-off. - Use the provider API settings above for transactional mail; this driver reads no SMTP configuration values.
Read next
- Invite your team — send and recover a teammate invitation.
- Make your agent act — deliver routine hand-offs to your team.
- Deployment — place mail settings with the rest of the production configuration.