diff --git a/bin/evening_detective_server b/bin/evening_detective_server index f2f8cc8..27d46a4 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 dd53a9a..75e76ca 100644 --- a/internal/services/users_service/emails.go +++ b/internal/services/users_service/emails.go @@ -6,15 +6,7 @@ import ( "strings" ) -// Шаблоны писем сервиса. Структура по базе знаний копирайтера (email.md): -// приветствие → контекст («почему это письмо») → ценность (данные для входа) -// → CTA → подпись → P.S. Письма транзакционные, но по форме — «человек -// человеку»: Gmail и другие почтовики агрессивнее фильтруют короткие -// «роботные» письма без структуры. -// -// Каждое письмо формируется в двух версиях: text/plain (для старых клиентов -// и фильтров) и text/html (для отображения); sender собирает их в -// multipart/alternative. +// Письма содержат текстовую и HTML-версию; sender собирает multipart/alternative. const ( // welcomeSubject — тема письма о регистрации: конкретика без КАПСА и @@ -58,7 +50,7 @@ func welcomeHTML(username, email, password, loginURL string) string { if loginURL != "" { content.WriteString(buttonHTML(loginURL, "Войти в игру")) } - content.WriteString("

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

") + content.WriteString("

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

") return wrapHTML(content.String()) } @@ -97,7 +89,7 @@ func resetHTML(username, email, password, loginURL string) string { content.WriteString(buttonHTML(loginURL, "Войти в игру")) } content.WriteString("

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

\n") - content.WriteString("

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

") + content.WriteString("

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

") return wrapHTML(content.String()) } @@ -114,25 +106,20 @@ 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) + `
` } -// buttonHTML — CTA-кнопка табличной вёрсткой (Gmail не поддерживает -// margin/padding на , поэтому отступы — на ячейке ). +// buttonHTML — кнопка входа с inline-стилями и табличным фоном. func buttonHTML(link, label string) string { return ` -
-` + html.EscapeString(label) + ` + +` + html.EscapeString(label) + `
` @@ -148,22 +135,22 @@ func wrapHTML(content string) string { - - + +
- +
- - -
-ВЕЧЕРНИЙ ДЕТЕКТИВ + +ВЕЧЕРНИЙ ДЕТЕКТИВ
+ ` + content + `
+ Это автоматическое письмо сервиса «Вечерний детектив».
Если ты получил его по ошибке — просто ответь на это письмо.