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.
| 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 |
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"
}
]
}
]
}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.
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 } }Body JSON: mismo que /read. Quita el flag \Seen. Respuesta:
{ "success": true, "data": { "uid": 123, "unread": true } }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"] } }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
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"
}emailytokenson 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 } }El servidor ejecuta una tarea cada 10 minutos que:
- Lee todos los usuarios registrados con push token + credenciales IMAP.
- Para cada usuario, conecta a IMAP y busca emails no leídos (
UNSEEN). - Por cada email nuevo no notificado, envía una push individual vía Expo con el asunto del correo.
- Las notificaciones enviadas se registran para no repetirlas.
- 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)
| 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) |
npm install
npm start- Conecta tu repositorio de GitHub en Coolify.
- Selecciona "Node.js App" (Coolify detectará automáticamente
package.json). - El comando de inicio por defecto será
npm start(ejecutanode server.js). - Configura las variables de entorno necesarias en el panel de Coolify (puedes dejar
IMAP_HOSTcon el valor por defecto). - Despliega.
- Node.js + Express
- ImapFlow
- Nodemailer
- CORS
- dotenv
- better-sqlite3
- expo-server-sdk