PT

@core / newsletter

1.1.0 ▾
verificadoMIT
GitHub

Newsletter: double opt-in, descadastro em um clique (RFC 8058), tags e campanhas em lotes retomáveis

Código11 arquivosContexto~889 tokensanálise aprovada

A árvore exata que será injetada, após o .genpmignore. Fixada em

src/lib/newsletter/sender.tssomente leitura · 48a34fe
// Envío con cabeceras de baja en un clic (RFC 8058, exigidas por Gmail y Yahoo a remitentes masivos).
// Con RESEND_API_KEY usa la API de Resend directamente (admite cabeceras); si no, el proveedor de @core/email
// (sin cabeceras: solo para desarrollo).
import { getEmailProvider } from '../email/index.ts';

export type NewsletterMessage = { from: string; to: string; subject: string; html: string; text: string; headers: Record<string, string> };

export interface NewsletterSender {
  readonly name: string;
  send(m: NewsletterMessage): Promise<void>;
}

export function resendSender(apiKey: string, fetchImpl: typeof fetch = fetch): NewsletterSender {
  return {
    name: 'resend',
    async send(m) {
      const res = await fetchImpl('https://api.resend.com/emails', {
        method: 'POST',
        headers: { authorization: `Bearer ${apiKey}`, 'content-type': 'application/json' },
        body: JSON.stringify({ from: m.from, to: [m.to], subject: m.subject, html: m.html, text: m.text, headers: m.headers }),
      });
      if (!res.ok) throw new Error(`Resend ${res.status}: ${(await res.text()).slice(0, 200)}`);
    },
  };
}

export function emailProviderSender(): NewsletterSender {
  return {
    name: 'email-provider',
    send: async (m) => void (await getEmailProvider().send({ from: m.from, to: m.to, subject: m.subject, html: m.html, text: m.text })),
  };
}

let current: NewsletterSender | null = null;

export function getNewsletterSender(): NewsletterSender {
  current ??= process.env.RESEND_API_KEY ? resendSender(process.env.RESEND_API_KEY) : emailProviderSender();
  return current;
}

export function setNewsletterSender(s: NewsletterSender): void {
  current = s;
}

Denunciar @core/newsletter

Entre com o GitHub para denunciar um pacote.