Skip to content

aedmadrid/edmailrelay

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

edmailrelay

Proxy IMAP para EducaMadrid. Expone endpoints HTTP que se conectan a servidores IMAP (por defecto imap.educa.madrid.org) y devuelven emails en formato JSON. También permite enviar emails vía SMTP.

Endpoints

Método Ruta Descripción
GET /api/health Health check
POST /api/inbox Últimos 10 emails (envelope + flags + attachments)
POST /api/inbox100 Últimos 100 emails (misma estructura que /api/inbox)
POST /api/email/:uid Contenido HTML de un email por UID
POST /api/email/:uid/read Marcar email como leído
POST /api/email/:uid/unread Marcar email como no leído
POST /api/send Enviar email HTML vía SMTP
GET /api/file/:uidAndPart/:filename Descargar adjunto
POST /api/register-push-token Registrar token de notificaciones push

POST /api/inbox y /api/inbox100

Body JSON:

{
  "email": "usuario_sin_dominio",
  "password": "contraseña",
  "imapHost": "imap.educa.madrid.org"
}

Respuesta:

{
  "success": true,
  "data": [
    {
      "uid": 1189,
      "id": "9c7553506b3e1792376e5b659109291f",
      "subject": "Asunto del email",
      "from": "remitente@example.com",
      "fromName": "Nombre Remitente",
      "date": "2026-06-16T17:36:42.000Z",
      "unread": true,
      "attachments": [
        {
          "filename": "documento.pdf",
          "mimeType": "application/pdf",
          "size": 123456,
          "url": "/api/file/1189-2/documento.pdf"
        }
      ]
    }
  ]
}

POST /api/email/:uid

Body JSON:

{
  "email": "usuario_sin_dominio",
  "password": "contraseña",
  "imapHost": "imap.educa.madrid.org"  // opcional
}

Devuelve:

{
  "success": true,
  "data": {
    "uid": 123,
    "html": "<html>...</html>"
  }
}

Si el email no tiene HTML, devuelve el texto plano como fallback.

POST /api/email/:uid/read

Body JSON:

{
  "email": "usuario_sin_dominio",
  "password": "contraseña",
  "imapHost": "imap.educa.madrid.org"
}

Marca el email con el flag \Seen (leído). Respuesta:

{ "success": true, "data": { "uid": 123, "unread": false } }

POST /api/email/:uid/unread

Body JSON: mismo que /read. Quita el flag \Seen. Respuesta:

{ "success": true, "data": { "uid": 123, "unread": true } }

POST /api/send

Envía un email HTML vía SMTP (smtp.educa.madrid.org:587, STARTTLS).

Body JSON:

{
  "email": "usuario_sin_dominio",
  "password": "contraseña",
  "to": "destinatario@example.com",
  "subject": "Asunto del correo",
  "html": "<p>Contenido HTML</p>",
  "smtpHost": "smtp.educa.madrid.org"
}

El from se construye automáticamente como usuario_sin_dominio@educa.madrid.org. Respuesta:

{ "success": true, "data": { "messageId": "<abc123@...>", "accepted": ["destinatario@example.com"] } }

GET /api/file/:uidAndPart/:filename

Descarga un adjunto. El :uidAndPart es UID-PARTE (ej. 1189-2). La parte se obtiene de attachments[].url en /api/inbox.

Query string: ?email=xxx&password=xxx&imapHost=xxx

Ejemplo: GET /api/file/1189-2/documento.pdf?email=usuario&password=clave

POST /api/register-push-token

Registra un token de Expo Push para recibir notificaciones de nuevos correos.

Body JSON:

{
  "email": "usuario_sin_dominio",
  "token": "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]",
  "password": "contraseña",
  "imapHost": "imap.educa.madrid.org"
}
  • email y token son obligatorios.
  • Si se incluye password, se guardan también las credenciales IMAP necesarias para la tarea de notificaciones.
  • Si el email ya estaba registrado, se actualiza el token y/o las credenciales.

Respuesta:

{ "success": true, "data": { "email": "usuario_sin_dominio", "hasCredentials": true } }

Notificaciones push

El servidor ejecuta una tarea cada 10 minutos que:

  1. Lee todos los usuarios registrados con push token + credenciales IMAP.
  2. Para cada usuario, conecta a IMAP y busca emails no leídos (UNSEEN).
  3. Por cada email nuevo no notificado, envía una push individual vía Expo con el asunto del correo.
  4. Las notificaciones enviadas se registran para no repetirlas.
  5. Se limpian registros de notificaciones de más de 30 días.

Variables de entorno necesarias:

  • EXPO_ACCESS_TOKEN — token de acceso de Expo (opcional, para proyectos EAS)
  • EXPO_PROJECT_ID — ID del proyecto EAS (opcional)

Variables de entorno

Variable Descripción Por defecto
PORT Puerto del servidor 3000
IMAP_HOST Servidor IMAP por defecto imap.educa.madrid.org
EXPO_ACCESS_TOKEN Token de acceso para Expo Push (opcional)
EXPO_PROJECT_ID ID del proyecto EAS para Expo Push (opcional)

Desarrollo local

npm install
npm start

Despliegue (Coolify - Node.js App)

  1. Conecta tu repositorio de GitHub en Coolify.
  2. Selecciona "Node.js App" (Coolify detectará automáticamente package.json).
  3. El comando de inicio por defecto será npm start (ejecuta node server.js).
  4. Configura las variables de entorno necesarias en el panel de Coolify (puedes dejar IMAP_HOST con el valor por defecto).
  5. Despliega.

Tecnologías

  • Node.js + Express
  • ImapFlow
  • Nodemailer
  • CORS
  • dotenv
  • better-sqlite3
  • expo-server-sdk

About

Relay para correo EducaMadrid en la ASO.app

Resources

License

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors