package mailer import "fmt" // ── Email templates ─────────────────────────────────────────────────────────── // Simple inline templates. No embed.FS needed at this stage. // VerifyEmailHTML returns the HTML body for an email verification message. func VerifyEmailHTML(fqdn, token, username string) string { link := fmt.Sprintf("https://%s/verify?token=%s", fqdn, token) return fmt.Sprintf(`

E-Mail-Adresse bestätigen

Hallo %s,

Bitte bestätige deine E-Mail-Adresse, um deinen archivmail-Account zu aktivieren.

E-Mail bestätigen

Der Link ist 24 Stunden gültig.
Falls du dich nicht registriert hast, kannst du diese E-Mail ignorieren.

%s

`, username, link, link) } // VerifyEmailText returns the plain-text body for email verification. func VerifyEmailText(fqdn, token, username string) string { link := fmt.Sprintf("https://%s/verify?token=%s", fqdn, token) return fmt.Sprintf("Hallo %s,\n\nbitte bestätige deine E-Mail-Adresse:\n\n%s\n\nDer Link ist 24 Stunden gültig.\n\narcivmail", username, link) } // ResetPasswordHTML returns the HTML body for a password-reset message. func ResetPasswordHTML(fqdn, token, username string) string { link := fmt.Sprintf("https://%s/reset-password?token=%s", fqdn, token) return fmt.Sprintf(`

Passwort zurücksetzen

Hallo %s,

Du hast eine Passwort-Reset-Anfrage gestellt. Klicke auf den Link, um ein neues Passwort zu setzen.

Passwort zurücksetzen

Der Link ist 1 Stunde gültig und kann nur einmal verwendet werden.
Falls du kein Passwort zurücksetzen wolltest, ignoriere diese E-Mail.

%s

`, username, link, link) } // ResetPasswordText returns the plain-text body for password reset. func ResetPasswordText(fqdn, token, username string) string { link := fmt.Sprintf("https://%s/reset-password?token=%s", fqdn, token) return fmt.Sprintf("Hallo %s,\n\nPasswort zurücksetzen:\n\n%s\n\nDer Link ist 1 Stunde gültig.\n\narcivmail", username, link) } // AlreadyRegisteredHTML returns the HTML body sent when a duplicate signup is attempted. // Prevents email enumeration by always sending an email on any signup attempt. func AlreadyRegisteredHTML(fqdn string) string { return fmt.Sprintf(`

Registrierungsversuch

Es wurde versucht, einen neuen Account mit dieser E-Mail-Adresse zu erstellen.

Diese Adresse ist bereits bei archivmail registriert.

Falls du dein Passwort vergessen hast: Passwort zurücksetzen

Falls du diesen Versuch nicht ausgelöst hast, kannst du diese E-Mail ignorieren.

`, fqdn) } // AlreadyRegisteredText returns the plain-text body for duplicate signup. func AlreadyRegisteredText(fqdn string) string { return fmt.Sprintf("Diese E-Mail-Adresse ist bereits bei archivmail registriert.\n\nPasswort vergessen? https://%s/forgot-password\n\nFalls du diesen Versuch nicht ausgelöst hast, ignoriere diese E-Mail.", fqdn) } // InviteHTML returns the HTML body for a tenant invitation. func InviteHTML(fqdn, token, tenantName string) string { link := fmt.Sprintf("https://%s/signup?invite=%s", fqdn, token) return fmt.Sprintf(`

Einladung zu %s

Du wurdest eingeladen, dem archivmail-System beizutreten.

Einladung annehmen

Der Link ist 72 Stunden gültig und kann nur einmal verwendet werden.

%s

`, tenantName, link, link) } // InviteText returns the plain-text body for a tenant invitation. func InviteText(fqdn, token, tenantName string) string { link := fmt.Sprintf("https://%s/signup?invite=%s", fqdn, token) return fmt.Sprintf("Einladung zu %s:\n\n%s\n\nDer Link ist 72 Stunden gültig.\n\narcivmail", tenantName, link) }