Imapsync

Guía para migrar buzones de correo entre dos servidores IMAP usando imapsync desde la línea de comandos, no desde el botón del panel. Por consola ves el progreso buzón a buzón, puedes hacer una prueba en seco antes de tocar nada, y si algo falla te dice exactamente qué. Sirve para cualquier migración entre dos servidores con IMAP activo (cPanel, DirectAdmin, Plesk, correo genérico), independientemente del panel de cada lado.

La idea en una frase: imapsync se conecta a los dos servidores a la vez por IMAP, compara los dos buzones y copia del origen al destino solo lo que falta. Es incremental: lo puedes ejecutar las veces que quieras, no duplica correos.

Instalación

En muchas distribuciones Debian/Ubuntu recientes imapsync está empaquetado directamente:

apt install -y imapsync

Si no está en los repositorios, se instalan sus dependencias Perl y se ejecuta desde el fuente:

apt install -y libencode-imaputf7-perl \
 libfile-copy-recursive-perl \
 libio-tee-perl \
 libmail-imapclient-perl \
 libunicode-string-perl \
 libreadonly-perl \
 libsys-meminfo-perl \
 libregexp-common-perl \
 libfile-tail-perl \
 libdata-uniqid-perl \
 libjson-webtoken-perl \
 libtest-mockobject-perl

En AlmaLinux/RHEL, habilitar EPEL (dnf install epel-release) e instalar las dependencias Perl equivalentes. La lista completa y actualizada por distribución está en la web oficial del proyecto: https://imapsync.lamiral.info

Concepto clave: imapsync NO usa el MX del dominio

Este es el punto que más confusión genera. imapsync no mira el registro MX del dominio para nada. Se conecta directo por IMAP a cada servidor, por su hostname:

Por eso se puede sincronizar antes de tocar el DNS: mientras el MX del dominio siga apuntando al servidor viejo, el correo nuevo sigue entrando en el origen con total normalidad, y se va copiando por detrás sin que el usuario note nada. Esto es lo que permite hacer la migración en dos tiempos (ver «Pasada final» más abajo).

Dónde encaja imapsync en una migración completa

imapsync copia el contenido de los buzones, pero no crea nada (ni el dominio, ni las cuentas de correo). Cuando no hay migrador automático entre paneles, el orden por cada dominio es:

  1. Crear el dominio en el servidor destino.
  2. Crear las cuentas de correo (buzones) del dominio, cada una con su contraseña.
  3. Primera pasada de imapsync (mueve el grueso del correo).
  4. Pasada final de imapsync, justo antes de cambiar el DNS.
  5. Cambiar el DNS/MX del dominio al servidor destino.

Requisitos previos

Los datos que necesitas por cada buzón

imapsync conecta a los dos lados, así que por cada buzón necesitas cuatro cosas:

Y los dos servidores (fijos para toda la migración):

Paso 1 — Entrar por SSH al servidor

ssh -p <PUERTO_SSH> <USUARIO>@<HOST_DESTINO>

Paso 2 — Guardar las contraseñas en ficheros (no ponerlas en el comando)

Si la contraseña se escribe dentro del comando, queda registrada en el historial y cualquiera que mire los procesos del servidor la ve. Es mejor meterlas en dos ficheros sueltos:

cd ~
umask 077                     # los ficheros que se creen a partir de ahora nacen privados
echo 'CONTRASENA_ORIGEN'  > .p1
echo 'CONTRASENA_DESTINO' > .p2

Estos dos ficheros se reutilizan/reescriben para cada buzón. Al terminar la migración, se borran (rm ~/.p1 ~/.p2).

Paso 3 — Prueba en seco (SIEMPRE primero)

El --dry-run no copia nada: solo se conecta a los dos lados y dice qué haría. Confirma que las contraseñas son correctas y muestra cuántos correos hay que mover:

imapsync \
  --host1 <HOST_ORIGEN>  --user1 usuario@dominio.tld --passfile1 ~/.p1 --ssl1 \
  --host2 <HOST_DESTINO> --user2 usuario@dominio.tld --passfile2 ~/.p2 --ssl2 \
  --automap \
  --dry-run

Si al final aparece un resumen con las carpetas y un recuento de mensajes, y sin errores de login, ya está todo correcto para la copia real.

Paso 4 — La copia real

Es exactamente el mismo comando quitando --dry-run:

imapsync \
  --host1 <HOST_ORIGEN>  --user1 usuario@dominio.tld --passfile1 ~/.p1 --ssl1 \
  --host2 <HOST_DESTINO> --user2 usuario@dominio.tld --passfile2 ~/.p2 --ssl2 \
  --automap

Los correos pasan carpeta por carpeta. Al final imprime un resumen. Líneas a mirar:

Paso 5 — Pasada final antes de cambiar el DNS

Mientras no se cambie el MX/DNS del dominio, el correo nuevo sigue llegando al servidor viejo. Por eso se hace en dos tiempos:

  1. Una primera pasada (mueve el grueso; puede tardar si el buzón es grande).
  2. Una pasada final justo cuando se vaya a cambiar el DNS del dominio al servidor nuevo: se vuelve a lanzar el mismo comando y solo trae los correos que hayan entrado desde la primera vez. Como es incremental, es rápida y no duplica nada.

Buzones POP

Migrar varios buzones de una vez

Cuando se coge ritmo, en lugar de ir uno a uno se puede preparar un fichero con todos los buzones y un bucle. Se crea ~/buzones.csv con una línea por buzón, separado por punto y coma:

usuario@dominio.tld;PASS_ORIGEN;PASS_DESTINO
otro@dominio.tld;claveVieja2;claveNueva2

Y se procesa con este bucle:

cd ~
umask 077
while IFS=';' read -r BUZON P1 P2; do
  [ -z "$BUZON" ] && continue
  echo "===== Migrando $BUZON ====="
  printf '%s' "$P1" > .p1
  printf '%s' "$P2" > .p2
  imapsync \
    --host1 <HOST_ORIGEN>  --user1 "$BUZON" --passfile1 ~/.p1 --ssl1 \
    --host2 <HOST_DESTINO> --user2 "$BUZON" --passfile2 ~/.p2 --ssl2 \
    --automap
done < ~/buzones.csv
rm -f ~/.p1 ~/.p2

Para probar el lote entero en seco antes, se añade --dry-run a la línea de imapsync dentro del bucle. Al terminar, se borra el CSV con las contraseñas: rm ~/buzones.csv.

Chuleta de opciones útiles

Opción Para qué sirve
--dry-run Simula sin copiar nada. Usar siempre la primera vez.
--automap Empareja las carpetas especiales (Enviados, Papelera, Spam) aunque se llamen distinto en cada servidor.
--justfolders Crea solo la estructura de carpetas, sin mensajes.
--folder "INBOX" Migra solo una carpeta concreta.
--exclude "Trash|Junk" Excluye carpetas (p. ej. no traer Papelera ni Spam).
--maxage 365 Solo correos de los últimos N días.
--useheader "Message-Id" Evita duplicados comparando por identificador de mensaje (útil al repetir la sync).
--sslargs1 SSL_verify_mode=0 Ignora la validación del certificado SSL del origen (ver «Si algo falla»).

No usar nunca --delete2 (borra en el destino) ni --delete1 (borra en el origen) en una migración normal: no hacen falta y son peligrosos.

Si algo falla


Revision #4
Created 2022-05-26 20:58:42 UTC by Abkrim
Updated 2026-07-11 08:44:23 UTC by Abkrim