Invite a friend; handle field shows the domain; system mail fixes

- Invitations: each user can invite two friends by email (sign-up works
  through the link even while registration is closed); admin-editable
  template, subject and sender.
- Invitation sender defaults to the system-mail From address, which the
  SMTP account is allowed to send as (was postmaster@APP_DOMAIN, refused
  with 553 when the two differ).
- Sign-in, sign-up and forgot-password fields show the fixed
  @domain after the typed name; the registration status reports it.
- System mail gets a Date header; the invitation's plain-text part keeps
  its paragraphs and line breaks.
- SMTP EHLO uses SMTP_HELO_NAME / APP_DOMAIN, not the container name.
- DNS recommendations for the mail domains.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-15 19:34:31 +02:00
co-authored by Claude Opus 5.5
parent addb2232a1
commit 463f96ad57
30 changed files with 1870 additions and 42 deletions
+35
View File
@@ -24,6 +24,7 @@ export const en = {
"auth.registerTitle": "Create account",
"auth.handle": "Handle",
"auth.handlePlaceholder": "e.g. alice",
"auth.localpartPlaceholder": "alice",
"auth.handleHint": "3–30 chars: a–z, 0–9, . _ -",
"auth.password": "Password",
"auth.passwordHint": "at least 8 characters",
@@ -511,6 +512,29 @@ export const en = {
"admin.registrationOff": "Closed",
"admin.registrationHelp":
"While closed, the signup page is hidden and the server refuses new accounts.",
"admin.invitations": "Allow invitations",
"admin.invitationsOn": "On",
"admin.invitationsOff": "Off",
"admin.invitationsHelp":
"Each user can invite 2 friends from the sidebar. An invitation link signs up one person, even while registration is closed, and expires after 14 days (unused ones are given back).",
"admin.inviteMail": "Invitation email",
"admin.inviteConfigure": "Configure…",
"admin.inviteMailHelp":
"Sent through the Outgoing system mail account (on the right of the panel), which must be allowed to send from the sender address. Replies go to the user who sent the invitation.",
"admin.inviteFrom": "Sender address",
"admin.inviteFromHint": "Empty: the placeholder address shown.",
"admin.inviteSubject": "Subject",
"admin.inviteTemplateDefault": "Using the built-in template.",
"admin.inviteTemplateCustom": "Using your uploaded template.",
"admin.inviteUpload": "Upload HTML template…",
"admin.inviteDownload": "Download template",
"admin.inviteReset": "Back to the built-in template",
"admin.inviteResetConfirm": "Remove your template and use the built-in one again?",
"admin.invitePlaceholders": "Placeholders:",
"admin.invitePlaceholdersHelp":
"The template must contain {{invite_link}} or {{invite_button}}. The subject can use the names too. Images written into the HTML are sent inside the email.",
"admin.invitePreview": "Preview with sample names —",
"admin.inviteTestSent": "Test invitation sent (its link is a dummy).",
"admin.defaultQuota": "Default quota for new users",
"admin.quotaHelp":
"Applies to accounts created from now on. Existing mailboxes keep the quota they were given.",
@@ -658,6 +682,17 @@ export const en = {
"Waiting for your browser's permission. If it didn't ask, click the icon at the left of the address bar and set Notifications to Allow — they turn on by themselves then.",
"push.failed": "Couldn't turn notifications on.",
"install.entry": "Install app",
"invite.entry": "Invite a friend",
"invite.title": "Invite a friend",
"invite.help": "We'll email them a link to create an account. You have {count} invitations left; each link works once.",
"invite.help_one": "We'll email them a link to create an account. This is your last invitation; the link works once.",
"invite.name": "Friend's name",
"invite.email": "Friend's email address",
"invite.send": "Send invitation",
"invite.sending": "Sending…",
"invite.sent": "Invitation sent to {name}",
"invite.welcome": "Hi {name} — {inviter} invited you. Choose your address and password.",
"invite.linkInvalid": "This invitation has already been used or has expired.",
"install.title": "Install Ultimo",
"install.stepsIos":
"1. Tap the Share button (the square with an arrow) in Safari's toolbar.\n2. Choose Add to Home Screen.\n3. Tap Add. Ultimo opens from your Home Screen like an app, and can show notifications about new mail.",