Compare commits

...

2 Commits

Author SHA1 Message Date
Esteban Paz f5cb6f794d Merge pull request 'change to brevo again' (#58) from main into staging
Deploy cdrdpyj / deploy (push) Successful in 58s Details
Reviewed-on: #58
2026-07-29 03:00:10 +00:00
Esteban Paz 862975813f change to brevo again 2026-07-28 21:59:43 -05:00
3 changed files with 167 additions and 101 deletions

View File

@ -1,6 +1,5 @@
import type { APIRoute } from "astro"; import type { APIRoute } from "astro";
import { prisma } from "../lib/prisma"; import { prisma } from "../lib/prisma";
import { sendEmail } from "../lib/email";
export const prerender = false; export const prerender = false;
@ -65,11 +64,32 @@ export const POST: APIRoute = async ({ request }) => {
}, },
}); });
} }
await sendEmail( const emailApiKey = import.meta.env.EMAIL_API_KEY;
{ nombre, email, mensaje },
"daviddevelope24r@outlook.com", const emailResponse = await fetch("https://flows2.carpa.com/webhook/email/send", {
"CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO", method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": emailApiKey!,
},
body: JSON.stringify({
type: "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO",
data: {
nombre,
email,
mensaje,
senderName : "Centro del Reino de Paz y Justicia",
},
}),
});
if (!emailResponse.ok) {
console.error("Error enviando correo");
return new Response(
JSON.stringify({ error: "Error en servicio de correo" }),
{ status: 500 }
); );
}
return new Response(null, { return new Response(null, {
status: 302, status: 302,

View File

@ -1,6 +1,5 @@
import type { APIRoute } from "astro"; import type { APIRoute } from "astro";
import { appendToSheet, emailExists } from "../lib/googleSheets"; import { appendToSheet, emailExists } from "../lib/googleSheets";
import { sendEmail } from "../lib/email";
export const prerender = false; export const prerender = false;
export const POST: APIRoute = async ({ request }) => { export const POST: APIRoute = async ({ request }) => {
@ -52,12 +51,31 @@ export const POST: APIRoute = async ({ request }) => {
new Date().toLocaleString() new Date().toLocaleString()
]; ];
// 🔹 Enviar correo y guardar en Google Sheets // 🔹 Enviar a tu backend real
await Promise.all([ const [emailResponse] = await Promise.all([
sendEmail({ nombres, apellidos }, email, "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION"), fetch("http://155.138.215.11:3050/email/send", {
appendToSheet(valuesForSheets), method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": emailApiKey!,
},
body: JSON.stringify({
type: "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION",
data: dataSend,
}),
}),
appendToSheet(valuesForSheets) // Guardar en Google Sheets
]); ]);
if (!emailResponse.ok) {
return new Response(null, {
status: 302,
headers: {
Location: "/",
},
});
}
// 🔹 Redirección elegante después de enviar // 🔹 Redirección elegante después de enviar
return new Response(null, { return new Response(null, {
status: 302, status: 302,

View File

@ -1,110 +1,138 @@
import Cloudflare from "cloudflare"; // import Cloudflare from "cloudflare";
type TypeEmailData = "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO" | "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION"; type TypeEmailData = "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO" | "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION";
const TEMPLATE_URLS: Record<TypeEmailData, { subject: string; url: string }> = { export async function sendEmail(data: object, to: string, type: TypeEmailData) {
CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION: { const emailApiKey = import.meta.env.EMAIL_API_KEY;
subject: "Confirmación de inscripción al voluntariado",
url: "https://pub-910ed90860804520b9202194cf43c0a6.r2.dev/centro_del_reino_paz_y_justicia_postulacion_user.html", 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!,
}, },
CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_INFO: { body: JSON.stringify({
subject: "Notificación de contacto institucional", type: type,
url: "https://pub-910ed90860804520b9202194cf43c0a6.r2.dev/centro_del_reino_paz_y_justicia_info.html", data: dataFinal,
}, }),
};
const TEMPLATE_CACHE = new Map<string, string>();
async function fetchTemplate(type: TypeEmailData): Promise<string> {
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, string>): 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 sendEmail(data: Record<string, string>, 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) { const responseBody = await emailResponse.text();
console.error("Cloudflare email not delivered", response);
throw new Error("El correo no fue entregado"); if (!emailResponse.ok) {
console.error(`Error enviando correo (status ${emailResponse.status}): ${responseBody}`);
throw new Error(`Error en servicio de correo: ${emailResponse.status}`);
} }
} }
/* // ═══════════════════════════════════════════════════════════════
// CÓDIGO COMENTADO — Cloudflare (Email Workers)
ALTERNATIVA: Brevo (API v3) // Descomentar para volver a Cloudflare en lugar de n8n/Brevo
Para volver a Brevo: // ═══════════════════════════════════════════════════════════════
1. Instalar: pnpm add @getbrevo/brevo
2. Agregar a .env: BREVO_API_KEY=xxx
3. Cambiar "from" a tu dominio verificado en Brevo
4. En sendEmail(), comentar el bloque Cloudflare
y descomentar la llamada a sendEmailViaBrevo()
import { // const TEMPLATE_URLS: Record<TypeEmailData, { subject: string; url: string }> = {
TransactionalEmailsApi, // CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION: {
SendSmtpEmail, // subject: "Confirmación de inscripción al voluntariado",
} from "@getbrevo/brevo"; // 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",
// },
// };
async function sendEmailViaBrevo( // const TEMPLATE_CACHE = new Map<string, string>();
data: Record<string, string>,
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(); // async function fetchTemplate(type: TypeEmailData): Promise<string> {
api.setApiKey(0, apiKey); // const cached = TEMPLATE_CACHE.get(type);
// if (cached) return cached;
const email = new SendSmtpEmail(); // const { url } = TEMPLATE_URLS[type];
email.subject = subject; // const res = await fetch(url);
email.sender = { name: "Centro del Reino de Paz y Justicia", email: "welcome@mail.centrodelreinodepazyjusticia.com" }; // if (!res.ok) {
email.to = [{ email: to }]; // throw new Error(`Error descargando template ${type}: HTTP ${res.status}`);
email.htmlContent = html; // }
email.textContent = text;
const response = await api.sendTransacEmail(email); // const html = await res.text();
console.log("Brevo email sent:", response.body?.messageId); // TEMPLATE_CACHE.set(type, html);
} // return html;
*/ // }
// function renderTemplate(template: string, data: Record<string, string>): 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<string, string>, 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<string, string>,
// 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);
// }