summaryrefslogtreecommitdiff
path: root/src/email/email.ts
diff options
context:
space:
mode:
authorJustZvan <justzvan@justzvan.xyz>2026-02-06 12:16:40 +0100
committerJustZvan <justzvan@justzvan.xyz>2026-02-06 12:16:40 +0100
commite904e9634548e47d611bdcbb88d7b180b927fd5f (patch)
tree21aa5be08fc5b22585508c0263ee5ea4effcc593 /src/email/email.ts
feat: initial commit!
Diffstat (limited to 'src/email/email.ts')
-rw-r--r--src/email/email.ts66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/email/email.ts b/src/email/email.ts
new file mode 100644
index 0000000..61ec18a
--- /dev/null
+++ b/src/email/email.ts
@@ -0,0 +1,66 @@
+import nodemailer from "nodemailer";
+import { logger } from "../lib/pino";
+
+let transporter: nodemailer.Transporter | null = null;
+
+/**
+ * Gets or creates the nodemailer transporter instance.
+ * Configuration is loaded from SMTP environment variables.
+ */
+export function getTransporter(): nodemailer.Transporter {
+ if (!transporter) {
+ try {
+ if (!process.env.SMTP_HOST) {
+ logger.error("SMTP_HOST environment variable not set");
+ throw new Error("SMTP_HOST is required");
+ }
+
+ if (!process.env.SMTP_PORT) {
+ logger.error("SMTP_PORT environment variable not set");
+ throw new Error("SMTP_PORT is required");
+ }
+
+ if (!process.env.SMTP_USER) {
+ logger.error("SMTP_USER environment variable not set");
+ throw new Error("SMTP_USER is required");
+ }
+
+ if (!process.env.SMTP_PASS) {
+ logger.error("SMTP_PASS environment variable not set");
+ throw new Error("SMTP_PASS is required");
+ }
+
+ const port = Number(process.env.SMTP_PORT);
+ if (isNaN(port) || port <= 0 || port > 65535) {
+ logger.error(
+ { port: process.env.SMTP_PORT },
+ "Invalid SMTP_PORT value",
+ );
+ throw new Error("SMTP_PORT must be a valid port number");
+ }
+
+ transporter = nodemailer.createTransport({
+ host: process.env.SMTP_HOST,
+ port,
+ secure: process.env.SMTP_SECURE == "1",
+ auth: {
+ user: process.env.SMTP_USER,
+ pass: process.env.SMTP_PASS,
+ },
+ });
+
+ logger.info(
+ {
+ host: process.env.SMTP_HOST,
+ port,
+ secure: process.env.SMTP_SECURE == "1",
+ },
+ "Email transporter created successfully",
+ );
+ } catch (error) {
+ logger.error({ error }, "Failed to create email transporter");
+ throw error;
+ }
+ }
+ return transporter;
+}