Correo · Nebo AI

Cada cliente conecta su Gmail desde su panel (OAuth, solo permiso de enviar) y sus flujos envían desde esa cuenta. Política de privacidad.

1. En el panel: botón "Conectar Gmail"

El servidor del panel guarda la clave del cliente y expone tres rutas propias (solo para admins); la tarjeta las llama:

<div id="correo"></div>
<script src="https://correo.neboaiconsulting.com/embed.js"></script>
<script>
  NeboCorreo.montar(document.getElementById('correo'), {
    estado:      () => miApi.get('/api/correo'),            // → { conectado, email, desde }
    sesion:      () => miApi.post('/api/correo/sesion'),    // → { url }
    desconectar: () => miApi.del('/api/correo'),
    titulo: 'Correo para cobranzas',
  });
</script>

Y en el servidor del panel, cada ruta reenvía al servicio con la clave:

const CORREO = { url: process.env.CORREO_URL, clave: process.env.CORREO_CLAVE };
const correo = (metodo, ruta, cuerpo) => fetch(CORREO.url + ruta, {
  method: metodo, headers: { 'x-api-key': CORREO.clave, 'content-type': 'application/json' },
  body: cuerpo && JSON.stringify(cuerpo) }).then(r => r.json());

app.get('/api/correo', soloAdmin, async (req, res) => res.json(await correo('GET', '/v1/conexion')));
app.post('/api/correo/sesion', soloAdmin, async (req, res) =>
  res.json(await correo('POST', '/v1/conexion/sesion', { origen: req.get('origin') })));
app.delete('/api/correo', soloAdmin, async (req, res) => res.json(await correo('DELETE', '/v1/conexion')));

2. En n8n: enviar

Nodo HTTP Request: POST https://correo.neboaiconsulting.com/v1/enviar, autenticación Header Auth (x-api-key = la clave del cliente), cuerpo JSON:

{
  "para": "deudor@empresa.com",                 // o "Nombre <a@x.com>, b@y.com" o una lista
  "cc": "", "bcc": "",
  "asunto": "Recordatorio de pago — factura 123",
  "html": "<p>Hola…</p>",                       // y/o "texto"
  "nombreRemitente": "Cobros JH",
  "responderA": "cobros@empresa.com",
  "adjuntos": [
    { "url": "https://pdfjh.neboaiconsulting.com/archivos/…/factura.pdf" },
    { "nombre": "detalle.csv", "tipo": "text/csv", "base64": "…" }
  ]
}

Respuesta: { "ok": true, "id": "…", "de": "cobros@empresa.com" }.

CódigoCuándo
400Falta un campo, un correo no es válido, un encabezado trae saltos de línea, un adjunto no es público o pasan de 20 MB.
401Sin clave o clave no válida.
409El cliente no tiene Gmail conectado, o Google retiró el permiso (queda desconectado: hay que volver a conectar desde el panel).
502Gmail no aceptó el envío (el mensaje lo explica).