diff --git a/supabase/functions/send-outreach-email/index.ts b/supabase/functions/send-outreach-email/index.ts new file mode 100644 index 0000000..fd843d5 --- /dev/null +++ b/supabase/functions/send-outreach-email/index.ts @@ -0,0 +1,87 @@ +import { z } from "npm:zod@3.23.8"; + +const corsHeaders = { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Headers": + "authorization, x-client-info, apikey, content-type", + "Access-Control-Allow-Methods": "POST, OPTIONS", +}; + +const GATEWAY_URL = "https://connector-gateway.lovable.dev/brevo"; + +const BodySchema = z.object({ + to_email: z.string().email(), + to_name: z.string().min(1).max(200), + subject: z.string().min(1).max(300), + body: z.string().min(1).max(10000), +}); + +Deno.serve(async (req) => { + if (req.method === "OPTIONS") return new Response("ok", { headers: corsHeaders }); + + try { + const LOVABLE_API_KEY = Deno.env.get("LOVABLE_API_KEY"); + const BREVO_API_KEY = Deno.env.get("BREVO_API_KEY"); + if (!LOVABLE_API_KEY || !BREVO_API_KEY) { + throw new Error("Email service not configured"); + } + + const parsed = BodySchema.safeParse(await req.json()); + if (!parsed.success) { + return new Response( + JSON.stringify({ error: "Ogiltiga fält", details: parsed.error.flatten().fieldErrors }), + { status: 400, headers: { ...corsHeaders, "Content-Type": "application/json" } }, + ); + } + const { to_email, to_name, subject, body } = parsed.data; + + const senderEmail = Deno.env.get("BREVO_SENDER_EMAIL") ?? "konditorivaror@gmail.com"; + const senderName = "Tiffany – Lennart Svenssons Konditorivaror"; + + // Konvertera radbrytningar till
för HTML + const htmlBody = ` +
+ ${body + .split(/\n{2,}/) + .map((p) => `

${p.replace(/\n/g, "
")}

`) + .join("")} +
`; + + const res = await fetch(`${GATEWAY_URL}/v3/smtp/email`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${LOVABLE_API_KEY}`, + "X-Connection-Api-Key": BREVO_API_KEY, + }, + body: JSON.stringify({ + sender: { name: senderName, email: senderEmail }, + to: [{ email: to_email, name: to_name }], + replyTo: { email: senderEmail, name: senderName }, + subject, + htmlContent: htmlBody, + textContent: body, + }), + }); + + if (!res.ok) { + const errBody = await res.text(); + console.error(`Brevo send failed [${res.status}]:`, errBody); + return new Response( + JSON.stringify({ error: "Brevo avvisade mejlet", status: res.status, details: errBody }), + { status: res.status, headers: { ...corsHeaders, "Content-Type": "application/json" } }, + ); + } + + const data = await res.json(); + return new Response(JSON.stringify({ success: true, messageId: data.messageId }), { + headers: { ...corsHeaders, "Content-Type": "application/json" }, + }); + } catch (err: any) { + console.error("send-outreach-email error:", err); + return new Response( + JSON.stringify({ error: err?.message ?? "Kunde inte skicka mejl" }), + { status: 500, headers: { ...corsHeaders, "Content-Type": "application/json" } }, + ); + } +});