106 lines
3.2 KiB
TypeScript
106 lines
3.2 KiB
TypeScript
import { Event, User } from "@repo/db";
|
|
import nodemailer from "nodemailer";
|
|
import { renderCourseCompleted } from "./mail-templates/CourseCompleted";
|
|
import { renderPasswordChanged } from "./mail-templates/PasswordChanged";
|
|
import { renderVerificationCode } from "./mail-templates/ConfirmEmail";
|
|
import { renderBannNotice } from "modules/mail-templates/Bann";
|
|
import { renderTimeBanNotice } from "modules/mail-templates/TimeBann";
|
|
|
|
let transporter: nodemailer.Transporter | null = null;
|
|
|
|
const initTransporter = () => {
|
|
if (!process.env.MAIL_SERVER) return console.error("MAIL_SERVER is not defined");
|
|
if (!process.env.MAIL_PORT) return console.error("MAIL_PORT is not defined");
|
|
if (!process.env.MAIL_USER) return console.error("MAIL_USER is not defined");
|
|
if (!process.env.MAIL_PASSWORD) return console.error("MAIL_PASSWORD is not defined");
|
|
|
|
console.log("Initializing mail transporter...", {
|
|
host: process.env.MAIL_SERVER,
|
|
port: process.env.MAIL_PORT,
|
|
user: process.env.MAIL_USER,
|
|
password: process.env.MAIL_PASSWORD,
|
|
});
|
|
|
|
transporter = nodemailer.createTransport({
|
|
host: process.env.MAIL_SERVER,
|
|
port: parseInt(process.env.MAIL_PORT),
|
|
secure: process.env.MAIL_SECURE === "true", // true for 465, false for other ports
|
|
auth: {
|
|
user: process.env.MAIL_USER,
|
|
pass: process.env.MAIL_PASSWORD,
|
|
},
|
|
});
|
|
transporter.on("error", (err) => {
|
|
console.error("Mail occurred:", err);
|
|
});
|
|
transporter.on("idle", () => {
|
|
console.log("Mail Idle");
|
|
});
|
|
};
|
|
|
|
initTransporter();
|
|
|
|
export const sendCourseCompletedEmail = async (to: string, user: User, event: Event) => {
|
|
const emailHtml = await renderCourseCompleted({ user, event });
|
|
|
|
if (!transporter) {
|
|
console.error("Transporter is not initialized");
|
|
return;
|
|
}
|
|
sendMail(to, `Kurs ${event.name} erfolgreich abgeschlossen`, emailHtml);
|
|
};
|
|
|
|
export const sendPasswordChanged = async (to: string, user: User, password: string) => {
|
|
const emailHtml = await renderPasswordChanged({ user, password });
|
|
|
|
await sendMail(to, `Dein Passwort wurde geändert`, emailHtml);
|
|
};
|
|
|
|
export const sendEmailVerification = async (to: string, user: User, code: string) => {
|
|
const emailHtml = await renderVerificationCode({
|
|
user,
|
|
code,
|
|
});
|
|
await sendMail(to, "Bestätige deine E-Mail-Adresse", emailHtml);
|
|
};
|
|
|
|
export const sendBannEmail = async (to: string, user: User, staffName: string) => {
|
|
const emailHtml = await renderBannNotice({
|
|
user,
|
|
staffName,
|
|
});
|
|
await sendMail(to, "Deine Sperrung bei Virtual Air Rescue", emailHtml);
|
|
};
|
|
|
|
export const sendTimebannEmail = async (to: string, user: User, staffName: string) => {
|
|
const emailHtml = await renderTimeBanNotice({
|
|
user,
|
|
staffName,
|
|
});
|
|
await sendMail(to, "Deine vorrübergehende Sperrung bei Virtual Air Rescue", emailHtml);
|
|
};
|
|
|
|
export const sendMail = async (to: string, subject: string, html: string) =>
|
|
new Promise<void>(async (resolve, reject) => {
|
|
if (!transporter) {
|
|
console.error("Transporter is not initialized");
|
|
return;
|
|
}
|
|
await transporter.sendMail(
|
|
{
|
|
from: process.env.MAIL_USER,
|
|
to,
|
|
subject: subject,
|
|
html,
|
|
},
|
|
(error, info) => {
|
|
if (error) {
|
|
reject(error);
|
|
console.error("Error sending email:", error);
|
|
} else {
|
|
resolve();
|
|
}
|
|
},
|
|
);
|
|
});
|