Skip to content
Esta página fue generada y traducida con asistencia de IA. Si encuentra alguna imprecisión, no dude en ayudar a mejorarla. Editar en GitHub

Configuración IMAP ​

PRX-Email se conecta a servidores IMAP sobre TLS usando la biblioteca rustls. Soporta autenticación por contraseña y XOAUTH2 para Gmail y Outlook. La sincronización de bandeja de entrada es basada en UID e incremental, con persistencia de cursor en la base de datos SQLite.

Configuración IMAP Básica ​

rust
use prx_email::plugin::{ImapConfig, AuthConfig};

let imap = ImapConfig {
    host: "imap.example.com".to_string(),
    port: 993,
    user: "[email protected]".to_string(),
    auth: AuthConfig {
        password: Some("your-app-password".to_string()),
        oauth_token: None,
    },
};

Campos de Configuración ​

CampoTipoRequeridoDescripción
hostStringSíNombre de host del servidor IMAP (no debe estar vacío)
portu16SíPuerto del servidor IMAP (típicamente 993 para TLS)
userStringSíNombre de usuario IMAP (generalmente la dirección de email)
auth.passwordOption<String>Uno deContraseña de app para IMAP LOGIN
auth.oauth_tokenOption<String>Uno deToken de acceso OAuth para XOAUTH2

Autenticación

Exactamente uno de password u oauth_token debe estar establecido. Establecer ambos o ninguno resultará en un error de validación.

Ajustes Comunes de Proveedores ​

ProveedorHostPuertoMétodo de Auth
Gmailimap.gmail.com993Contraseña de app o XOAUTH2
Outlook / Office 365outlook.office365.com993XOAUTH2 (recomendado)
Yahooimap.mail.yahoo.com993Contraseña de app
Fastmailimap.fastmail.com993Contraseña de app
ProtonMail Bridge127.0.0.11143Contraseña del bridge

Sincronizar la Bandeja de Entrada ​

El método sync se conecta al servidor IMAP, selecciona una carpeta, obtiene nuevos mensajes por UID y los almacena en SQLite:

rust
use prx_email::plugin::SyncRequest;

plugin.sync(SyncRequest {
    account_id: 1,
    folder: Some("INBOX".to_string()),
    cursor: None,        // Resume from last saved cursor
    now_ts: now,
    max_messages: 100,   // Fetch at most 100 messages per sync
})?;

Flujo de Sincronización ​

mermaid
sequenceDiagram
    participant Plugin as EmailPlugin
    participant DB as SQLite
    participant IMAP as IMAP Server

    Plugin->>DB: Load sync cursor for account/folder
    Plugin->>IMAP: TLS Connect + Login/XOAUTH2
    Plugin->>IMAP: SELECT folder
    Plugin->>IMAP: UID SEARCH (from cursor+1)
    IMAP-->>Plugin: UID list
    loop Each UID
        Plugin->>IMAP: UID FETCH (RFC822)
        IMAP-->>Plugin: Raw message
        Plugin->>Plugin: Parse MIME (headers, body, attachments)
        Plugin->>DB: UPSERT message
    end
    Plugin->>DB: Update sync cursor
    Plugin->>IMAP: LOGOUT

Sincronización Incremental ​

PRX-Email usa cursores basados en UID para evitar re-obtener mensajes. Después de cada sincronización:

  1. El UID más alto visto se guarda como cursor
  2. La siguiente sincronización empieza desde cursor + 1
  3. Los mensajes con pares (account_id, message_id) existentes se actualizan (UPSERT)

El cursor se almacena en la tabla sync_state con la clave compuesta (account_id, folder_id).

Sincronización Multi-Carpeta ​

Sincroniza múltiples carpetas para la misma cuenta:

rust
for folder in &["INBOX", "Sent", "Drafts", "Archive"] {
    plugin.sync(SyncRequest {
        account_id,
        folder: Some(folder.to_string()),
        cursor: None,
        now_ts: now,
        max_messages: 100,
    })?;
}

Programador de Sincronización ​

Para sincronización periódica, usa el runner de sincronización integrado:

rust
use prx_email::plugin::{SyncJob, SyncRunnerConfig};

let jobs = vec![
    SyncJob { account_id: 1, folder: "INBOX".into(), max_messages: 100 },
    SyncJob { account_id: 1, folder: "Sent".into(), max_messages: 50 },
    SyncJob { account_id: 2, folder: "INBOX".into(), max_messages: 100 },
];

let config = SyncRunnerConfig {
    max_concurrency: 4,         // Max jobs per runner tick
    base_backoff_seconds: 10,   // Initial backoff on failure
    max_backoff_seconds: 300,   // Maximum backoff (5 minutes)
};

let report = plugin.run_sync_runner(&jobs, now, &config);
println!(
    "Run {}: attempted={}, succeeded={}, failed={}",
    report.run_id, report.attempted, report.succeeded, report.failed
);

Comportamiento del Programador ​

  • Límite de concurrencia: Como máximo max_concurrency trabajos se ejecutan por ciclo
  • Retroceso por fallo: Retroceso exponencial con fórmula base * 2^fallos, limitado en max_backoff_seconds
  • Verificación de vencimiento: Los trabajos se omiten si su ventana de retroceso no ha transcurrido
  • Seguimiento de estado: Por clave cuenta::carpeta, rastrea (next_allowed_at, failure_count)

Análisis de Mensajes ​

Los mensajes entrantes se analizan usando el crate mail-parser con la siguiente extracción:

CampoFuenteNotas
message_idEncabezado Message-IDRecurre a SHA-256 de bytes raw
subjectEncabezado Subject
senderPrimera dirección del encabezado From
recipientsTodas las direcciones del encabezado ToSeparadas por comas
body_textPrimera parte text/plain
body_htmlPrimera parte text/htmlRespaldo: extracción de sección raw
snippetPrimeros 120 caracteres de body_text o body_html
references_headerEncabezado ReferencesPara threading
attachmentsPartes MIME de adjuntosMetadatos serializados JSON

TLS ​

Todas las conexiones IMAP usan TLS vía rustls con el bundle de certificados webpki-roots. No hay opción para deshabilitar TLS o usar STARTTLS -- las conexiones siempre están cifradas desde el inicio.

Siguientes Pasos ​

Released under the Apache-2.0 License.