Migrando Qmail a Zimbra

Introducción

En la Facultad contábamos con un servidor de correo Qmail con squirremail como interfaz web.
El mismo se encontraba totalmente saturado, prácticamente a las horas picos no se podía ingresar:

  • El espacio en disco era mínimo (existían 900 cuentas sin ningún tipo de quota, la cuenta mas pequeña era de 900MB)
  • Poca memoria y capacidad de procesamiento para tal caudal de datos (el servidor ya tenía unos cuantos años)
  • La administración del Qmail era tediosa y con poca documentación
  • La interfaz web era poco amigable y con muy pocas funcionalidades

Con todas estas causas y las quejas constantes acerca del funcionamiento del correo se hacía totalmente insostenible seguir con qmail

¿Por qué zimbra?

Nos pareció la mejor solución libre existente en la actualidad, sus funcionalidades, interfaz web y fácil administración era lo que mejor se adaptaba a la Facultad.

¿Como migrar?

Teníamos dos caminos:

  1. Tener dos servidores en paralelo, el antiguo con qmail y el nuevo zimbra. Los usuarios deberían traspasar sus datos entre cuentas manualmente.
  2. Programar un intermediario que hiciera la migración totalmente transparente al usuario.
Si optábamos por la primera opción, tendríamos dos inconvenientes principales:
  • Nos saturarían las consultas acerca de como mover los datos de una cuenta a otra (tengamos en cuenta que tenemos * cuentas activas)
  • No era recomendable seguir teniendo en producción el servidor de qmail

Finalmente optamos por la opción de crear un "Asistente" que hiciera transparente el traspaso de un servidor a otro, este nos serviría para recabar datos de los usuarios activos y ahorrarle trabajo al usuario final y a nosotros mismos.

¿Que debería hacer el asistente?

  1. Comprobar que el usuario existiera en el servidor de qmail
  2. Una vez realizada la comprobación, dependiendo del tipo de cuenta (personal, área académica, oficina), debería solicitar los datos institucionales de cada usuario:
    1. Si la cuenta es personal: cargo, nombre, apellido, cédula, carga horaria, sección o instituto
    2. Si la cuenta es representativa: nombre de sección o área académica y nombre del responsable
  3. Al finalizar el Asistente debería crear la nueva cuenta en Zimbra e importar los correos desde qmail

La programación del "Asistente"

El mismo debería ser web, para eso utilizamos PHP como lenguaje y mysql para crear la base de datos.

Las principales funciones:

Comprobar usuario y clave en el servidor por medio de ssh


function ssh_login($usuario, $clave){

// Primero verificamos que la funcion SSH2 exista, si no existe no va a funcionar
  if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");

// nos conectamos con el servidor mediante el puerto 22

  if(!($con = ssh2_connect("li", 22))){
    return false;    
        //verifiquen que el server tenga habilitada la autenticacion con password si no no funciona
    } else {
    // aqui se autentica con usuario y contraseña del servidor SSH
    if(!ssh2_auth_password($con, $usuario, $clave)) {
     return false;
    } else {
    // ya estamos dentro del servidor
    return true;

    }
   }
}

Modificar usuario en zimbra

Recordemos que los usuarios deben de estar creados en los dos servidores, para evitar la perdida de correos electrónicos. Así que simplemente lo que debe hacer el asistente es actualizar la cuenta zimbra


function CrearCuentaZimbra($mail,$pass,$nombre,$apellido,$lugar){

   //$comando="zmprov ca ".$mail." ".$pass."  gn '".$nombre."' sn '".$apellido."'  zimbraMailQuota 2147483648 company "."'".$lugar."'"." displayName '".$nombre." ".$apellido."'";
   // primero modificamos la clave
   $comando1 = "zmprov sp ".$mail." ".$pass;
   //luego modificamos los datos de la cuenta
   $comando2 = "zmprov ma ".$mail." company "."'".$lugar."'"." displayName '".$nombre." ".$apellido."' gn '".$nombre."' sn '".$apellido."' co Uruguay" ;
   $servidor="correo.psico.edu.uy";
   $usuario="zimbra";
   $clave="xxxxx";
   ejecutar_comando($servidor,$usuario,$clave,$comando1);
   ejecutar_comando($servidor,$usuario,$clave,$comando2);

    }

Necesitaremos de una función para conectarnos al servidor Zimbra y poder ejecutar los comandos:

function ejecutar_comando($servidor,$usuario,$clave,$comando){

if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
// nos conectamos con el servidor mediante el puerto 22
if(!($con = ssh2_connect($servidor, 22))){    
    //verifiquen que el server tenga habilitada la autenticacion con password si no no funciona
} else {
    // aqui se autentica con usuario y contraseña del servidor SSH
    if(!ssh2_auth_password($con, $usuario, $clave)) {

    } else {
        // ya estamos dentro del servidor
         // le mandamos a ejecutar un comando mediante una consola
        if (!($stream = ssh2_exec($con, $comando))) {
        //    echo "fallo, no se puede enviar el comando";
        } else {
            // recolectamos la data que nos arrojo el comando
            stream_set_blocking($stream, true);
            $data = "";
            while ($buf = fread($stream,4096)) {
                $data .= $buf;
            }
            //importante cerrar o puede que nos rechaze la proxima conexion
            fclose($stream);
        }
    }
}

Sincronizar las cuentas qmail - zimbra

Para sincronizar las cuentas utilizaremos imapsync, el cual debe estar previamente instalado en uno de los servidores. Nosotros optamos por instalarlo en el servidor Zimbra, ya que era mucho más "potente".

function ImportarImap($login,$pass){

    $comando = "imapsync -host1 li.psico.edu.uy -user1 ".$login."  -password1 ".$pass." -host2 correo.psico.edu.uy -user2 ".$login."@psico.edu.uy -password2 ".$pass." -noauthmd5";
    ejecutar_comando("servidor","usuario","clave",$comando);  

    }

Exportar a: PDF HTML TXT