import Cloudflare from "cloudflare"; type TypeEmailData = "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO" | "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION"; export async function sendEmail(data: object, to: string, type: TypeEmailData) { const emailApiKey = import.meta.env.EMAIL_API_KEY; const dataFinal = { ...data, email: to, senderName: "Centro del Reino de Paz y Justicia", }; const emailResponse = await fetch("https://flows2.carpa.com/webhook/email/send", { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": emailApiKey!, }, body: JSON.stringify({ type: type, data: dataFinal, }), }); const responseBody = await emailResponse.text(); if (!emailResponse.ok) { console.error(`Error enviando correo (status ${emailResponse.status}): ${responseBody}`); throw new Error(`Error en servicio de correo: ${emailResponse.status}`); } } // ═══════════════════════════════════════════════════════════════ // Cloudflare (Email Sending) // Usar sendEmailCf() en lugar de sendEmail() (n8n/Brevo) // ═══════════════════════════════════════════════════════════════ const TEMPLATE_URLS: Record = { CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION: { subject: "Confirmación de inscripción al voluntariado", url: "https://pub-910ed90860804520b9202194cf43c0a6.r2.dev/centro_del_reino_paz_y_justicia_postulacion_user.html", }, CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO: { subject: "Notificación de contacto institucional", url: "https://pub-910ed90860804520b9202194cf43c0a6.r2.dev/centro_del_reino_paz_y_justicia_info.html", }, }; const TEMPLATE_CACHE = new Map(); async function fetchTemplate(type: TypeEmailData): Promise { const cached = TEMPLATE_CACHE.get(type); if (cached) return cached; const { url } = TEMPLATE_URLS[type]; const res = await fetch(url); if (!res.ok) { throw new Error(`Error descargando template ${type}: HTTP ${res.status}`); } const html = await res.text(); TEMPLATE_CACHE.set(type, html); return html; } function renderTemplate(template: string, data: Record): string { let html = template; for (const [key, value] of Object.entries(data)) { html = html.replaceAll(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value ?? ""); } return html; } function stripHtml(html: string): string { return html.replace(/<[^>]*>/g, "").replace(/\s+/g, " ").trim(); } export async function sendEmailCf(data: Record, to: string, type: TypeEmailData) { const apiToken = import.meta.env.CLOUDFLARE_API_TOKEN; const accountId = import.meta.env.CLOUDFLARE_ACCOUNT_ID; const client = new Cloudflare({ apiToken }); const { subject } = TEMPLATE_URLS[type]; const rawHtml = await fetchTemplate(type); const html = renderTemplate(rawHtml, data); const text = stripHtml(html); const response = await client.emailSending.send({ account_id: accountId, from: "welcome@mail.centrodelreinodepazyjusticia.com", to, subject, html, text, }); if (!response.delivered) { console.error("Cloudflare email not delivered", response); throw new Error("El correo no fue entregado"); } } // ═══════════════════════════════════════════════════════════════ // ALTERNATIVA: Brevo (SDK directo) // Descomentar y usar sendEmailViaBrevo() en lugar de lo de arriba // Requiere: pnpm add @getbrevo/brevo + BREVO_API_KEY en .env // ═══════════════════════════════════════════════════════════════ // import { // TransactionalEmailsApi, // SendSmtpEmail, // } from "@getbrevo/brevo"; // async function sendEmailViaBrevo( // data: Record, // to: string, // type: TypeEmailData // ) { // const apiKey = import.meta.env.BREVO_API_KEY; // const { subject } = TEMPLATE_URLS[type]; // const rawHtml = await fetchTemplate(type); // const html = renderTemplate(rawHtml, data); // const text = stripHtml(html); // const api = new TransactionalEmailsApi(); // api.setApiKey(0, apiKey); // const email = new SendSmtpEmail(); // email.subject = subject; // email.sender = { name: "Centro del Reino de Paz y Justicia", email: "welcome@mail.centrodelreinodepazyjusticia.com" }; // email.to = [{ email: to }]; // email.htmlContent = html; // email.textContent = text; // const response = await api.sendTransacEmail(email); // console.log("Brevo email sent:", response.body?.messageId); // }