Fix mail sending
This commit is contained in:
parent
7beeed8a61
commit
735dfb6980
|
|
@ -5,6 +5,7 @@ import { usersDataTable, usersTable } from '~/db/schema';
|
||||||
import { schema } from '~/schemas/registration';
|
import { schema } from '~/schemas/registration';
|
||||||
import { checkSession, logSession } from '~/server/utils/user';
|
import { checkSession, logSession } from '~/server/utils/user';
|
||||||
import type { UserSession, UserSessionRequired } from '~/types/auth';
|
import type { UserSession, UserSessionRequired } from '~/types/auth';
|
||||||
|
import sendMail from '~/server/tasks/mail';
|
||||||
|
|
||||||
interface SuccessHandler
|
interface SuccessHandler
|
||||||
{
|
{
|
||||||
|
|
@ -82,7 +83,7 @@ export default defineEventHandler(async (e): Promise<Return> => {
|
||||||
id: emailId, timestamp,
|
id: emailId, timestamp,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
await runTask('mail', {
|
await sendMail({
|
||||||
payload: {
|
payload: {
|
||||||
type: 'mail',
|
type: 'mail',
|
||||||
to: [body.data.email],
|
to: [body.data.email],
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import { eq, or } from 'drizzle-orm';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import useDatabase from '~/composables/useDatabase';
|
import useDatabase from '~/composables/useDatabase';
|
||||||
import { usersTable } from '~/db/schema';
|
import { usersTable } from '~/db/schema';
|
||||||
|
import sendMail from '~/server/tasks/mail';
|
||||||
|
|
||||||
const schema = z.object({
|
const schema = z.object({
|
||||||
profile: z.string(),
|
profile: z.string(),
|
||||||
|
|
@ -32,7 +33,7 @@ export default defineEventHandler(async (e) => {
|
||||||
id, timestamp,
|
id, timestamp,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
await runTask('mail', {
|
await sendMail({
|
||||||
payload: {
|
payload: {
|
||||||
type: 'mail',
|
type: 'mail',
|
||||||
data: {
|
data: {
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import { usersDataTable, usersTable } from '~/db/schema';
|
||||||
import { schema } from '~/schemas/registration';
|
import { schema } from '~/schemas/registration';
|
||||||
import { checkSession, logSession } from '~/server/utils/user';
|
import { checkSession, logSession } from '~/server/utils/user';
|
||||||
import type { UserSession, UserSessionRequired } from '~/types/auth';
|
import type { UserSession, UserSessionRequired } from '~/types/auth';
|
||||||
|
import sendMail from '~/server/tasks/mail';
|
||||||
|
|
||||||
interface SuccessHandler
|
interface SuccessHandler
|
||||||
{
|
{
|
||||||
|
|
@ -73,7 +74,7 @@ export default defineEventHandler(async (e): Promise<Return> => {
|
||||||
|
|
||||||
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);
|
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: {
|
payload: {
|
||||||
type: 'mail',
|
type: 'mail',
|
||||||
to: [body.data.email],
|
to: [body.data.email],
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import { hash } from "bun";
|
||||||
import { eq } from "drizzle-orm";
|
import { eq } from "drizzle-orm";
|
||||||
import useDatabase from "~/composables/useDatabase";
|
import useDatabase from "~/composables/useDatabase";
|
||||||
import { usersTable } from "~/db/schema";
|
import { usersTable } from "~/db/schema";
|
||||||
|
import sendMail from '~/server/tasks/mail';
|
||||||
|
|
||||||
export default defineEventHandler(async (e) => {
|
export default defineEventHandler(async (e) => {
|
||||||
const session = await getUserSession(e);
|
const session = await getUserSession(e);
|
||||||
|
|
@ -56,7 +57,7 @@ export default defineEventHandler(async (e) => {
|
||||||
id: emailId, timestamp,
|
id: emailId, timestamp,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
await runTask('mail', {
|
await sendMail({
|
||||||
payload: {
|
payload: {
|
||||||
type: 'mail',
|
type: 'mail',
|
||||||
to: [data.email],
|
to: [data.email],
|
||||||
|
|
|
||||||
|
|
@ -41,56 +41,50 @@ const transport = nodemailer.createTransport({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default defineTask({
|
export default async function(e: TaskEvent) {
|
||||||
meta: {
|
try {
|
||||||
name: 'mail',
|
if(e.payload.type !== '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 <no-reply@peaceultime.com>',
|
|
||||||
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 };
|
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 <no-reply@peaceultime.com>',
|
||||||
|
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<string, any>): Promise<string>
|
async function render(component: any, data: Record<string, any>): Promise<string>
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue