Cómo Enviar un Correo Electrónico a través de una API en JavaScript (Tutorial de Node.js)

Índice
Índice 14 secciones
Empezando
Enviar correos electrónicos
Producción
Referencia
Tutorial de JavaScript

Cómo Enviar correo electrónico a través de API en JavaScript (Tutorial de Node.js)

Omite la información estándar de SMTP. Esta guía te muestra cómo enviar correos electrónicos en Node.js usando API de correo electrónico unificado de Unipile - con código de copiar y pegar para Gmail, Outlook y SMTP en menos de 10 líneas de JavaScript.

API de envío de correo electrónico Javascript API para enviar correos electrónicos con Node.js Gmail / Outlook / SMTP ESM + async/await
sendEmail.mjs
import { UnipileClient } from 'unipile-node-sdk'; const client = nuevo UnipileClientprocess.env.UNIPILE_DSN, process.env.UNIPILE_TOKEN ); await cliente.email.enviar({ account_id: 'TU_ID_DE_CUENTA', para: [{ nombre_a_mostrar: 'Alicia', identificador: 'alice@example.com' }], asunto: 'Hola desde Node.js', body: '

¡Enviado vía Unipile!

'
});
Correo entregado - 202 Aceptado
Funciona con: Gmail Outlook IMAP
En resumen

Ejemplo de Node.js de 5 líneas

Si ya sabes qué es un Enviar correo electrónico API es y solo quiero enviar código de API de correo electrónico de JavaScript que realmente funcione, aquí está. El tutorial completo sigue a continuación.

1
Instalar el SDK
npm install unipile-node-sdk
2
Establecer variables de entorno
Añadir UNIPILE_DSN y UNIPILE_TOKEN a tu .env archivo.
3
Vincular una cuenta de correo electrónico
OAuth para Gmail/Outlook o credenciales SMTP para cualquier servidor IMAP - una llamada a la API.
4
Llamar client.email.enviar()
Pasar account_id, a, temay cuerpo. Hecho.
El mismo código funciona para Gmail, Outlook y cualquier servidor IMAP: no se necesita lógica específica del proveedor. Comprueba Guía de la API de correo electrónico Para la descripción general completa del concepto.
enviar.mjs
import { UnipileClient } from 'unipile-node-sdk'; const client = nuevo UnipileClientprocess.env.UNIPILE_DSN, process.env.UNIPILE_TOKEN ); const resultado = esperará cliente.email.enviar({ account_id: 'acc_xxxxxxxxxxxxxxxx', para: [{ nombre_a_mostrar: 'Alicia Martín', identificador: 'alice@acme.com' }], asunto: 'Hola desde Node.js', body: '

¡Enviado a través de la API de Unipile!

'
}); consola.log(resultado); // { tracking_id: 'msg_...' }
Configurar

Requisitos previos y configuración

Antes de poder usar el flujo de trabajo de JavaScript de la API de envío de correo electrónico en producción, necesitas cuatro cosas: una versión compatible de Node.js, el SDK de Unipile, una clave de API y un punto final de DSN.

Node.js 18+ (se recomienda 20)
El SDK de Unipile usa nativo fetch y de primer nivel await. Se recomienda Node 20 LTS para producción. Comprueba tu versión con node -v.
Clave API y DSN de Unipile
Regístrate en el panel de control de Unipile para obtener tu token de acceso y DSN (un punto de conexión HTTPS personal como api4.unipile.com:13444. Ambos son necesarios para inicializar el cliente.
ESM o CommonJS
El SDK es compatible con ambos. Para ESM, usa .mjs archivos o conjunto "tipo":"módulo" en paquete.json. Para CommonJS, dinámico import() funciona también - ejemplos que se muestran a continuación.
Una cuenta de correo electrónico vinculada
Envías correo electrónico a través de una cuenta vinculada (Gmail, Outlook o IMAP). La siguiente sección te guiará a través del flujo de OAuth para vincular una. Solo haces esto una vez por cuenta.
Instalando el SDK de Unipile
npm
lana
pnpm
npm install unipile-node-sdk
yarn add unipile-node-sdk
pnpm agregar unipile-node-sdk
.env
# Credenciales de Unipile (nunca incluyas este archivo en el repositorio) UNIPILE_DSN=https://api4.unipile.com:13444 UNIPILE_TOKEN=tu_token_de_acceso_aqui # La ID de la cuenta de correo electrónico vinculada ID_CUENTA_EMAIL=acc_xxxxxxxxxxxxxxxx

Añadir .env a tu .gitignore. Usa dotenv o para el Node nativo 20.6+ --archivo-env bandera para cargarlo node --env-file=.env send.mjs.

Vincular cuenta

Conectando tu primera cuenta de correo electrónico

En API de correo electrónico unificada usa un solo account_id para abstraer las diferencias de los proveedores. Vincula una cuenta una vez y luego llama client.email.enviar() idénticamente en los tres proveedores.

Selecciona tu proveedor a continuación para ver el fragmento de código exacto de Node.js. El account_id devuelto es lo que almacenas y reutilizas para cada envío posterior.

GmailOAuth de Gmail
OutlookOutlook / Microsoft 365
IMAPSMTP / IMAP
connect-gmail.mjs
import { UnipileClient } from 'unipile-node-sdk'; const client = nuevo UnipileClient(process.env.UNIPILE_DSN, process.env.UNIPILE_TOKEN); // Paso 1: generar un enlace de OAuth alojado para Gmail const { url } = esperará cuenta.cliente.crearEnlaceAutenticacionHospedado({ tipo: 'GOOGLE', success_redirect_url: process.env.OAUTH_CALLBACK_URL, failure_redirect_url: process.env.OAUTH_CALLBACK_URL + '?error=1', }); // Paso 2: redirige a tu usuario a `url` consola.log('Redirigir al usuario a:', url); // Paso 3: Unipile envía la account_id a tu callback // Almacenarlo: process.env.EMAIL_ACCOUNT_ID = result.account_id
conectar-outlook.mjs
import { UnipileClient } from 'unipile-node-sdk'; const client = nuevo UnipileClient(process.env.UNIPILE_DSN, process.env.UNIPILE_TOKEN); // Funciona para Outlook personal Y Microsoft 365 / Exchange Online const { url } = esperará cuenta.cliente.crearEnlaceAutenticacionHospedado({ tipo: 'MICROSOFT', success_redirect_url: process.env.OAUTH_CALLBACK_URL, failure_redirect_url: process.env.OAUTH_CALLBACK_URL + '?error=1', }); // Redirigir al usuario -> completa el flujo de OAuth de Microsoft consola.log('Redirigir al usuario a:', url); // Ver: /sincronización-de-correos-electrónicos-con-la-api-de-microsoft-graph-una-guía-para-desarrolladores/
connect-imap.mjs
import { UnipileClient } from 'unipile-node-sdk'; const client = nuevo UnipileClient(process.env.UNIPILE_DSN, process.env.UNIPILE_TOKEN); // SMTP/IMAP: pasar credenciales directamente (sin redirección OAuth) const account = esperará cuenta.cliente.create({ tipo: 'IMAP', imap: { usuario: process.env.IMAP_USUARIO, contraseña: process.env.IMAP_PASS, anfitrión: process.env.IMAP_HOST, puerto: 993, }, smtp: { username: process.env.IMAP_USUARIO, contraseña: process.env.IMAP_PASS, anfitrión: process.env.SMTP_HOST, puerto: 587, }, }); consola.log(account.account_id); // guardar esto
Gmail Gmail
Usa Google OAuth 2.0. No se necesitan contraseñas de aplicación. Vea el completo Tutorial del envío de correos electrónicos con la API de Gmail para la configuración de ámbitos y pantalla de consentimiento.
Outlook Outlook / Microsoft 365
Utiliza OAuth de Microsoft Graph. Cubre inquilinos personales de Outlook y M365. Detalles en el Guía de correo electrónico de Microsoft Graph.
IMAP SMTP / IMAP
Funciona con cualquier proveedor que exponga IMAP/SMTP (Yahoo, ProtonMail Bridge, servidores de correo personalizados). Lee el Guía de solución de API IMAP.
API principal

Enviar tu primer correo electrónico desde Node.js

Tres patrones listos para producción para el flujo de trabajo de JavaScript de la API de envío de correo electrónico: texto sin formato, HTML con CC/CCO y lectura del objeto de respuesta. Todos usan el mismo client.email.enviar() llamar.

1
Correo electrónico de texto plano
Caso más simple
plain-text.mjs
import { UnipileClient } from 'unipile-node-sdk'; const client = nuevo UnipileClient(process.env.UNIPILE_DSN, process.env.UNIPILE_TOKEN); const resultado = esperará cliente.email.enviar({ account_id: process.env.ID_CUENTA_EMAIL, para: [{ nombre_a_mostrar: 'Bob', identificador: 'bob@example.com' }], asunto: 'Bienvenido/a a la plataforma', body: 'Hola Bob, tu cuenta está lista.', }); consola.log(result.tracking_id); // msg_xxxxxxxxxxxxxxxx
202 Aceptado - tracking_id.result poblado
2
Cuerpo HTML con CC y CCO
Destinatario múltiple
html-cc-bcc.mjs
const resultado = esperará cliente.email.enviar({ account_id: process.env.ID_CUENTA_EMAIL, para: [{ display_name: 'Alicia', identificador: 'alice@acme.com' }], cc: [{ display_name: 'Gerente', identificador: 'boss@acme.com' }], cc: [{ display_name: 'Auditoría', identificador: 'audit@internal.io' }], asunto: 'Su factura #1042', // cuerpo del HTML - el proveedor lo renderiza de forma nativa body: `

Factura #1042

Monto a pagar: $299

Pagar ahora `
, }); consola.log('Enviado:', result.tracking_id);
3
Referencia de campo completo
Todos los parámetros admitidos
CampoTipoRequeridoDescripción
account_idcadenaRequeridoID de la cuenta de correo electrónico vinculada para enviar desde
aDestinatario[]RequeridoMatriz de {nombre_a_mostrar, identificador} objetos
temacadenaRequeridoAsunto del correo electrónico
cuerpocadenaRequeridoTexto plano o cadena HTML
ccDestinatario[]OpcionalDestinatarios en copia carbón
con copia ocultaDestinatario[]Opcionalcopia oculta para destinatarios
fromDestinatarioOpcionalAnular nombre para mostrar del remitente
respondercadenaOpcionalID del mensaje del proveedor al que responder (hilos)
archivos adjuntosArregloOpcionalMatriz de [nombre de archivo, Búfer] tuplas
cabeceras_personalizadasobjeto[]OpcionalMatriz de encabezados X personalizados
opciones de seguimientoobjetoOpcional{abre, enlaces, etiqueta} - habilitar seguimiento de apertura/clic
Gratis para empezar
¿Listo para enviar correos electrónicos a través de la API en JavaScript?

Obtén tu clave de API, vincula una cuenta de Gmail u Outlook en minutos y ejecuta los ejemplos de Node.js de esta guía contra buzones de correo reales.

Archivos adjuntos

Enviar adjuntos en Node.js

En archivos adjuntos campo acepta una matriz de [nombre de archivo, Búfer] tuplas. Lee el archivo con Node's fs.readFileSync o transmítelo con fs.promises.readFile.

Archivo único desde disco
Utilice fs.promises.readFile(ruta) para obtener un Buffer, luego pasar ['nombre del archivo.pdf', buffer]. Funciona para PDF, DOCX, imágenes, cualquier binario.
Múltiples adjuntos
Pasa un array de tuplas. Cada tupla es independiente; mezcla tipos de archivo libremente. No hay un límite estricto por archivo adjunto, pero mantén la carga útil total por debajo del límite de tu plan.
Imágenes en línea (CID)
Incrusta imágenes en el cuerpo del HTML usando el cid: esquema. Haga referencia al mismo nombre de archivo utilizado en la tupla attachments: <img src="cid:logo.png">.
Búfer de un flujo
Generar un PDF sobre la marcha (por ejemplo, con pdfkit), recógelo en un Buffer y adjúntalo sin escribir en disco. Seguro para producción en entornos serverless.
adjuntar-archivo.mjs
import { UnipileClient } from 'unipile-node-sdk'; import promesas como El fin de semana from 'nodo:fs'; const client = nuevo UnipileClient(process.env.UNIPILE_DSN, process.env.UNIPILE_TOKEN); Lee el archivo en un Buffer const BufferPDF = esperará fs.leerArchivo('./factura.pdf'); await cliente.email.enviarclave_cuenta: proceso.env.ID_CUENTA_EMAIL, para: [{ display_name: 'Cliente', identificador: 'client@example.com' }], asunto: 'Su factura está adjunta', body: '

Por favor, encuentre su factura adjunta.

'
, adjuntos: [ ['factura.pdf', pdfBuffer], // [nombre de archivo, Buffer] ], });
adjuntar-múltiples-en-línea.mjs
const [logotipo, informe] = esperará Promise.allfs.leerArchivo('./logo.png'), fs.leerArchivo('./report.xlsx'), ]); await cliente.email.enviar({ account_id: process.env.ID_CUENTA_EMAIL, para: [{ nombre_a_mostrar: 'Equipo', identificador: 'team@acme.com' }], asunto: 'Informe del primer trimestre', body: Logo

Informe Q1

Consulte la hoja de cálculo adjunta para obtener más detalles.

`
, adjuntos: [ ['logo.png', logo], // en línea a través de cid:logo.png en el cuerpo ['report.xlsx', informar], // adjunto regular ], });
Límite de tamaño: Mantén los archivos adjuntos individuales por debajo de 25 MB (el límite estricto de Gmail). Para archivos grandes, súbelos a un servicio de almacenamiento en la nube e incluye un enlace de descarga en el cuerpo del correo electrónico.
Avanzado

Respuestas, Hilos y Seguimiento

Vaya más allá de los envíos básicos: respuestas de hilos, encabezados personalizados para idempotencia, seguimiento de apertura/clics a través de webhooks y enviar un correo electrónico en nombre de un usuario.

1
Respondiendo a un hilo

Pase el ID del mensaje del proveedor (devuelto en la respuesta de envío original o al listar correos electrónicos) como responder. Unipile inyecta lo correcto En respuesta a y Referencias encabezados para que las respuestas se enlacen correctamente en Gmail, Outlook y clientes IMAP.

hilo-de-respuesta.mjs
await cliente.email.enviar({ account_id: process.env.ID_CUENTA_EMAIL, para: [{ nombre_a_mostrar: 'Alicia', identificador: 'alice@acme.com' }], asunto: 'Re: Tu pregunta', body: '

¡Gracias por contactarnos! Aquí tienes la respuesta...

'
, // ID del mensaje del proveedor del correo electrónico original responder_a: 'msg_xxxxxxxxxxxxxxxx', });
2
Encabezados personalizados e idempotencia

Utilice cabeceras_personalizadas para añadir cualquiera X- encabezado. Un patrón común es X-Idempotency-Key para evitar envíos duplicados al reintentar después de un tiempo de espera de red.

cabeceras-personalizadas.mjs
import { uuid aleatorio } from 'nodo:criptografía'; await cliente.email.enviar({ account_id: process.env.ID_CUENTA_EMAIL, para: [{ nombre_a_mostrar: 'Bob', identificador: 'bob@example.com' }], asunto: 'Confirmación de pedido #9981', body: '

Se confirma tu pedido.

'
, cabeceras_personalizadas: [ { nombre: 'X-Idempotency-Key', valor: UUID aleatorio}, { nombre: 'X-Order-ID', valor: '9981' }, ], });
3
Seguimiento de aperturas y clics a través de webhooks

Habilitar seguimiento en opciones de seguimiento. Unipile dispara un evento webhookemail.abierto / email.enlace_hace_clica tu URL de webhook registrada con el etiqueta Aquí te configuras para poder correlacionar eventos a tus IDs internos.

seguimiento.mjs
await cliente.email.enviar({ account_id: process.env.ID_CUENTA_EMAIL, para: [{ nombre_a_mostrar: 'Plomo', identificador: 'lead@prospect.com' }], asunto: 'Seguimiento de tu prueba', body: '

Hola, quería saludar...

'
, opciones_seguimiento: { aperturas: true, // dispara el webhook email.opened enlaces true, // dispara el webhook email.link_clicked etiqueta: 'crm_lead_12345', // tu ID de correlación interna }, });
4
Enviando en nombre de otro usuario

Al construir aplicaciones SaaS multi-inquilino, cada usuario final vincula su propia cuenta de correo electrónico. Almacene el account_id por usuario en tu base de datos y pásalo en el momento del envío. Consulta la guía completa en cómo enviar correos electrónicos en nombre de un usuario.

a nombre de
// Cada usuario tiene su propio account_id enlazado almacenado en tu base de datos async function enviarComoUsuario(userId, a, asunto, cuerpo) { const usuario = esperará base de datos.obtenerUsuario(userId); return cliente.email.enviaraccount_id: user.unipile_account_id, // por-usuario a, asunto, cuerpo, }); } El correo se envía desde el Gmail de Alice, no desde la dirección de tu servidor await enviarComoUsuario('usuario_alice', destinatarios, asunto, cuerpo);

¿Trabajando con Python en su lugar? Ver nuestro Implementación en Python guía.

Listo para producción

Manejo de Errores y Reintentos

Los fallos de red y los límites de velocidad son inevitables a escala. Aquí tienes un patrón async/await de nivel de producción para tu implementación en JavaScript de la API de envío de correos electrónicos, con reintentos exponenciales y registro estructurado utilizando Winston o Pino.

202
Aceptado
Correo puesto en cola correctamente. El seguimiento_id está poblado. No se necesita reintento.
429
Límite de Tasa
Demasiadas solicitudes. Respeta el Reintentar después Encabezado. Usa retroceso exponencial.
401
No autorizado
Token inválido o caducado. Comprueba UNIPILE_TOKEN variable de entorno. No reintentar - arreglar credenciales.
422
Error de validación
Campo requerido faltante o destinatario mal formado. Revise el cuerpo del error, especifica qué campo falló.
503
Servicio no disponible
Error temporal del servidor. Es seguro reintentar con retroceso. Consulta status.unipile.com para ver incidentes.
404
Cuenta no encontrada
En account_id no existe o fue revocado. Vuelve a vincular la cuenta.
Backoff exponencial con async/await
enviar-con-reintento.mjs
import { UnipileClient } from 'unipile-node-sdk'; import logger from './logger.mjs'; // Winston or Pino instance const client = new UnipileClient(process.env.UNIPILE_DSN, process.env.UNIPILE_TOKEN); async function sendWithRetry(payload, maxAttempts = 4) { let attempt = 0; while (attempt < maxAttempts) { try { const result = await client.email.send(payload); logger.info({ tracking_id: result.tracking_id }, 'Email sent'); return result; } catch (err) { const status = err?.status ?? err?.statusCode; // Do not retry on client errors (4xx except 429) if (status >= 400 && status !== 429 && status < 500) { logger.error({ status, err }, 'Non-retryable error'); throw err; } attempt++; if (attempt >= maxAttempts) throw err; // Exponential backoff: 1s, 2s, 4s, 8s... const delay = 1000 * 2 ** (attempt - 1); logger.warn({ attempt, delay, status }, 'Retrying...'); await new Promise(r => setTimeout(r, delay)); } } } // Usage await sendWithRetry({ account_id: process.env.EMAIL_ACCOUNT_ID, to: [{ display_name: 'User', identifier: 'user@example.com' }], subject: 'Your report is ready', body: '

Click to download.

'
, });
Seguridad

Mejores prácticas de seguridad en Node.js

Tu UNIPILE_TOKEN otorga acceso completo a la API. Nunca la expongas del lado del cliente. Ver el completo Guía de seguridad de API de correo electrónico para temas avanzados que incluyen DKIM, SPF y rotación de tokens OAuth.

Nunca expongas claves en el lado del cliente
Tu UNIPILE_TOKEN debe permanecer en el servidor. Cualquier JavaScript del lado del navegador, incluidos los componentes de cliente de Next.js, el frontend de React o Vite, NO debe importar el token directamente.
Usar una ruta proxy de backend
En Next.js, crea una ruta de API (/api/enviar-correo). En Express, un endpoint POST. Autentica a tus propios usuarios primero, luego llama al servidor de Unipile con el token de la variable de entorno.
Tokens de actualización de OAuth
Unipile gestiona el refresco de tokens OAuth de Gmail y Outlook automáticamente. Tu guardado account_id sigue siendo válido. No necesitas manejar la expiración del token de acceso tú mismo.
DKIM y SPF (reputación del remitente)
Los correos electrónicos enviados a través de cuentas vinculadas de Gmail/Outlook heredan las firmas DKIM de esos proveedores. Para cuentas IMAP/SMTP, configura DKIM en tu servidor de correo antes de vincularlas.
Validar entrada del destinatario
Si los destinatarios provienen de la entrada del usuario, valida el formato del correo electrónico en el servidor antes de llamar a la API. La API rechazará las direcciones mal formadas con un 422, pero la validación antes de la llamada proporciona errores de UX más claros.
Tokens API con ámbito por entorno
Utilice proyectos (y tokens) de Unipile separados para desarrollo, staging y producción. Esto evita que los correos electrónicos de prueba lleguen a usuarios reales y limita el radio de explosión si se filtra una clave.
MAL Token en el código del frontend
// client.js - NUNCA hagas esto const cliente = new UnipileClient( 'https://api4.unipile.com:13444', 'sk_live_xxxxxxxxxx' ¡Expuesto! );
CORREGIR Ruta de proxy de backend (Next.js)
// app/api/send-email/route.js exportar asíncrono función POST(req) { // verificar autenticación primero const session = await getServerSession(); if (!session) return new Response(null,{status:401}); const client = new UnipileClient( process.env.UNIPILE_DSN, // solo-servidor process.env.UNIPILE_TOKEN // solo-servidor ); await client.email.send({...}); }
Lee la guía completa de seguridad de API por correo electrónico
Errores comunes

Errores comunes (específicos de Node.js)

Estos son los errores más frecuentes que cometen los desarrolladores al integrar una API de envío de correos electrónicos en JavaScript por primera vez. Cada uno es fácil de evitar una vez que conoces el patrón, y todos se aplican por igual al contexto de la API de envío de correos electrónicos de Node.js.

1
Olvidar await de nivel superior (CommonJS vs ESM)
Nivel superior await solo funciona en módulos ES (.mjs o "tipo":"módulo"). En CommonJS, envuelve tu llamada send en un asíncrono IIFE o usar .entonces(). El SDK funciona en ambos, solo elige el formato de módulo correcto.
cjs-workaround.cjs
// CommonJS: envolver en IIFE asíncrona (asíncrono () => { const { UnipileClient } = esperará import('unipile-node-sdk'); const client = nuevo UnipileClient(process.env.UNIPILE_DSN, process.env.UNIPILE_TOKEN); await cliente.email.enviar({ /* ... */ }); })();
2
Usar Promise.all para envíos masivos sin tener en cuenta los límites de velocidad
Disparando 1000 Promise.all se enviarán simultáneamente, lo que alcanzará los límites de tasa y provocará errores 429. Usa un limitador de concurrencia como límite-p para limitar las solicitudes paralelas.
bulk-send.mjs
import límite de p from 'límite-p'; const límite = LímiteP(5); // máx 5 envíos simultáneos const resultados = esperará Promise.alldestinatarios.mapar => límite(() => cliente.email.enviarid_de_cuenta: process.env.ID_CUENTA_EMAIL, para: [r], asunto, cuerpo, }))) );
3
Codificación de búfer incorrecta para los archivos adjuntos
Siempre pasa un bruto Tampón objeto - no es una cadena base64, no es una cadena UTF-8. Si tienes contenido base64 (por ejemplo, de un webhook o una respuesta de API), conviértelo primero: Buffer.from(cadenaBase64, 'base64').
buffer-codificación.mjs
// INCORRECTO: pasando una cadena adjuntos: [['archivo.pdf', 'JVBERi0xLjQ...']] // cadena base64 - ¡se rompe! // CORRECTO: Objeto buffer adjuntos: [['archivo.pdf', Tampón.from(cadena_base64, base64)]] // o desde el disco: adjuntos: [['archivo.pdf', await fs.leerArchivo('./archivo.pdf')]]
4
Rechazos de Promesas no manejados que bloquean el proceso
En Node.js, un rechazo no manejado en un "fire-and-forget" enviar() La llamada bloqueará el proceso en Node 15+. Siempre await el resultado o adjuntar un .atrapó() manejador.
rechazo-no-manejado.mjs
// INCORRECTO: "dispara y olvida" - falla en caso de error en Node 15+ cliente.email.enviar(carga útil); // sin await, sin .catch() // CORRECTO: siempre maneja la promesa await cliente.email.enviar(carga útil) // opción 1: await .captura(error => registrador.error(err)); // opción 2: .catch()
5
Usando esta API directamente en JavaScript del navegador
El SDK de Unipile y tu UNIPILE_TOKEN son solo para Node.js del lado del servidor. La recuperación del navegador directamente a la API expondría su token. Utilice una ruta de backend (ruta API de Next.js, punto final de Express, función de Netlify/Vercel) como proxy.
6
Envío sin una cuenta vinculada (falta account_id)
No puedes enviar desde una dirección genérica; cada envío debe hacer referencia a una dirección válida account_id de una cuenta de Gmail, Outlook o IMAP previamente vinculada. La API devuelve 404 si falta el `account_id` o si la cuenta fue desvinculada.

Preguntas frecuentes

Preguntas frecuentes sobre el envío de correos electrónicos en JavaScript y Node.js con la API unificada de correo electrónico de Unipile.

Utilice la API unificada de correo electrónico de Unipile en lugar de una conexión SMTP directa. Instalar unipile-node-sdk, inicializar UnipileClient Con tu DSN y token, vincule una cuenta de Gmail o Outlook a través de OAuth, luego llame client.email.enviar(). No hay servidor SMTP, ni puerto 587, ni configuración TLS necesaria de tu parte: Unipile se encarga de la capa de transporte.

No, y no deberías. Llamar a la API de Unipile desde JavaScript en el navegador expondría tu UNIPILE_TOKEN a cualquier usuario que abra las DevTools. Siempre llame a la API desde un contexto Node.js del lado del servidor: una ruta de Express, una ruta de API de Next.js (app/api/), una Vercel Edge Function o una Netlify Function.

Tu frontend envía una solicitud a tu propio endpoint de backend, que autentica la sesión del usuario y luego llama a Unipile del lado del servidor.

Nodemailer se conecta directamente a un servidor SMTP desde tu proceso de Node.js. Requiere que gestiones las credenciales SMTP, manejes TLS, configures DKIM tú mismo y lidies con las peculiaridades de cada proveedor por separado.

La API de correo electrónico de Unipile es una capa de abstracción en la nube: vinculas cuentas a través de OAuth (no se necesitan credenciales SMTP para Gmail/Outlook), obtienes un SDK unificado para todos los proveedores, y Unipile maneja la transmisión, los reintentos y la actualización de tokens. La contrapartida es que tus envíos pasan por la infraestructura de Unipile en lugar de una conexión SMTP directa.

Sí. El unipile-node-sdk paquete se distribuye con definiciones de tipos de TypeScript. Obtienes autocompletado completo y seguridad de tipos para enviar() carga útil, incluyendo Destinatario, opciones de seguimiento, y el tipo de respuesta.

import { UnipileClient } from 'unipile-node-sdk'; // Tipos TS completos: el autocompletado funciona en VSCode const cliente: UnipileClient = nuevo UnipileClient(dsn, token); const resultado = esperará cliente.email.enviar({ /* ¡escrito! */ });

Para envíos de gran volumen, usa un limitador de concurrencia (por ejemplo,. límite-p con 5-10 llamadas concurrentes), añadiendo reintento exponencial en respuestas 429 y distribuyendo los envíos entre varias cuentas enlazadas si es posible. Cada cuenta de correo electrónico enlazada tiene sus propios límites de envío establecidos por el proveedor (Gmail: ~500/día para cuentas normales, más alto para Workspace).

Para correo masivo/de marketing real a escala (millones de destinatarios), considere un ESP dedicado (Mailgun, SendGrid) junto con Unipile para envíos transaccionales y basados en OAuth.

Next.js: usar rutas de APIapp/api/enviar-correo/ruta.js) o Acciones de Servidor. Mantén la instanciación del SDK solo en el lado del servidor.

Nuxt: usar rutas de servidorservidor/api/enviar-email.post.tsEl SDK solo es compatible con Node.js, por lo que no puede incluirse en un componente reutilizable (composable) o un plugin que se ejecute en el cliente.

NestJS: crear un Módulo de correo electrónico con un servicio que envuelve UnipileClient. Inyéctalo donde necesites para activar envíos: en controladores, trabajos CRON o manejadores de eventos.

¿Aún tiene preguntas? Nuestro equipo está aquí para ayudarle.

es_ESES