diff --git a/bin/evening_detective_server b/bin/evening_detective_server index 27d46a4..2839c95 100755 Binary files a/bin/evening_detective_server and b/bin/evening_detective_server differ diff --git a/internal/services/users_service/emails.go b/internal/services/users_service/emails.go index 75e76ca..f386b6a 100644 --- a/internal/services/users_service/emails.go +++ b/internal/services/users_service/emails.go @@ -50,8 +50,8 @@ func welcomeHTML(username, email, password, loginURL string) string { if loginURL != "" { content.WriteString(buttonHTML(loginURL, "Войти в игру")) } - content.WriteString("

Если ты не регистрировался — просто проигнорируй это письмо.

") - return wrapHTML(content.String()) + content.WriteString("

Если ты не регистрировался — просто проигнорируй это письмо.

") + return wrapHTML(content.String(), loginURL) } // resetPlain возвращает текстовую версию письма о сбросе пароля. @@ -89,8 +89,8 @@ func resetHTML(username, email, password, loginURL string) string { content.WriteString(buttonHTML(loginURL, "Войти в игру")) } content.WriteString("

Никому не сообщай пароль и не пересылай это письмо.

\n") - content.WriteString("

Если это был не ты — ответь на это письмо: мы поможем защитить аккаунт.

") - return wrapHTML(content.String()) + content.WriteString("

Если это был не ты — ответь на это письмо: мы поможем защитить аккаунт.

") + return wrapHTML(content.String(), loginURL) } // greeting возвращает приветствие с именем пользователя; при пустом имени — @@ -106,11 +106,11 @@ func greeting(username string) string { // credentialsBlockHTML — блок «Логин / Пароль» в табличной вёрстке, // совместимой с Gmail. func credentialsBlockHTML(email, password string) string { - return ` - - - - + return `
Логин
` + html.EscapeString(email) + `
Пароль
` + html.EscapeString(password) + `
+ + + +
Логин
` + html.EscapeString(email) + `
Пароль
` + html.EscapeString(password) + `
` } @@ -118,39 +118,43 @@ func credentialsBlockHTML(email, password string) string { func buttonHTML(link, label string) string { return ` -
-` + html.EscapeString(label) + ` + +` + html.EscapeString(label) + `
` } // wrapHTML — каркас письма: тёмная шапка с названием сервиса, контент, -// подвал с дисклеймером. Только табличная вёрстка и inline-стили: внешние -// таблицы стилей Gmail вырезает. -func wrapHTML(content string) string { +// подвал. Основное оформление — inline; при блокировке текстур и шрифта +// остаются фон bisque и системный шрифт. +func wrapHTML(content, baseURL string) string { return ` +
- +
- - - @@ -162,6 +166,14 @@ func wrapHTML(content string) string { ` } +// Статические копии игровых текстур и шрифта находятся в public/email фронтенда. +func emailAssetURL(baseURL, filename string) string { + if baseURL == "" { + return "" + } + return html.EscapeString(strings.TrimRight(baseURL, "/") + "/email/" + filename) +} + // sanitizeLine убирает переносы строк из пользовательского ввода, // вставляемого в тело письма (защита от инъекции строк в DATA-фазу SMTP). func sanitizeLine(s string) string {
-ВЕЧЕРНИЙ ДЕТЕКТИВ + +ВЕЧЕРНИЙ ДЕТЕКТИВ
+ ` + content + `
+ Это автоматическое письмо сервиса «Вечерний детектив».
Если ты получил его по ошибке — просто ответь на это письмо.