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.

Mecanismo: Polling (Celery Beat)  ·  Protocolo: IMAP sobre SSL  ·  Trigger: Programado, no en tiempo real

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"
}
Gmail: Usa una Contraseña de aplicación (App Password), no tu contraseña normal. Ve a Cuenta de Google → Seguridad → Verificación en dos pasos → Contraseñas de aplicaciones.

Registrar un buzón paso a paso

  1. Preparar las credenciales IMAP
    ProveedorHost IMAPContraseña
    Gmailimap.gmail.comApp Password (16 caracteres)
    Outlook / Hotmailoutlook.office365.comContraseña normal o App Password
    Custom (Postfix/Dovecot)Tu dominioContraseña de la cuenta
  2. 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()
  3. 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

  1. Celery Beat ejecuta check_email_inbox() según el schedule configurado.
  2. Se cargan todos los PluginConfig con servicio='inbox' y activo=True.
  3. Por cada config, se descifra el token JSON y se conecta al servidor IMAP via SSL.
  4. Se buscan correos con estado UNSEEN (no leídos) en la carpeta INBOX.
  5. Por cada correo encontrado, se crea una tarea cascarón con:
    • tipo=inbox_email
    • estado=cuarentena
    • Asunto como título, remitente y cuerpo del texto en descripción
  6. Los correos procesados quedan marcados como leídos en el servidor IMAP.

Campos en metadatos_extra de la tarea

CampoDescripción
plugin_idID del PluginConfig que procesó el correo.
owner_idID del usuario dueño del buzón.
fromDirección del remitente (From: header).
subjectAsunto del correo (decodificado de MIME).
canalSiempre "inbox".

Formato de la tarea generada

Campo de TareaValor
titulo"Correo: {asunto}" (máx. 100 chars del asunto)
tipoinbox_email
descripcion"Remitente: {from}\n\n{body}" (máx. 1000 chars del body)
creadorNone (cascarón, Dify lo adoptará)
estadocuarentena

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

CampoValor esperado
servicio"inbox"
identificadorDirección de correo: pedro@gmail.com
token_cifradoJSON cifrado con Fernet: {"user": "...", "pass": "...", "host": "..."}
metadatosPuede quedar vacío {}. No requiere configuración adicional.