Carpetas Spam/Junk y estándar ausentes tras migración de cPanel a DirectAdmin

Entorno

  • Servidor DirectAdmin con Dovecot (IMAP/LMTP) + Exim (MTA) + Roundcube (Webmail)
  • Formato de suscripciones Dovecot v2
  • Correo almacenado en formato Maildir

Problema

Tras migrar cuentas de correo de cPanel a DirectAdmin, los usuarios reportan que los correos de Spam/Junk no son visibles en Roundcube. Al investigar, todas las carpetas estándar (Drafts, Sent, Trash, Junk) también pueden estar ausentes de la interfaz de webmail.

Causa raíz

Tres problemas causados por la migración de cPanel a DirectAdmin:

1. Nombre incorrecto de carpeta spam en el archivo de suscripciones

cPanel usa spam como nombre de carpeta IMAP para correo basura. DirectAdmin usa INBOX.spam. Después de la migración, el archivo de suscripciones de Dovecot aún referencia el nombre antiguo de cPanel, por lo que la carpeta no es visible en Roundcube aunque Exim entrega el spam correctamente a .INBOX.spam/new/.

2. Suscripciones de carpetas estándar faltantes

Los archivos de suscripciones migrados no tienen entradas para las carpetas IMAP estándar: Drafts, Sent, Trash y Junk. Estas carpetas existen en disco (como .Drafts, .Sent, .Trash, .Junk dentro de Maildir) pero no están listadas en el archivo de suscripciones.

El archivo de suscripciones de una cuenta nativa de DirectAdmin se ve así:

Drafts
INBOX.spam
Junk
Sent
Trash
V    2

Una cuenta migrada solo tiene:

V    2

spam
Archive
...

3. Propiedad del archivo cambiada a root tras ediciones por CLI

Al editar archivos de suscripciones con sed -i como root, el flag -i crea un archivo temporal y reemplaza el original, cambiando la propiedad a root:root. Dovecot se ejecuta como el usuario del sistema, por lo que Roundcube devuelve "Unable to perform operation, permission denied".

Propiedad correcta: {da_user}:mail con permisos 660.

Ubicación de archivos relevantes

Archivo Propósito
/home/{user}/imap/{domain}/{account}/Maildir/subscriptions Suscripciones de carpetas IMAP de Dovecot (controla lo que muestra Roundcube)
/etc/virtual/{domain}/filter Filtro a nivel de dominio de Exim (maneja el enrutamiento de entrega de spam)
/etc/dovecot/conf/namespace_private.conf Configuración de namespace de Dovecot (define carpetas de uso especial)

Solución

Paso 1: Reemplazar nombre de carpeta de cPanel con el de DirectAdmin

for acc in usuario1 usuario2 usuario3; do
    sub="/home/{da_user}/imap/{dominio}/${acc}/Maildir/subscriptions"
    if [ -f "$sub" ]; then
        sed -i 's/^spam$/INBOX.spam/' "$sub"
    fi
done

Paso 2: Agregar suscripciones de carpetas estándar faltantes

for acc in usuario1 usuario2 usuario3; do
    sub="/home/{da_user}/imap/{dominio}/${acc}/Maildir/subscriptions"
    if [ -f "$sub" ]; then
        for folder in Drafts Sent Trash Junk; do
            if ! grep -q "^${folder}$" "$sub"; then
                sed -i "/^$/a ${folder}" "$sub"
            fi
        done
    fi
done

Paso 3: Restaurar propiedad y permisos correctos

Crítico después de cualquier edición por CLI a archivos de suscripciones:

for acc in usuario1 usuario2 usuario3; do
    sub="/home/{da_user}/imap/{dominio}/${acc}/Maildir/subscriptions"
    if [ -f "$sub" ]; then
        chown {da_user}:mail "$sub"
        chmod 660 "$sub"
    fi
done

Verificación

No se requiere reinicio de servicios. Dovecot lee el archivo de suscripciones en cada sesión IMAP. Los usuarios solo necesitan refrescar o volver a iniciar sesión en Roundcube.

Guía general para futuras migraciones desde cPanel

  1. El archivo de suscripciones debe tener INBOX.spam en lugar de spam
  2. Las carpetas estándar (Drafts, Sent, Trash, Junk) deben estar listadas en el archivo de suscripciones
  3. La propiedad del archivo debe ser {da_user}:mail con permisos 660
  4. El filtro de Exim (/etc/virtual/{domain}/filter) debe entregar spam a .INBOX.spam/new/
  5. Las carpetas huérfanas como .spam (legado de cPanel) pueden limpiarse si están vacías