import nodemailer, { type Transporter } from "nodemailer"; import { childLogger } from "../_core/logger.js"; const log = childLogger("email"); let cachedTransporter: Transporter | null = null; function getTransporter(): Transporter | null { if (cachedTransporter) return cachedTransporter; const host = process.env.SMTP_HOST; const port = process.env.SMTP_PORT ? Number(process.env.SMTP_PORT) : undefined; const user = process.env.SMTP_USER; const pass = process.env.SMTP_PASS; if (!host || !port) { log.warn("SMTP_HOST/SMTP_PORT not configured — emails will be logged only"); return null; } cachedTransporter = nodemailer.createTransport({ host, port, secure: port === 465, auth: user && pass ? { user, pass } : undefined, }); return cachedTransporter; } export async function sendMail(opts: { to: string; subject: string; html: string; text?: string }): Promise { const from = process.env.SMTP_FROM ?? process.env.SMTP_USER ?? "no-reply@queuemed.app"; const transporter = getTransporter(); if (!transporter) { log.info({ to: opts.to, subject: opts.subject }, "(dev) would send email"); return; } await transporter.sendMail({ from, to: opts.to, subject: opts.subject, html: opts.html, text: opts.text, }); } export function buildResetEmail(resetUrl: string): { subject: string; html: string; text: string } { const subject = "QueueMed — Réinitialisation de votre mot de passe"; const text = `Bonjour,\n\nVous avez demandé à réinitialiser votre mot de passe QueueMed.\n\nCliquez sur ce lien (valable 1 heure) :\n${resetUrl}\n\nSi vous n'êtes pas à l'origine de cette demande, ignorez ce message.\n\n— L'équipe QueueMed`; const html = `

Réinitialisation de votre mot de passe

Bonjour,

Vous avez demandé à réinitialiser votre mot de passe QueueMed. Cliquez sur le bouton ci-dessous (valable 1 heure) :

Réinitialiser mon mot de passe

Si vous n'êtes pas à l'origine de cette demande, ignorez ce message.


— L'équipe QueueMed

`; return { subject, html, text }; }