import nodemailer from "nodemailer"; // E-mail versturen. Voorkeur: SendGrid, met dezelfde instellingen als het Rikx ZRM-platform // (SENDGRID_API_KEY, SENDGRID_FROM_EMAIL, SENDGRID_FROM_NAME). Anders SMTP (SMTP_*). // Zonder beide wordt er niets verstuurd; de aanroeper toont dan bijvoorbeeld de uitnodigingslink in beeld. export function isMailConfigured(): boolean { return Boolean(process.env.SENDGRID_API_KEY || process.env.SMTP_HOST); } type Message = { to: string; toName?: string; subject: string; text: string; html?: string }; export async function sendMail(message: Message): Promise { if (process.env.SENDGRID_API_KEY) return sendViaSendGrid(message, process.env.SENDGRID_API_KEY); return sendViaSmtp(message); } async function sendViaSendGrid(message: Message, apiKey: string): Promise { const res = await fetch("https://api.sendgrid.com/v3/mail/send", { method: "POST", headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json" }, body: JSON.stringify({ personalizations: [{ to: [{ email: message.to, name: message.toName }], subject: message.subject }], from: { email: process.env.SENDGRID_FROM_EMAIL || "no-reply@rikxplatform.nl", name: process.env.SENDGRID_FROM_NAME || "Rikx", }, content: [ { type: "text/plain", value: message.text }, ...(message.html ? [{ type: "text/html", value: message.html }] : []), ], }), }); if (!res.ok) throw new Error(`SendGrid ${res.status}: ${await res.text()}`); } async function sendViaSmtp(message: Message): Promise { const port = Number(process.env.SMTP_PORT || 587); const transport = nodemailer.createTransport({ host: process.env.SMTP_HOST, port, secure: port === 465, auth: process.env.SMTP_USER ? { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS } : undefined, }); const { toName: _toName, ...rest } = message; await transport.sendMail({ from: process.env.SMTP_FROM || "noreply@rikx.nl", ...rest }); }