Wiki

Índice

AutoMail — envío por Gmail SMTP

Mini API PHP en el host lu-zero que envía correos con plantilla primordial vía Gmail SMTP (smtp.gmail.com:587). Soporta adjuntos opcionales en base64. No está en este servidor (wiki); vive en automail.lu-zero.ldeluipy.es.

Resumen

  • Docs públicas: https://automail.lu-zero.ldeluipy.es/
  • Endpoint: POST https://automail.lu-zero.ldeluipy.es/api/send.php
  • Document root (lu-zero): /var/www/automail.lu-zero.ldeluipy.es
  • Secretos: private/config.php (Apache: Require all denied en private/ y lib/)

Autenticación

Una de estas cabeceras (mismo token):

  • Authorization: Bearer TU_API_KEY
  • X-API-Token: TU_API_KEY

Comparación con hash_equals. Sin token o incorrecto → 401.

Importante: no pongas el token real en la wiki, en git ni en páginas públicas. Léelo en el servidor desde private/config.php (api_token).

Cuerpo JSON

Campos principales:

  • to — destinatario (también acepta mail / email)
  • subject — asunto (también asunto)
  • text — texto plano (también body / texto); se convierte a HTML seguro en la plantilla
  • html — HTML propio (se sanea: sin scripts, iframes ni eventos JS) y se inserta en la plantilla
  • attachments — opcional (también files / adjuntos): array de adjuntos en base64

La API envía siempre multipart (texto + HTML). Con adjuntos usa multipart/mixed envolviendo el alternative.

{
  "to": "mail@ejemplo.com",
  "subject": "Hola",
  "text": "hola que tal"
}
{
  "to": "mail@ejemplo.com",
  "subject": "Resumen",
  "html": "<p>hola que tal</p>"
}

Adjuntos

Cada elemento del array:

  • filename (obligatorio) — nombre seguro (sin rutas; se sanea en el servidor)
  • content (obligatorio) — contenido en base64
  • mime (opcional) — si falta, se infiere por extensión; si no se puede, se rechaza

Límites (configurables en private/config.phpattachments):

  • Máximo 5 adjuntos por correo
  • ~5 MB por fichero (decodificado)
  • ~8 MB totales (decodificados)
  • MIME allowlist: application/pdf, text/plain, text/csv, image/png, image/jpeg, application/zip

Base64 inválido, tamaño excedido o MIME no permitido → 400 con mensaje claro. Sin adjuntos el contrato anterior no cambia.

{
  "to": "mail@ejemplo.com",
  "subject": "CV adjunto",
  "text": "Te envío el CV en PDF.",
  "attachments": [
    {
      "filename": "cv_ejemplo.pdf",
      "mime": "application/pdf",
      "content": "<BASE64>"
    }
  ]
}

Ejemplo curl

curl -sS -X POST 'https://automail.lu-zero.ldeluipy.es/api/send.php' \
  -H 'Authorization: Bearer TU_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"to":"mail@ejemplo.com","subject":"Hola","text":"hola que tal"}'

Con PDF:

B64=$(base64 -w0 archivo.pdf)
curl -sS -X POST 'https://automail.lu-zero.ldeluipy.es/api/send.php' \
  -H 'Authorization: Bearer TU_API_KEY' \
  -H 'Content-Type: application/json' \
  -d "{\"to\":\"mail@ejemplo.com\",\"subject\":\"CV\",\"text\":\"Adjunto PDF\",\"attachments\":[{\"filename\":\"cv.pdf\",\"mime\":\"application/pdf\",\"content\":\"$B64\"}]}"

Respuestas

  • 200{"ok":true,"to":"...","subject":"..."}; con adjuntos también attachments_count y attachments (lista de filenames, sin base64)
  • 400 — JSON, campos, base64, MIME o límites incorrectos
  • 401 — token inválido o ausente
  • 405 — método distinto de POST
  • 500 — fallo SMTP (revisar logs en lu-zero)

Gmail (servidor)

En Google Account → Seguridad → 2FA → Contraseñas de aplicaciones. Esa App Password va en private/config.php como smtp.password (sin espacios). Remitente = misma cuenta Gmail (smtp.username / from_address).

No documentes aquí la App Password ni el token; solo en el servidor o en un gestor de secretos.

Dónde está

Host lu-zero (lu-zero.ldeluipy.es), no este VPS de la wiki. Vhost Apache típico: automail.lu-zero.ldeluipy.es.conf.