Skip to main content

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:

  • Origen (--host1): el hostname del servidor viejo, IMAP SSL, puerto 993.
  • Destino (--host2): el hostname del servidor nuevo, IMAP SSL, puerto 993.

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

  • El buzón destino tiene que existir ya en el servidor nuevo. imapsync copia el contenido, pero no crea la cuenta. Primero se crea el dominio y el buzón (con su contraseña nueva), y luego se sincroniza.
  • Acceso SSH al servidor donde se lanza imapsync (normalmente el destino).
  • imapsync instalado en uno de los dos lados (basta con el que lanza los comandos). El otro servidor no necesita nada especial: solo tener IMAP activo (puerto 993 SSL).

Los datos que necesitas por cada buzón

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

  • Usuario origen = la dirección completa, p. ej. usuario@dominio.tld
  • Contraseña origen = la que ese buzón tiene ahora en el servidor viejo
  • Usuario destino = la misma dirección, usuario@dominio.tld
  • Contraseña destino = la que se le puso al crear el buzón en el servidor nuevo

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

  • Origen (--host1): <HOST_ORIGEN> (IMAP SSL, puerto 993)
  • Destino (--host2): <HOST_DESTINO> (IMAP SSL, puerto 993)

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:

  • Host2 messages after sync — cuántos mensajes hay en el buzón nuevo al terminar.
  • messages transferred — cuántos ha copiado en esta pasada.
  • Detected 0 errors — lo que se quiere ver. Si hay errores, aparecen listados arriba.

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

  • imapsync copia lo que esté guardado en el servidor origen. Da igual que el usuario final use POP en su cliente de correo: el servidor sigue teniendo el buzón por dentro e imapsync entra por IMAP a leerlo.
  • Pero si ese usuario tiene el POP configurado como «borrar del servidor al descargar», en el origen casi no queda nada (el correo está en su equipo, no en el servidor). En ese caso imapsync copiará poco, y es lo correcto: lo que está en el equipo del usuario no se puede migrar desde el servidor, se queda en su equipo (ni se pierde ni se toca).

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

  • Error login on host1 / host2 → contraseña incorrecta en ese lado. Revisar el fichero .p1 (origen) o .p2 (destino).
  • Error de certificado SSL → añadir al comando --sslargs1 SSL_verify_mode=0 y/o --sslargs2 SSL_verify_mode=0.
  • Host2 folder ... does not exist → normalmente se resuelve con --automap.
  • Cualquier otra cosa rara → conservar el resumen final (las últimas ~30 líneas que imprime imapsync) para diagnóstico. Ese resumen es justo la ventaja de hacerlo por consola: se tiene todo delante.