Cada vez teníamos mas y mas mails, y courier-imap empezó a ir demasiado lento. Era hora de instalar un servidor IMAP más potente. La solución era cyrus:
Puede manejar con soltura buzones con cantidades masivas de correo.
No necesita que los usuarios tengan cuenta local.
Se puede permitir a un usuario consultar los buzones de otros usuarios.
Admite cuotas.
Otra opción hubiera sido Dovecot, aunque en aquel momento desconocíamos su existencia.
$ apt-get install cyrus22-imapd cyrus22-admin sasl2-bin |
Cyrus-admin nos proporcionará un interface en modo texto para administrar de forma relativamente sencilla los buzones. Sasl-bin (Simple Authentication and Security Layer) proporciona la base de datos ldap para usuarios y contraseñas.
Aquí tenemos un estupendo howto de cyrus con postfix creado por Mario Teijeiro, compañero de Galpon
Basándome en este howto, pero por el momento sobre exim y sin autenticación ni soporte ssl, comento las cosas que he necesitado a posteriori y no vienen explicadas en el mismo:
Si deseamos borrar un mailbox desde cyradm, lo primero que tenemos que hacer es darnos permisos a nosotros mismos con:.
localhost>sam user.USUARIO cyradm lrswipcda # el significado de los permisos podemos verlo en el manual de cyradm. |
De lo contrario nos denegará el permiso cuando queramos borrarlo.
Si queremos que un usuario vea, escriba, borre,.... mailboxes de otros usuarios, procederemos del mismo modo que antes, dandole los permisos necesarios. (El permiso se da sobre el usuario, no sobre el mailbox, "user.usuario").
Si cyrus nos cambia los acentos y ñ del asunto y campo "from", descomentaremos la línea:
munge8bit: no |
Con esto incumplimos el estándar SMTP, pero permitimos que se visualicen correctamente los mails enviados desde servidores de correo que incumplen dicho estándar.
Para migrar mails de maildir al formato de cyrus, podemos pasarlos desde algún cliente de correo, o bien con el script md2mh.
Para conseguir que exim entregue los mails a las carpetas de cyrus, debemos modificar exim.conf. siguiendo la mini-guía del enlace.
Si usamos cuotas y deseamos que se devuelvan los mails cuando el destinatario ha superado su cuota, editamos en /etc/imap.conf.
lmtp_overquota_perm_failure: yes |
En caso de tener problemas con el estado que indica que los mensajes son nuevos, debemos borrar:
/var/lib/cyrus/user/t/this_user/this_user.seen |
Si queremos que cyrus no nos elimine los mensajes duplicados (por defecto elimina duplicados con el mismo ID y destinatario que lleguen en intervalos inferiores a 3 días), añadiremos en imapd.conf:
duplicatesuppression: false |
Si queremos usar usuarios con puntos (pepe.martinez@dominio.com), tenemos que poner a "yes" la opción $unixhierarchysep de imapd.conf. Con esto el separador de carpetas dejará de ser el punto para ser la barra ( / ). Debemos tener esto en cuenta a la hora de trabajar con cyradm. (nota: internamente el separador sigue siendo el punto, y los puntos en nombres de usuario se guardan como "^", pero esto es transparente para el usuario).
Si deseamos administrar facilmente los buzones, además de cyradm, podemos hacerlo mediante telnet al puerto 143 de nuestro servidor. Estos comandos nos serán de ayuda: (Es necesario un espacio entre cada "." y el comando)
$ telnet localhost 143 . login cyrus clave_cyrus . list user.* * . list user.USUARIO * . setacl user.USUARIO cyrus lrswipcda . delete user.USUARIO.Borradores . create user.NUEVOUSUARIO . reconstruct user.USUARIO . logout |
Dado que me seguía resultando algo complicado el proceso de creación de usuarios, hice este script para facilitar la labor. (Requiere perl y libimap-admin-perl)
.
Para transmitir los datos de imap por un canal seguro, debemos hacer un par de modificaciones en /etc/cyrus.conf y en /etc/imapd.conf.
En cyrus.conf , bajo la sección "SERVICES" debemos descomentar las líneas correspondientes a los servicios imaps y pop3s, y habilitar la línea de imap solamente para acceder desde localhost (para cyradm)
imap cmd="imapd -U 30" listen="localhost:imap" prefork=0 maxchild=100 imaps cmd="imapd -s -U 30" listen="imaps" prefork=0 maxchild=100 #pop3 cmd="pop3d -U 30" listen="pop3" prefork=0 maxchild=50 pop3s cmd="pop3d -s -U 30" listen="pop3s" prefork=0 maxchild=50 |
En imapd.conf debemos especificar los ficheros con los certificados.
# File containing the global certificate used for ALL services (imap, pop3, # lmtp, sieve) tls_cert_file: /etc/ssl/mail.hermes.pem # File containing the private key belonging to the global server certificate. tls_key_file: /etc/ssl/mail.hermes.key # File containing one or more Certificate Authority (CA) certificates. tls_ca_file: /etc/ssl/certs/cacert.pem # Path to directory with certificates of CAs. tls_ca_path: /etc/ssl/certs |
Configurar dominios virtuales en postfix y cyrus es más sencillo de lo que puede parecer. Creo que el mayor problema que tuve residía en no tener el sistema actualizado, por lo que las librerías sasl no admitían múltiples dominios, y por su parte cyrus tiene que ser la versión 2.2 o superior.
Editamos /etc/imapd.conf y añadimos al final del fichero las opciones:
virtdomains: yes defaultdomain: midominio.com |
defaultdomain debe ser el dominio en el que esté nuestra máquina. No tiene porqué coincidir con alguno de los dominios virtuales que queremos alojar. Tuve problemas con usuarios/contraseñas poniendo como default uno de los dominios virtuales. (que no coincidía con el dominio en el q estaba la máquina). Al final encontré que la solución que siempre funciona es poner como defaultdomain el nombre de dominio que tenga el servidor en su /etc/hosts
Sieve es una potente herramienta para filtrar mensajes desde el servidor según diversos criterios basados en el contenido de los mensajes.
No encontré forma de autenticarme con sieveshell, pero sí la manera de poner los scripts a mano en las carpetas de sieve. Creamos el script usando el lenguaje definido en el RFC, y luego lo convertimos al formato de sieve con el comando:
/usr/lib/cyrus/bin/sievec script defaultbc |
defaultbc es el script que se comprueba por defecto |
La mejor opción es instalar websieve, que por defecto se instala en la carpeta de cgi's de apache (http://127.0.0.1/cgi-bin/websieve.pl). Con websieve podemos añadir scripts de manera intuitiva, y hasta manejar varios servidores de correo (configurándolos en /etc/websieve/websieve.conf). Si tenemos todas las carpetas al mismo nivel que Inbox, debemos cambiar la opción correspondiente a "alternate namespace" en websieve.conf
Ejemplo de script (en caso de ponerlo a mano en el directorio de scripts):
# Mail rules for user jesus@roadrunner.local.gadelek.com # Created by Websieve version 0.62 require ["fileinto"]; if allof (header :contains "X-Spam-Flag" "YES") { fileinto "Spam"; } elsif allof (header :contains "X-Amavis-Alert" "INFECTED") { fileinto "Virus"; } else { keep; } |