Plugin — Buzón IMAP (Inbox)
Plugin — IMAP Inbox
El plugin Inbox revisa periódicamente buzones de correo IMAP y convierte cada correo no leído en una tarea cascarón. Opera como una tarea Celery Beat programada, sin necesidad de webhook.
Diferencia con los otros plugins
A diferencia de Telegram y Gitea (que reaccionan al instante por webhook), Inbox consulta activamente el servidor de correo cada cierto tiempo. El intervalo lo define la configuración de Celery Beat en el servidor.
Configuración del PluginConfig
El token cifrado para Inbox no es un token simple sino un JSON con las credenciales IMAP completas:
{
"user": "pedro@gmail.com",
"pass": "xxxx xxxx xxxx xxxx",
"host": "imap.gmail.com"
}
Registrar un buzón paso a paso
-
Preparar las credenciales IMAP
Proveedor Host IMAP Contraseña Gmail imap.gmail.comApp Password (16 caracteres) Outlook / Hotmail outlook.office365.comContraseña normal o App Password Custom (Postfix/Dovecot) Tu dominio Contraseña de la cuenta -
Registrar el PluginConfig en Joe
import json from apps.common.models import PluginConfig credenciales = json.dumps({ "user": "pedro@gmail.com", "pass": "abcd efgh ijkl mnop", "host": "imap.gmail.com" }) config = PluginConfig( usuario=user, servicio="inbox", identificador="pedro@gmail.com", metadatos={}, ) config.set_token(credenciales) # Cifra el JSON completo con Fernet config.save() -
Verificar que Celery Beat esté activo
# La tarea debe estar registrada en CELERY_BEAT_SCHEDULE en settings.py: # 'check-email-inbox': { # 'task': 'plugins.inbox.tasks.check_email_inbox', # 'schedule': crontab(minute='*/15'), # cada 15 minutos # } # Verificar desde el shell de Django: from plugins.inbox.tasks import check_email_inbox result = check_email_inbox.delay() print(result.get()) # "N correos nuevos procesados."
Flujo de procesamiento de correos
- Celery Beat ejecuta
check_email_inbox()según el schedule configurado. - Se cargan todos los
PluginConfigconservicio='inbox'yactivo=True. - Por cada config, se descifra el token JSON y se conecta al servidor IMAP via SSL.
- Se buscan correos con estado
UNSEEN(no leídos) en la carpetaINBOX. - Por cada correo encontrado, se crea una tarea cascarón con:
tipo=inbox_emailestado=cuarentena- Asunto como título, remitente y cuerpo del texto en descripción
- Los correos procesados quedan marcados como leídos en el servidor IMAP.
Campos en metadatos_extra de la tarea
| Campo | Descripción |
|---|---|
plugin_id | ID del PluginConfig que procesó el correo. |
owner_id | ID del usuario dueño del buzón. |
from | Dirección del remitente (From: header). |
subject | Asunto del correo (decodificado de MIME). |
canal | Siempre "inbox". |
Formato de la tarea generada
| Campo de Tarea | Valor |
|---|---|
titulo | "Correo: {asunto}" (máx. 100 chars del asunto) |
tipo | inbox_email |
descripcion | "Remitente: {from}\n\n{body}" (máx. 1000 chars del body) |
creador | None (cascarón, Dify lo adoptará) |
estado | cuarentena |
Limitaciones en V1
- Solo se procesa texto plano (
text/plain). Los correos HTML-only no extraen cuerpo. - Los adjuntos son ignorados.
- Solo se revisa la carpeta
INBOX(no subcarpetas). - No hay deduplicación: si un correo queda UNSEEN por error, puede re-procesarse.
Campos del PluginConfig para Inbox
| Campo | Valor esperado |
|---|---|
servicio | "inbox" |
identificador | Dirección de correo: pedro@gmail.com |
token_cifrado | JSON cifrado con Fernet: {"user": "...", "pass": "...", "host": "..."} |
metadatos | Puede quedar vacío {}. No requiere configuración adicional. |
The Inbox plugin periodically checks IMAP mailboxes and converts each unread email into a shell task. It operates as a scheduled Celery Beat task, with no webhook needed.
Difference from other plugins
Unlike Telegram and Gitea (which react instantly via webhook), Inbox actively polls the mail server at regular intervals. The interval is defined by the Celery Beat configuration on the server.
PluginConfig configuration
The encrypted token for Inbox is not a simple token but a JSON with the full IMAP credentials:
{
"user": "pedro@gmail.com",
"pass": "xxxx xxxx xxxx xxxx",
"host": "imap.gmail.com"
}
Register a mailbox step by step
-
Prepare IMAP credentials
Provider IMAP Host Password Gmail imap.gmail.comApp Password (16 characters) Outlook / Hotmail outlook.office365.comRegular or App Password Custom (Postfix/Dovecot) Your domain Account password -
Register the PluginConfig in Joe
import json from apps.common.models import PluginConfig credentials = json.dumps({ "user": "pedro@gmail.com", "pass": "abcd efgh ijkl mnop", "host": "imap.gmail.com" }) config = PluginConfig( usuario=user, servicio="inbox", identificador="pedro@gmail.com", metadatos={}, ) config.set_token(credentials) # Encrypts the full JSON with Fernet config.save() -
Verify Celery Beat is active
# The task must be registered in CELERY_BEAT_SCHEDULE in settings.py: # 'check-email-inbox': { # 'task': 'plugins.inbox.tasks.check_email_inbox', # 'schedule': crontab(minute='*/15'), # every 15 minutes # } # Verify from the Django shell: from plugins.inbox.tasks import check_email_inbox result = check_email_inbox.delay() print(result.get()) # "N new emails processed."
Email processing flow
- Celery Beat executes
check_email_inbox()according to the configured schedule. - All
PluginConfigentries withservicio='inbox'andactivo=Trueare loaded. - For each config, the JSON token is decrypted and a connection to the IMAP server over SSL is established.
- Emails with
UNSEENstatus in theINBOXfolder are searched. - For each email found, a shell task is created with:
tipo=inbox_emailestado=cuarentena- Subject as title, sender and text body in description
- Processed emails are marked as read on the IMAP server.
Fields in task metadatos_extra
| Field | Description |
|---|---|
plugin_id | PluginConfig ID that processed the email. |
owner_id | ID of the mailbox owner user. |
from | Sender address (From: header). |
subject | Email subject (MIME-decoded). |
canal | Always "inbox". |
V1 limitations
- Only plain text (
text/plain) is processed. HTML-only emails don't extract body. - Attachments are ignored.
- Only the
INBOXfolder is checked (no subfolders). - No deduplication: if an email remains UNSEEN due to an error, it may be re-processed.
PluginConfig fields for Inbox
| Field | Expected value |
|---|---|
servicio | "inbox" |
identificador | Email address: pedro@gmail.com |
token_cifrado | Fernet-encrypted JSON: {"user": "...", "pass": "...", "host": "..."} |
metadatos | Can be left empty {}. No additional configuration required. |