Files
portabase/src/lib/email/email-helper.ts
T

105 lines
2.4 KiB
TypeScript
Raw Normal View History

2025-05-16 15:54:17 +02:00
"use server";
2025-11-22 17:20:52 +01:00
import {db} from "@/db";
import {eq} from "drizzle-orm";
import nodemailer from "nodemailer";
2025-07-16 12:36:11 +02:00
import * as drizzleDb from "@/db";
type Payload = {
to: string;
2025-11-22 17:20:52 +01:00
from?: string;
subject: string;
2025-05-16 15:54:17 +02:00
html: any;
};
type Server = {
host: string;
port: number;
user: string;
pass: string;
from: string;
};
type EmailCustomProps = {
data: Payload;
server: Server;
};
type EmailMassProps = {
data: Payload;
servers: Server[];
};
export const sendEmail = async (data: Payload) => {
2025-05-16 15:54:17 +02:00
const settings = await db
.select()
2025-07-16 12:36:11 +02:00
.from(drizzleDb.schemas.setting)
.where(eq(drizzleDb.schemas.setting.name, "system"))
2025-05-16 15:54:17 +02:00
.then((res) => res[0]);
2025-05-16 15:54:17 +02:00
if (!settings) {
throw new Error("SMTP system settings not found.");
}
if (!settings.smtpHost || !settings.smtpPort || !settings.smtpUser || !settings.smtpPassword || !settings.smtpFrom) {
console.warn("Incomplete SMTP settings. Email not sent.");
return;
}
2025-12-06 15:50:23 +01:00
const emailsArray = data.to.split(",")
.map(email => email.trim());
const transporter = nodemailer.createTransport({
2025-05-16 15:54:17 +02:00
pool: true,
host: settings.smtpHost ?? "",
port: parseInt(settings.smtpPort ?? "587"),
secure: true,
auth: {
user: settings.smtpUser ?? "",
pass: settings.smtpPassword ?? "",
},
});
return await transporter.sendMail({
2025-05-16 15:54:17 +02:00
...data,
2025-12-06 15:50:23 +01:00
to: emailsArray,
2025-05-16 15:54:17 +02:00
from: settings.smtpFrom ?? undefined,
});
};
export const sendCustomEmail = async (data: EmailCustomProps) => {
const transporter = nodemailer.createTransport({
secure: true,
replyTo: data.server.user,
host: data.server.host,
port: data.server.port,
auth: {
user: data.server.user,
pass: data.server.pass,
},
});
2025-05-16 15:54:17 +02:00
return await transporter.sendMail({
...data.data,
});
};
export const sendMassEmail = async (data: EmailMassProps) => {
for (const server of data.servers) {
const transporter = nodemailer.createTransport({
secure: true,
host: server.host,
port: server.port,
auth: {
user: server.user,
pass: server.pass,
},
});
return await transporter.sendMail({
...data.data,
});
}
};