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
| Archivo | Propósito |
|---|---|
types.ts | Tipos compartidos para los parámetros y resultados de los emails |
service.ts | Lógica interna: cliente de Resend y funciones de envío de bajo nivel. No lo importes directamente. |
actions.ts | API pública: funciones "use server" para importar desde tu app |
.env.local | Variables 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 ejemploAcme <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ó.