Appearance
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:
| Value | Behaviour | Extra variables |
|---|---|---|
log | Default. Writes messages to the server log (or RD_MAIL_LOG_DIR). Nothing is delivered. | RD_MAIL_LOG_DIR (optional) |
smtp | Any SMTP server. | RD_SMTP_HOST, RD_SMTP_PORT, RD_SMTP_USER, RD_SMTP_PASS, RD_SMTP_SECURE |
resend | Resend HTTP API. | RD_RESEND_API_KEY |
postmark | Postmark 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 suffix | Success | Response or input |
|---|---|---|
GET /status | 200 JSON | transport, configured, from |
POST /test | 202 JSON | Queues a test email to the signed-in user's address; { "queued": true } |
GET /templates | 200 JSON | { "items": [...] } with built-in and custom content |
PUT /templates/:key | 204 | Save a complete template content object |
DELETE /templates/:key | 204 | Reset to the built-in template |
POST /templates/:key/preview | 200 JSON | Render supplied content as subject, html, text |
POST /templates/:key/test | 202 JSON | Queue 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.