Instalaremos y configuraremos Courier maildrop, este sera usado como MDA (Mail Delivery Agent) el cual es el encargado de llevar el correo a su localización final, puede hacer filtrado antes de entregar el correo y además maneja quotas de los buzones de correo (Maildir).
Es importante que instalemos una versión de maildrop 1.8.0 o superior, en las versiones anteriores a maildrop 1.8.0 se tenian modulos independientes para mysql y se tenia que configurar un archivo de configuracion para la consulta, desde la version 1.8.0 se elminarion dichos modulos y se integro con courier-authlib por lo que ahora no tendremos que configurar un archivo de consulta para maildrop, adelante veremos como configurar courier-authlib para buscar la información de los buzones.
Le activaremos el USE flag de mysql el cual activara el activara soporte para usar authlib.
# echo "mail-filter/maildrop berkdb gdbm mysql -authlib -debug -fam \
-ldap -postgres" >> /etc/portage/package.use
Ahora instalamos maildrop, así:
# emerge mail-filter/maildrop
Verifiquemos que maildrop se compilo con soporte para Courier Authlib y Quotas de Maildir
# maildrop -v maildrop 2.0.2 Copyright 1998-2005 Double Precision, Inc. GDBM extensions enabled. Courier Authentication Library extension enabled. Maildir quota extension enabled. This program is distributed under the terms of the GNU General Public License. See COPYING for additional information.
Maildrop tiene un archivo de configuración global, es
/etc/maildroprc el cual por default tiene todo
comentado, sin embargo, podemos usar archivos de filtrado por usuario
Unix y por usuario virtual, más adelante veremos como configurarlos
para nuestro entorno de usuarios virtuales.
Ya que todos los buzones de nuestros usuarios virtuales están bajo el $HOME de el usuario vmail, entonces usaremos este como base para la configuración de maildrop y los usuarios virtuales.
Maildrop maneja variables de entorno para referirse a algunos argumentos y rutas a los buzones de los usuarios, les explicare algunas de las que usaremos:
HOME =
/home/vmail/dominios esto es lo mismo que tenemos
en virtual_mailbox_base en
/etc/postfix/main.cf .
Esta variable define nuestra base para la configuración de usuarios y dominios virtuales.
DEFAULT = dominio.tld/username/
Ruta relativa a $HOME para el buzón de el usuario, esto es lo mismo que se tiene definido en el campo maildir de la tabla mailbox, ya que es un Maildir entonces llevara al final una "/"
LOGNAME = username@dominio.tld
El nombre de el buzon/destinatario del correo.
Bien, como se comento antes se pueden usar archivos de configuración y filtrado para maildrop por usuario, entonces usaremos uno base para nuestros usuarios virtuales y este podrá hacer una inclusión a archivos de configuración y filtrado para cada uno de los usuarios virtuales.
Crearemos un archivo .mailfilter dentro de
/home/vmail/dominios/ este archivo debe de
pertenecer a vmail:vmail y tener
permisos solo para el usuario vmail y nadie más, con 600 es suficiente.
# touch /home/vmail/dominios/.mailfilter # chown vmail:vmail /home/vmail/dominios/.mailfilter # chmod 600 /home/vmail/dominios/.mailfilter
El archivo /home/vmail/dominios/.mailfilter
tendrá el siguiente contenido:
# GLOBAL VARIABLES
# HOME=/home/vmail/dominios
# DEFAULT=dominio.tld/username/
# LOGNAME=username@dominio.tld
# Log everything to this file
logfile "/home/vmail/maildrop.log"
# LOG BEGIN OF FILTERING
log "==== BEGIN maildrop processing for $LOGNAME ==="
exception {
log "Including $HOME/$DEFAULT.mailfilter"
include "$HOME/$DEFAULT.mailfilter"
}
En este archivo las lineas que inician con "#" son comentarios, les explicare que es cada linea:
logfile: Esta linea indica en que archivo registrar los eventos de maildrop.
log: Toda linea que inicie con log enviara a logfile todo lo que incluya se pueden agregar variables de entorno usando $VARIABLE por ejemplo ahí agregamos un encabezado cuando empieza a hacer el procesamiento para un buzón.
exception: aquí también hace un
log y además hace include a
$HOME/$DEFAULT.mailfilter lo que se traduce a:
/home/vmail/dominios/dominio.tld/username/ y de
ahí leerá y procesara las instrucciones en el archivo
.mailfilter que tendrá instrucciones de filtrado
para ese usuario.
Cuando todo este funcionando correctamente se podrán comentar las lineas de log para que para que nuestro archivo maildrop.log no crezca excesivamente.
Por ahora la parte de configuración del mismo maildrop esta completa, ahora lo que sigue es decirle a Postfix que use a maildrop como transporte para enviar el correo.
Dentro de nuestro archivo
/etc/postfix/main.cf tenemos la directiva
virtual_transport = virtual la cual
dice que usara a el agente de envío de correo para dominios virtuales
de Postfix - virtual (8).
Ya que ahora usaremos a maildrop como MDA entonces cambiaremos la linea a:
virtual_transport = maildrop
Tambien agregaremos las siguientes lineas:
maildrop_destination_concurrency_limit = 1 maildrop_destination_recipient_limit = 1 unknown_maildrop_mailbox_reject_code = 450
Estas ultimas lineas son para que Postfix le envíe los correos a maildrop de uno en uno, ya que así es como debe de procesarlos.
Ahora agregaremos el transporte maildrop a el archivo /etc/postfix/main.cf
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/bin/maildrop -w 90 -d ${recipient}
Es posible que unas lineas como esas ya existan, si ya esta solo hay que modificarla para que quede como esta. Aquí agregamos el transporte llamado maildrop que sera de tipo socket Unix, además correrá con los privilegios de el usuario vmail, el argumento -w 90 le dice a maildrop que envíe una alerta de: cuota de buzón excedida a el usuario, cuando este haya llegado a un 90% de su limite.
NOTA: Deben de ir en dos lineas, la segunda inicia con espacio en blanco lo que indica que es continuacion de la linea de arriba.
La alerta que se comento arriba es una copia de el archivo /etc/quotawarnmsg, por lo que deberías de personalizarla antes de usarla.
Editar mensaje de alerta de sobre quota.
# vim /etc/quotawarnmsg X-Comment: Rename/Copy this file to quotawarnmsg, and make appropriate changes X-Comment: See deliverquota man page for more information From: Mail Delivery System <Mailer-Daemon@tuxjm.net> Reply-To: postmaster@tuxjm.net To: Valued Customer:; Subject: Mail quota warning Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 7bit Your mailbox on the server is now more than 90% full. So that you can continue to receive mail you need to remove some messages from your mailbox. :wq
Después de que se edito la parte de Postfix entonces esta listo para usarse, deberemos de re iniciar Para que tomen efecto los cambios.
Re iniciar Postfix:
# /etc/init.d/postfix restart
Si al re iniciar Postfix no hubo algún error entonces veremos los logs, enviaremos un correo desde el exterior a alguna cuenta de nuestro servidor de correo y veremos como lo procesa:
==> mail.log <== Dec 26 02:43:47 mail postfix/pipe[20780]: C8B12C0B66: to=<jmedina@tuxjm.net>, relay=maildrop, delay=1, status=sent (tuxjm.net) Dec 26 02:43:47 mail postfix/qmgr[10277]: C8B12C0B66: removed
Como vemos en el log dice que ahora uso al relay maildrop lo cual nos indica que ya esta usándolo y lo envió satisfactoriamente a el buzón de jmedina.
También podemos ver el log de maildrop, como vimos arriba le dijimos que registre en /home/vmail/maildrop.log.
==== BEGIN maildrop processing for jmedina@tuxjm.net === Including /home/vmail/dominios/tuxjm.net/jmedina/.mailfilter Processing per user filters for: jmedina@tuxjm.net Date: Tue Dec 26 02:43:47 2006 From: "Jorge Armando Medina" <jorgearma1982@gmail.com> Subj: Prueba usando maildrop como MDA. File: tuxjm.net/jmedina/ (2391)
Cuando se usa maildrop como MDA y se envía un correo a algún buzón, el correo no se entregara a menos que exista previamente el Maildir, si se crea un nuevo usuario maildrop no creara el Maildir por si mismo, como lo hacia el MDA virtual, por lo que tendremos que crear un procedimiento para que cuando se cree una cuenta de correo se envíe un correo de bienvenida y en ese momento en que se recibe el correo de bienvenida se cree automáticamente el Maildir para el nuevo usuario.
Podemos decirle a el archivo
/home/vmail/dominios/.mailfilter que ejecute
algunos comandos para que revise si existe el directorio de el dominio
y si existe entonces revise si existe el maildir del usuario, además
que cree los directorios Trash y Sent para ser usado con IMAP y además
suscriba los directorios automáticamente, agregaremos esto a nuestro
archivo .mailfilter.
# Ruta al /home/vmail/domains
VHOME="/home/vmail/dominios"
# Extrae solo el username de username@dominio.tld
ACCOUNT=`echo "$LOGNAME" | cut -d@ -f1`
# Extrae solo el dominio.tld de username@dominio.tld
USERDOMAIN=`echo "$LOGNAME" | cut -d@ -f2`
# Logea todo a la ruta especificada.
VMAIL_LOGFILE="/home/vmail/maildrop-maildirmake.log"
# Ruta a maildirmake
MAILDIRMAKE=/usr/bin/maildirmake
# Revisar si existe /home/vmail/dominio.tld/username
`test -d "$VHOME/$USERDOMAIN/$ACCOUNT"`
if( $RETURNCODE == 1 )
{
MESSAGE_DATE = `date`
# Registra la fecha actual de la creacion del Maildir en el maildrop.log
`echo CREATION DATE: "$MESSAGE_DATE" >> $VMAIL_LOGFILE`
# Registra la ruta absoluta de el nuevo maildir en el maildrop.log
`echo EMAIL DIRECTORY: "$VHOME/$USERDOMAIN/$ACCOUNT" >> $VMAIL_LOGFILE`
# Registra el username@dominio.tld a el maildrop.log
`echo USER EMAIL LOGIN: "$LOGNAME" >> $VMAIL_LOGFILE`
# Agrega una linea en blanco como separadar a el maildrop.log
`echo " " >> $VMAIL_LOGFILE`
# Revisa si existe el directorio de el dominio /home/vmail/dominio.tld
`test -d "$VHOME/$USERDOMAIN"`
if( $RETURNCODE == 1 )
{
# Registra la fecha de creacion de el directorio del dominio
# al maildrop.log
`echo CREATING DIRECTORY: "$VHOME/$USERDOMAIN" >> $VMAIL_LOGFILE`
# Crea el directorio para dominio.tld
`mkdir -p "$VHOME/$USERDOMAIN"`
# Agrega una linea en blanco como separador a el maildrop.log
`echo " " >> $VMAIL_LOGFILE`
}
# Crea el directorio para el username
`$MAILDIRMAKE "$VHOME/$USERDOMAIN/$ACCOUNT"`
# Crea el directorio Sent dentro del el maildir de username
`$MAILDIRMAKE -f Sent "$VHOME/$USERDOMAIN/$ACCOUNT"`
# Agrega el directorio Sent dentro de los directorios sucritos de username
`echo INBOX.Sent >> $VHOME/$USERDOMAIN/$ACCOUNT/courierimapsubscribed`
# Crea el directorio Trash dentro del el maildir de username
`$MAILDIRMAKE -f Trash "$VHOME/$USERDOMAIN/$ACCOUNT"`
# Agrega el directorio Trash dentro de los directorios sucritos de username
`echo INBOX.Trash >> $VHOME/$USERDOMAIN/$ACCOUNT/courierimapsubscribed`
# Crea el archivo courierimapuiddb dentro de el maildir de username
`touch $VHOME/$USERDOMAIN/$ACCOUNT/courierimapuiddb`
# Crea el directorio courierimapkeywords dentro de el maildir de username
`mkdir -p "$VHOME/$USERDOMAIN/$ACCOUNT/courierimapkeywords"`
}
Supongamos que creamos una cuenta de correo nueva y se envió automáticamente el mensaje de Bienvenida, en ese momento al recibir el correo maildrop, este ejecutara las instrucciones de arriba y creara el buzón para el usuario nuevo.
==> maildrop-maildirmake.log <== CREATION DATE: Sun Dec 24 06:35:42 EST 2006 EMAIL DIRECTORY: /home/vmail/dominios/tuxjm.net/test USER EMAIL LOGIN: test@tuxjm.net
Lo comprobamos:
# ls -l /home/vmail/dominios/tuxjm.net/test/ total xx drwx------ 2 vmail vmail 4096 Dec 24 06:50 courierimapkeywords -rw-r--r-- 1 vmail vmail 47 Dec 24 05:35 courierimapsubscribed -rw-r--r-- 1 vmail vmail 217 Dec 24 19:24 courierimapuiddb drwx------ 2 vmail vmail 4096 Dec 24 06:51 cur drwx------ 2 vmail vmail 4096 Dec 26 02:43 new drwx------ 2 vmail vmail 4096 Dec 26 02:43 tmp