mirror of
https://github.com/Portabase/portabase.git
synced 2026-07-14 11:16:13 +02:00
105 lines
2.4 KiB
TypeScript
105 lines
2.4 KiB
TypeScript
"use server";
|
|
|
|
import {db} from "@/db";
|
|
import {eq} from "drizzle-orm";
|
|
import nodemailer from "nodemailer";
|
|
import * as drizzleDb from "@/db";
|
|
|
|
type Payload = {
|
|
to: string;
|
|
from?: string;
|
|
subject: string;
|
|
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) => {
|
|
const settings = await db
|
|
.select()
|
|
.from(drizzleDb.schemas.setting)
|
|
.where(eq(drizzleDb.schemas.setting.name, "system"))
|
|
.then((res) => res[0]);
|
|
|
|
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;
|
|
}
|
|
|
|
const emailsArray = data.to.split(",")
|
|
.map(email => email.trim());
|
|
|
|
|
|
const transporter = nodemailer.createTransport({
|
|
pool: true,
|
|
host: settings.smtpHost ?? "",
|
|
port: parseInt(settings.smtpPort ?? "587"),
|
|
secure: true,
|
|
auth: {
|
|
user: settings.smtpUser ?? "",
|
|
pass: settings.smtpPassword ?? "",
|
|
},
|
|
});
|
|
|
|
return await transporter.sendMail({
|
|
...data,
|
|
to: emailsArray,
|
|
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,
|
|
},
|
|
});
|
|
|
|
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,
|
|
});
|
|
}
|
|
};
|