Cómo corregir el espacio utilizado en cuentas de correo en cPanel (dovecot-quota)

Cómo corregir el espacio utilizado en cuentas de correo en cPanel

Si al revisar las cuentas de correo electrónico en cPanel notas que el espacio utilizado aparece en KB (por ejemplo, 78 KB) cuando el uso real es de varios GB, se trata de un problema de sincronización entre los archivos de cuota de Dovecot y el caché de cPanel.

Info
Este procedimiento requiere acceso SSH con privilegios de root al servidor. Los comandos utilizan variables que deben sustituirse antes de ejecutar: USUARIO (usuario de cPanel) y DOMINIO (dominio del correo).

🔍 Causa raíz

El archivo dovecot-quota dentro de cada buzón de correo es el responsable de almacenar el tamaño de la cuenta. Cuando este archivo no existe o contiene valores incorrectos, cPanel muestra datos desactualizados. Adicionalmente, el datastore de cPanel almacena estos valores en caché y no los actualiza automáticamente.

📋 Identificar las variables

Antes de iniciar, obtén el usuario de cPanel asociado al dominio:

grep DOMINIO /etc/userdomains

El resultado mostrará algo como: dominio1.com.mx: dominio1c — donde dominio1c es el USUARIO y dominio1.com.mx es el DOMINIO.


Paso 1 — Verificar el uso real de disco

Confirma el espacio real que ocupa cada cuenta de correo en el servidor:

du -sh /home/USUARIO/mail/DOMINIO/*/

Si los valores coinciden con lo que muestra cPanel, no es necesario continuar. Si hay discrepancias significativas (cPanel muestra KB cuando el uso real es MB o GB), procede con los siguientes pasos.


Paso 2 — Listar las cuentas de correo

Obtén la lista de cuentas de correo registradas en cPanel para el dominio:

uapi --user=USUARIO Email list_pops_with_disk | grep "email:"


Paso 3 — Crear/Regenerar los archivos dovecot-quota

Este script elimina los archivos dovecot-quota existentes, recalcula las cuotas con Dovecot y escribe los valores correctos para cada cuenta:

for account in $(ls /home/USUARIO/mail/DOMINIO/); do
rm -f /home/USUARIO/mail/DOMINIO/${account}/dovecot-quota
doveadm quota recalc -u "${account}@DOMINIO" 2>/dev/null
QUOTA=$(doveadm quota get -u "${account}@DOMINIO" 2>/dev/null \
| grep "Mailbox" | grep "STORAGE" | awk '{print $3}')
MESSAGES=$(doveadm quota get -u "${account}@DOMINIO" 2>/dev/null \
| grep "Mailbox" | grep "MESSAGE" | awk '{print $3}')
if [ -n "$QUOTA" ]; then
MAILPATH="/home/USUARIO/mail/DOMINIO/${account}"
echo "priv/quota/storage=${QUOTA}" > "${MAILPATH}/dovecot-quota"
echo "priv/quota/messages=${MESSAGES}" >> "${MAILPATH}/dovecot-quota"
chown USUARIO:USUARIO "${MAILPATH}/dovecot-quota"
echo "${account}: storage=${QUOTA} messages=${MESSAGES}"
fi
done

Cada cuenta imprimirá su nombre con los valores de storage y messages. Verifica que coincidan con lo obtenido en el Paso 1.


Paso 4 — Limpiar el caché de cPanel

Elimina los archivos de caché del datastore para forzar una lectura fresca:

rm -f /home/USUARIO/.cpanel/datastore/*email*
rm -f /home/USUARIO/.cpanel/datastore/*quota*
rm -f /home/USUARIO/.cpanel/datastore/_Cpanel::Quota*


Paso 5 — Reiniciar cpsrvd

Reinicia el servicio de cPanel para que la interfaz web lea los nuevos datos:

/scripts/restartsrv_cpsrvd

Warning
Este comando reinicia cpsrvd para todos los usuarios del servidor. Se recomienda ejecutar en horarios de baja actividad.


Paso 6 — Forzar actualización de la interfaz (toggle de cuotas)

Este paso lee la cuota actual de cada cuenta, la cambia temporalmente a 500 MB y la restaura al valor original, forzando a cPanel a refrescar los datos en la interfaz web:

for account in $(ls /home/USUARIO/mail/DOMINIO/); do
# Leer la cuota actual antes de modificar
CURRENT_LIMIT=$(doveadm quota get -u "${account}@DOMINIO" 2>/dev/null \
| grep "^Mailbox" | grep "STORAGE" | awk '{print $4}')

if [ "$CURRENT_LIMIT" = "-" ] || [ -z "$CURRENT_LIMIT" ]; then
RESTORE_QUOTA=0
else
RESTORE_QUOTA=$((CURRENT_LIMIT / 1024))
fi

# Toggle para forzar refresh
uapi --user=USUARIO Email edit_pop_quota \
email=${account} domain=DOMINIO quota=500 2>/dev/null
# Restaurar cuota original
uapi --user=USUARIO Email edit_pop_quota \
email=${account} domain=DOMINIO quota=${RESTORE_QUOTA} 2>/dev/null

echo "${account}: restaurada a ${RESTORE_QUOTA} MB"
done

Info
quota=0 equivale a unlimited en la API de cPanel. Si el primer comando da error "You cannot set an email account quota higher than X", reduce el valor temporal (ej: quota=100).


✅ Verificación

  1. Recarga la página de cPanel con Ctrl+F5 (hard refresh).

  2. Verifica que los valores de Storage coincidan con los del Paso 1.

  3. Si alguna cuenta individual no se actualizó, ejecuta solo para esa cuenta:

uapi --user=USUARIO Email edit_pop_quota \
email=CUENTA domain=DOMINIO quota=500
uapi --user=USUARIO Email edit_pop_quota \
email=CUENTA domain=DOMINIO quota=0


⚠️ Comandos que NO se deben ejecutar

Los siguientes comandos pueden revertir la corrección y no deben usarse después de completar el procedimiento:

Warning
  • find /home/USUARIO/mail/ -name "maildirsize" -delete — Puede causar que los valores se regeneren incorrectamente.
  • /scripts/fixquotas — Sobrescribe los archivos de cuota con valores incorrectos.
  • doveadm quota recalc después del Paso 3 — Ya se ejecuta dentro del script; ejecutarlo nuevamente puede sobrescribir el archivo dovecot-quota.