@dariomvg/create
resendemailenvionextjsintegracion

Módulo de Email con Resend

Un módulo mínimo de envío de emails para Next.js App Router, construido sobre Resend.

Dependencias

  • resend

Archivos

ArchivoPropósito
types.tsTipos compartidos para los parámetros y resultados de los emails
service.tsLógica interna: cliente de Resend y funciones de envío de bajo nivel. No lo importes directamente.
actions.tsAPI pública: funciones "use server" para importar desde tu app
.env.localVariables de entorno

Variables de entorno

RESEND_API_KEY=
EMAIL_FROM=
  • RESEND_API_KEY: la encontrás en tu dashboard de Resend, en API Keys.
  • EMAIL_FROM: la dirección de remitente por defecto (por ejemplo Acme <onboarding@yourdomain.com>). El dominio tiene que ser un dominio verificado en tu cuenta de Resend.

Uso

Importá las funciones que necesites desde actions.ts en cualquier server component o server action.

Email de texto plano

import { sendPlainTextEmail } from "@/lib/email/actions";

const result = await sendPlainTextEmail({
  to: "user@example.com",
  subject: "Welcome!",
  text: "Thanks for signing up.",
});

Email HTML

import { sendHtmlEmail } from "@/lib/email/actions";

const result = await sendHtmlEmail({
  to: "user@example.com",
  subject: "Welcome!",
  html: "<p>Thanks for signing up.</p>",
});

Parámetros comunes

Ambas funciones aceptan los mismos parámetros adicionales:

await sendHtmlEmail({
  to: ["user1@example.com", "user2@example.com"],
  subject: "Update",
  html: "<p>Hello</p>",
  cc: "manager@example.com",
  bcc: ["archive@example.com"],
  replyTo: "support@example.com",
  attachments: [
    { filename: "invoice.pdf", content: pdfBuffer, contentType: "application/pdf" },
  ],
});

Forma del resultado

Ambas funciones devuelven el mismo tipo de resultado:

type SendEmailResult =
  | { success: true; id: string }
  | { success: false; error: string };

Verificá result.success antes de asumir que el email se envió.