Usar un Squirrelmail, para servir múltiples dominios, es un problema que ya había resuelto hace varios años atras, pero con la movida de mi servidor, uno de los directorios que me olvide respaldar fue justamente el del webmail. Así que tuve nuevamente que reinventar la rueda. Pero para que no me vuelva ha pasar voy a poner en éste blog los cambios, así además de quedar en un lugar del que siempre voy ha tener un back up, también compartiré el pequeño cambio que hice para que le sirva a todo aquel que lo necesite.
El problema es sencillo, que pasa si se tiene en un servidor varios dominios, hacer varias instalaciones de squirrelmail, una para cada uno de ellos no parece ser la solución más inteligente, pues cualquier actualización requeriría ser replicada en tantos directorios como dominios se tenga en ese server. Así que la solución más obvia es tener una sóla intalación y aprovechar la directiva "ServerAlias" del Apache. Para ello creamos un servidor virtual con un alias para todo dominio que comience con la palabra webmail, la configuración del Apache es ésta:
<VirtualHost 1.2.3.4>
ServerAdmin webmaster@undominio.com
DocumentRoot /usr/share/squirrelmail
ServerName webmail
ServerAlias webmail.*
DirectoryIndex index.html index.htm index.php index.cgi index.html.var
ErrorLog /var/squirrelmail/logs/error_log
CustomLog /var/squirrelmail/logs/access_log common
</VirtualHost>
Con la configuración anterior no importa cuál sea el nombre de dominio, mientras éste comience con webmail será redireccinado por el apache al directorio /usr/share/squirrelmail (directorio por defecto donde se instala el Squirrelmail en debian). Ojo debe reemplazar 1.2.3.4 por el IP que tiene en su servidor.
Pero eso deja sin resolver otro problema, que cada vez que un usuario quiere leer su correo web debe de tipear la direccion de correo completa es decir: "usuario@dominio.com"
Ésto puede ser incómodo y hasta frustrante para muchos usuarios, así que lo mejor es hacerlo automático, para ello aprovecho una de las variables que nos ofrece PHP y que es $_SERVER[‘HTTP_HOST’], en ella siempre podemos encontrar el nombre de dominio completo del servidor web en el que estamos corriendo el script.
Todo el truco esta en agregar unas cuantas líneas al script redirect.php del squirrelmail que suele estar en /usr/share/squirrelmail/src/redirect.php, busque esta líneas:
/* get globals we me need */
sqGetGlobalVar(‘login_username’, $login_username);
sqGetGlobalVar(‘secretkey’, $secretkey);
Inmediatamente después de ellas copie y pegue estos cambios:
/* Modificado por mi para permitir multiples dominios */
$hostname = $_SERVER["HTTP_HOST"];
$str_len = strlen($hostname);
$diff = $str_len – 8;
$domain_name = substr($hostname, 8, $diff);
$email_completo = $login_username . "@" . $domain_name;
$login_username = $email_completo;
/* Fin de los cambios */
Las lineas que se añaden hacen toda la magia, extraen el nombre de dominio de la variable $_SERVER[‘HTTP_HOST’], le remueve la pablabra webmail y finalmente le pega el login y el "@" y lo reemplaza en la variable $login_username que usa squirrelmail para validar al usuario. Ésta es una solución simple y limpia, claro que descubrir donde hacer los cambios me tomo buen tiempo la primera vez, al menos esta vez ya sabía que era en redirect.php donde debía hacer los cambios. Sólo tuve que hacer un poco de memoria y creo que esta segunda vez hice un addendum de código mucho más limpio que la vez anterior, así que no estuvo del todo mal que perdiera los cambios anteriores.
Espero que esta información les haya sido de utilidad, y espero sus comentarios.
Buenas,
estamos teniendo problemas con squirrelmail al parecer si accedes con http://ip/webmail o http://www.alfa.com/webmail te abre el squirrelmail.
Nosotros lo que queremos es ser selectivos es decir, que algunos de nuestros dominios tengan el webmail y otros no.
Cualquier ayuda o sugerencia nos vendría bien
muchas gracias de antemano
nonnololo
Bueno, no das muchos detalles de la distribución que usas o la versión de tu apache. Pero asumiendo que estas usando Debian, en el directorio /etc/apache2/conf.d debe haber un archivo llamado squirrelmail o webmail. Si borras ese archivo y fuerzas a que apache cargue la configuración otra vez con «/etc/init.d/apache2 force-reload», ya el webmail estaría deshabilitado por defecto y deberías de incluir una clausula «alias» en cada «virtualhost» apuntando al directorio donde está tu squirrelmail. De esa manera sólo los servidores virtuales que habilites tendrán el webmail.
Hola, valioso aporte lo de la configuracion del squirrelmail para el soporte de dominios virtuales, ahora bien estoy tratando de adaptar tu codigo para implementarlo en Horde y pues no me funciona.
Acepta el login pero automaticamente me desconecta, lo has probado en horde.
Muchas gracias de antemano
No, esta modificación sólo es para squirrelmail. No estoy muy familiarizado con Horde, pero lo he visto configurado para operar de una manera similar a la que describo aquí en Plesk (un control panel muy similar a cPanel), lo cual significa que es posible hacerlo.
Aqui esta la configuracion para Horde utilizando dominios virtuales para que el usuario no tenga que escribir la dirección sino que capture el dominio desde la URL.
Edite el archivo “/horde/imp/config/hooks.php” y descomente estas lineas:
if (!function_exists('_imp_hook_vinfo')) {
function _imp_hook_vinfo($type = 'username')
{
$vdomain = getenv('HTTP_HOST');
$vdomain = preg_replace('|^mail.|i', '', $vdomain);
$vdomain = String::lower($vdomain);
if ($type == 'username') {
return preg_replace('|.|', '.', $_SESSION['imp']['user'] . '@' . $vdomain);
} elseif ($type == 'vdomain') {
return $vdomain;
} else {
return PEAR::raiseError('invalid type: ' . $type);
}
}
}
Si deseas que se le muestre al usuario el dominio de correo al lado de la casilla de entrada del usuario entonces:
Edite el archivo “/horde/imp/config/conf.php”
cambie:
$conf['hooks']['vinfo'] = false;
por:
$conf['hooks']['vinfo'] = true;