diff --git a/src/lib/email.ts b/src/lib/email.ts index 24295f6..9f29caa 100644 --- a/src/lib/email.ts +++ b/src/lib/email.ts @@ -6,35 +6,84 @@ function getResend() { const FROM = process.env.EMAIL_FROM ?? "noreply@mailsend.second-brain.ru"; const BASE_URL = process.env.BETTER_AUTH_URL ?? "https://school.second-brain.ru"; +// ── HTML template (inline styles for maximum email client compatibility) ─────── + function base(content: string) { return ` - + - + + + Second Brain - -
-

Second Brain · Образовательная платформа

-
${content}
- -
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+

Second Brain · Образовательная платформа

+
+ ${content} +
+

Это автоматическое письмо, не отвечайте на него.

+
+ + +
+ `; } +// Reusable inline styles +const p = `style="margin:0 0 14px;font-family:'Courier New',Courier,monospace;font-size:14px;line-height:1.65;color:#323232;"`; +const pLast = `style="margin:0;font-family:'Courier New',Courier,monospace;font-size:14px;line-height:1.65;color:#323232;"`; + +function btn(href: string, label: string) { + return ` + + + +
+ ${label} → +
`; +} + +function quote(text: string) { + return ` + + + +
+

${text.replace(/\n/g, "
")}

+
`; +} + // ── Email senders ───────────────────────────────────────────────────────────── export async function sendCourseAccessEmail(to: string, name: string, courseTitle: string) { @@ -43,10 +92,10 @@ export async function sendCourseAccessEmail(to: string, name: string, courseTitl to, subject: `Вам открыт доступ к курсу «${courseTitle}»`, html: base(` -

Привет, ${name}!

-

Вам открыт доступ к курсу «${courseTitle}».

-

Перейдите на платформу чтобы начать обучение:

- Перейти к курсам → +

Привет, ${name}!

+

Вам открыт доступ к курсу «${courseTitle}».

+

Перейдите на платформу чтобы начать обучение:

+ ${btn(`${BASE_URL}/dashboard`, "Перейти к курсам")} `), }).catch((e) => console.error("[email] sendCourseAccessEmail:", e)); } @@ -63,10 +112,10 @@ export async function sendHomeworkSubmittedEmail( to, subject: `Новая работа на проверку — ${lessonTitle}`, html: base(` -

Привет, ${curatorName}!

-

Студент ${studentName} сдал работу по уроку «${lessonTitle}».

-

Откройте работу чтобы проверить и оставить фидбек:

- Проверить работу → +

Привет, ${curatorName}!

+

Студент ${studentName} сдал работу по уроку «${lessonTitle}».

+

Откройте работу чтобы проверить и оставить фидбек:

+ ${btn(`${BASE_URL}/curator/homework/${submissionId}`, "Проверить работу")} `), }).catch((e) => console.error("[email] sendHomeworkSubmittedEmail:", e)); } @@ -83,13 +132,11 @@ export async function sendFeedbackReceivedEmail( to, subject: `Получен фидбек по уроку «${lessonTitle}»`, html: base(` -

Привет, ${studentName}!

-

Куратор проверил вашу работу по уроку «${lessonTitle}» и оставил обратную связь:

-
- ${feedbackText.replace(/\n/g, "
")} -
-

Вернитесь к уроку чтобы увидеть полный фидбек:

- Открыть урок → +

Привет, ${studentName}!

+

Куратор проверил вашу работу по уроку «${lessonTitle}» и оставил обратную связь:

+ ${quote(feedbackText)} +

Вернитесь к уроку чтобы увидеть полный фидбек:

+ ${btn(lessonUrl, "Открыть урок")} `), }).catch((e) => console.error("[email] sendFeedbackReceivedEmail:", e)); } @@ -100,10 +147,25 @@ export async function sendWelcomeEmail(to: string, name: string) { to, subject: "Добро пожаловать в Second Brain", html: base(` -

Привет, ${name}!

-

Ваш аккаунт на образовательной платформе Second Brain подтверждён.

-

После того как администратор откроет вам доступ к курсу, вы получите письмо и сможете начать обучение.

- Перейти на платформу → +

Привет, ${name}!

+

Ваш аккаунт на образовательной платформе Second Brain подтверждён.

+

После того как администратор откроет вам доступ к курсу, вы получите письмо и сможете начать обучение.

+ ${btn(`${BASE_URL}/dashboard`, "Перейти на платформу")} `), }).catch((e) => console.error("[email] sendWelcomeEmail:", e)); } + +export async function sendTestEmail(to: string) { + await getResend().emails.send({ + from: FROM, + to, + subject: "Тест — Second Brain LMS", + html: base(` +

Привет!

+

Это тестовое письмо от платформы Second Brain LMS.

+

Так будут выглядеть все уведомления — доступ к курсу, фидбек по ДЗ и другие.

+

Если письмо отображается корректно, значит email-уведомления настроены и работают.

+ ${btn(`${BASE_URL}/dashboard`, "Открыть платформу")} + `), + }).catch((e) => console.error("[email] sendTestEmail:", e)); +}