Skip to content

Email ​

ReleaseDesk sends mail for member invitations, tester invitations, tester magic links, build notifications and tester feedback alerts (to org owners, admins and developers). Messages go through a persistent outbox (email_outbox) and are retried by a background job, so a mail outage never fails the request that triggered it.

Transports ​

Set RD_MAIL_TRANSPORT to one of:

ValueBehaviourExtra variables
logDefault. Writes messages to the server log (or RD_MAIL_LOG_DIR). Nothing is delivered.RD_MAIL_LOG_DIR (optional)
smtpAny SMTP server.RD_SMTP_HOST, RD_SMTP_PORT, RD_SMTP_USER, RD_SMTP_PASS, RD_SMTP_SECURE
resendResend HTTP API.RD_RESEND_API_KEY
postmarkPostmark HTTP API.RD_POSTMARK_TOKEN

RD_MAIL_FROM sets the sender (default ReleaseDesk <noreply@localhost>); use an address on a domain you have verified with the provider. Tester and invite links use RD_BASE_URL, so it must be the public URL.

RD_MAX_TESTERS_PER_ORG caps the number of testers per organization.

Verifying ​

Settings > Email (admins) shows the active transport and sends a test message to your own address. Via API: GET /api/v1/orgs/:orgId/email/status, POST /api/v1/orgs/:orgId/email/test.

Tester distribution from CI ​

rdesk distribute --release <id> --group "Internal QA" [--group Beta] [--notes "Try the new login"] [--no-notify]

Groups are matched by name or ID. The distribution API currently requires a developer dashboard session, so an API token alone cannot run this CLI operation.

Templates ​

Settings > Email lets admins override subject, heading, body and button label for member invitations, tester invitations and build notifications. Each template has its own page (Settings > Email > template) with a syntax-highlighted HTML body editor and live preview. Bodies are HTML, from a fragment up to a complete document (<html>, <style>, tables, inline styles, http(s) images). Fragments are wrapped in the default layout (heading and button); a full document, or a body using a button or URL placeholder, is sent as written. Body placeholders include heading, buttonLabel, url, and button (the ready-made button), each wrapped in double curly braces. Output is sanitized: scripts, iframes, forms, event handlers, @import, and non-http(s)/mailto/tel links or non-http(s)/cid image and CSS URLs are removed. A plain-text alternative is generated automatically. Unknown placeholders are rejected on save, values are HTML-escaped, and Reset restores the built-in default. The tester sign-in link is not customizable.

API: GET /api/v1/orgs/:orgId/email/templates, PUT|DELETE .../templates/:key, POST .../templates/:key/preview (admin).

API reference ​

All routes start with /api/v1/orgs/:orgId/email and require an admin dashboard session. API tokens are not accepted.

Method and suffixSuccessResponse or input
GET /status200 JSONtransport, configured, from
POST /test202 JSONQueues a test email to the signed-in user's address; { "queued": true }
GET /templates200 JSON{ "items": [...] } with built-in and custom content
PUT /templates/:key204Save a complete template content object
DELETE /templates/:key204Reset to the built-in template
POST /templates/:key/preview200 JSONRender supplied content as subject, html, text
POST /templates/:key/test202 JSONQueue a rendered test to the signed-in user's address

Template keys are member_invite, tester_invite, and build_available. The JSON content object requires subject, heading, body, and buttonLabel. subject, heading, and buttonLabel must be nonempty single lines; body may contain up to 100,000 characters. Preview and test accept the same content as PUT. The two test routes require a signed-in user with an email address; otherwise they return 403.