From 735dfb6980bbbec02715df86414f4d53d2c1c0ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Pons?= Date: Tue, 22 Apr 2025 09:28:48 +0200 Subject: [PATCH] Fix mail sending --- server/api/auth/register.post.ts | 3 +- server/api/auth/request-reset.post.ts | 3 +- server/api/auth/reset.post.ts | 3 +- server/api/users/[id]/revalidate.post.ts | 3 +- server/tasks/mail.ts | 90 +++++++++++------------- 5 files changed, 50 insertions(+), 52 deletions(-) diff --git a/server/api/auth/register.post.ts b/server/api/auth/register.post.ts index 61fd4cb..ec65bbd 100644 --- a/server/api/auth/register.post.ts +++ b/server/api/auth/register.post.ts @@ -5,6 +5,7 @@ import { usersDataTable, usersTable } from '~/db/schema'; import { schema } from '~/schemas/registration'; import { checkSession, logSession } from '~/server/utils/user'; import type { UserSession, UserSessionRequired } from '~/types/auth'; +import sendMail from '~/server/tasks/mail'; interface SuccessHandler { @@ -82,7 +83,7 @@ export default defineEventHandler(async (e): Promise => { id: emailId, timestamp, } }); - await runTask('mail', { + await sendMail({ payload: { type: 'mail', to: [body.data.email], diff --git a/server/api/auth/request-reset.post.ts b/server/api/auth/request-reset.post.ts index 16c3ee7..7b0f069 100644 --- a/server/api/auth/request-reset.post.ts +++ b/server/api/auth/request-reset.post.ts @@ -3,6 +3,7 @@ import { eq, or } from 'drizzle-orm'; import { z } from 'zod'; import useDatabase from '~/composables/useDatabase'; import { usersTable } from '~/db/schema'; +import sendMail from '~/server/tasks/mail'; const schema = z.object({ profile: z.string(), @@ -32,7 +33,7 @@ export default defineEventHandler(async (e) => { id, timestamp, } }); - await runTask('mail', { + await sendMail({ payload: { type: 'mail', data: { diff --git a/server/api/auth/reset.post.ts b/server/api/auth/reset.post.ts index 2938a85..bef46cb 100644 --- a/server/api/auth/reset.post.ts +++ b/server/api/auth/reset.post.ts @@ -5,6 +5,7 @@ import { usersDataTable, usersTable } from '~/db/schema'; import { schema } from '~/schemas/registration'; import { checkSession, logSession } from '~/server/utils/user'; import type { UserSession, UserSessionRequired } from '~/types/auth'; +import sendMail from '~/server/tasks/mail'; interface SuccessHandler { @@ -73,7 +74,7 @@ export default defineEventHandler(async (e): Promise => { logSession(e, await setUserSession(e, { user: { id: id.id, username: body.data.username, email: body.data.email, state: 0, signin: new Date(), permissions: [], lastTimestamp: new Date(), logCount: 1 } }) as UserSessionRequired); - await runTask('mail', { + await sendMail({ payload: { type: 'mail', to: [body.data.email], diff --git a/server/api/users/[id]/revalidate.post.ts b/server/api/users/[id]/revalidate.post.ts index 51586fb..7fbcf0d 100644 --- a/server/api/users/[id]/revalidate.post.ts +++ b/server/api/users/[id]/revalidate.post.ts @@ -2,6 +2,7 @@ import { hash } from "bun"; import { eq } from "drizzle-orm"; import useDatabase from "~/composables/useDatabase"; import { usersTable } from "~/db/schema"; +import sendMail from '~/server/tasks/mail'; export default defineEventHandler(async (e) => { const session = await getUserSession(e); @@ -56,7 +57,7 @@ export default defineEventHandler(async (e) => { id: emailId, timestamp, } }); - await runTask('mail', { + await sendMail({ payload: { type: 'mail', to: [data.email], diff --git a/server/tasks/mail.ts b/server/tasks/mail.ts index c203f59..16df364 100644 --- a/server/tasks/mail.ts +++ b/server/tasks/mail.ts @@ -41,56 +41,50 @@ const transport = nodemailer.createTransport({ }, }); -export default defineTask({ - meta: { - name: 'mail', - description: 'Send email', - }, - async run(e) { - try { - if(e.payload.type !== 'mail') - { - throw new Error(`Données inconnues`); - } - - const payload = e.payload as MailPayload; - const template = templates[payload.template]; - - if(!template) - { - throw new Error(`Modèle de mail ${payload.template} inconnu`); - } - - console.time('Generating HTML'); - const mail: Mail.Options = { - from: 'd[any] - Ne pas répondre ', - to: payload.to, - html: await render(template.component, payload.data), - subject: template.subject, - textEncoding: 'quoted-printable', - }; - console.timeEnd('Generating HTML'); - - if(mail.html === '') - return { result: false, error: new Error("Invalid content") }; - - console.time('Sending Mail'); - const status = await transport.sendMail(mail); - console.timeEnd('Sending Mail'); - - if(status.rejected.length > 0) - { - return { result: false, error: status.response, details: status.rejectedErrors }; - } - - return { result: true }; - } - catch(e) +export default async function(e: TaskEvent) { + try { + if(e.payload.type !== 'mail') { - return { result: false, error: e }; + throw new Error(`Données inconnues`); } - }, -}) + + const payload = e.payload as MailPayload; + const template = templates[payload.template]; + + if(!template) + { + throw new Error(`Modèle de mail ${payload.template} inconnu`); + } + + console.time('Generating HTML'); + const mail: Mail.Options = { + from: 'd[any] - Ne pas répondre ', + to: payload.to, + html: await render(template.component, payload.data), + subject: template.subject, + textEncoding: 'quoted-printable', + }; + console.timeEnd('Generating HTML'); + + if(mail.html === '') + return { result: false, error: new Error("Invalid content") }; + + console.time('Sending Mail'); + const status = await transport.sendMail(mail); + console.timeEnd('Sending Mail'); + + if(status.rejected.length > 0) + { + return { result: false, error: status.response, details: status.rejectedErrors }; + } + + return { result: true }; + } + catch(e) + { + return { result: false, error: e }; + } +} async function render(component: any, data: Record): Promise {