Files
RenewCMS/docs/design/emails.md
T

3.0 KiB

Emails

Go html/template files, ready to replace internal/infrastructure/mailer/templates/:

  • source/emails/verification.html uses {{.Host}} and {{.VerificationCode}}, linking to {{.Host}}/register/validate?c={{.VerificationCode}}.

  • source/emails/password-reset.html uses {{.Host}}, {{.VerificationCode}} and {{.Email}}, linking to {{.Host}}/register/reset/validate?c={{.VerificationCode}}&email={{.Email}}.

  • source/emails/invitation.html uses {{.Host}}, {{.VerificationCode}}, {{.Email}} and {{.InvitedBy}}, linking to {{.Host}}/invite/accept?c={{.VerificationCode}}. {{.Email}} is the invited address, shown in the body only. {{.InvitedBy}} is the inviter's display name, or their username when they have none. The subject is "{{.InvitedBy}} invited you to RenewCMS". The invite expires in 3 days and works once.

Previews: source/RenewCMS Emails.dc.html.

Transactional emails

Three Go html/template files: emails/verification.html, emails/password-reset.html and emails/invitation.html . They use a table layout with inline CSS and a 600 px maximum width. The button is bulletproof: a colored table cell plus a padded link, so it survives Outlook. Each has a plain-URL fallback, a hidden preheader, and prefers-color-scheme overrides for clients that support them. The mark is live text in a black cell rather than an image, so it shows even when images are blocked. Previews below use example values.

Suggested subjects are "Verify your RenewCMS account", "Reset your RenewCMS password" and " invited you to RenewCMS", where .InvitedBy is the inviter's display name or username. html/template escapes the .Email value for the query string in the reset link (the @ becomes %40), and the confirm route reads it back decoded.

Account emails (change email, deletion, export)

Go html/template files built from source/emails/verification.html (same table layout, tokens, dark overrides, bulletproof button, URL fallback). English only.

File To Subject Variables
source/emails/verify-new-email.html the new address Confirm your new RenewCMS email address .Host, .Username, .VerificationCode, linking to {{.Host}}/account/email/confirm?c={{.VerificationCode}} (expires in 2 hours, works once)
source/emails/email-change-notice.html the old address, at request time Your RenewCMS email address change was requested .Host, .Username, .NewEmail, linking to {{.Host}}/profile
source/emails/account-deleted.html the address the account had, sent once Your RenewCMS account has been deleted .Host, .Username, .DeletedAt; no button, generic text, no personal data
source/emails/export-ready.html the account address, async flow only Your RenewCMS data export is ready .Host, .Username, .VerificationCode, linking to {{.Host}}/account/export/{{.VerificationCode}} (expires in 24 hours, requires a logged-in session)

export-ready.html is only needed if the async export alternative is built. Previews are rows on source/RenewCMS Emails.dc.html.