INSTALACION SERVIDOR DE CORREO BASADO EN DEBIAN WOODY + POSTFIX + MYSQL + MAILDROP + SASL + POSTFIXADMIN + AMAVIS + SPAMASSASSIN + SQUIRRELMAIL.

Bueno, la instalación de este servidor surge a mediados del mes de febrero del 2005, básicamente para enredar con el magnifico DEBIAN y empezar a ver sus posibilidades. Comienzo diciendo que es lo primero que he empezado a hacer con linux, y ha resultado algo difícil llegar al punto en el que ahora me encuentro, lo tengo todo montadito y funcionando.

Comencé a recabar información del tío google, encontré varios documentos y me decidí por el de un brasileño (<http://www.linuxdicas.com.br/tutoriais1/tutorial_courier_mysql_postfix.txt>). Este manual esta muy bien pero tenia un gran problema para mi, que lo instalaba sobre mandrake y yo quería instalarlo sobre debian woody.

Por descontado que quería hacer el servidor basado en MySQL, no quería tener a tropecientos usuarios en el servidor y comprometer así su seguridad, así que me puse manos a la obra y me costo 35 días dejarlo aceptable.  

SISTEMA OPERATIVO UTILIZADO:

Debian Woody 3.0 r4

HARDWARE UTILIZADO:

Para todas las instalaciones que tuve que hacer para dejarlo bien utilice a VmWare, una aplicación de windows para meter otros sistemas mientras estas utilizando windows, bastante bueno ya que me dejaba ir leyendo manuales mientras instalaba el servidor.

La maquina final no merece la pena ni comentarla.

APLICACIONES UTILIZADAS:

SSH  3.4p1-1.woody
MYSQL 3.23.49-8.9
COURIER-IMAP 1.4.3-2.5
COURIER-POP 1.4.3-2.5
MAILDROP 1.6.3
POSTFIX 2.1.5-0.backports.org.1
SASL 1.5.27-3.1woody5
APACHE 1.3.26-0woody6
SQUIRRELMAIL 1.4.4
AMAVIS-NEW 2.0030616p10-4.backports.org.1
SPAMASSASSIN 3.0.2-0.backports.org.1
POSTFIXADMIN modificado por mi desde el fuente de Maximo de Linuxdicas

Existen otro montón mas de paquetes utilizados que no merece la pena nombrar para describir este servidor, los iréis viendo según avancéis.

INSTALACION DE DEBIAN WOODY:

No hay mucho que comentar en este apartado, he instalado el kernel 2.4 para que me soporte sistema de ficheros ext 3 si no queréis este tipo de ficheros utilizad el kernel por defecto,  después del particionado y mientras vamos iniciando cada una de las particiones nos preguntara sobre el sistema de ficheros que queremos utilizar le diremos que ext 3. 

Al intentar localizar vuestra tarjeta de red si la reconoce de primeras, no debéis decirle que instale ningún paquete de dispositivos, si  no la localiza os tocara buscar en internet información de que paquete de dispositivos debéis utilizar. Yo para mi SMC 1255 TX he tenido que meter el paquete de dispositivos TULIP en el apartado NET, una vez metido este paquete te dirá que ha tenido éxito y te preguntara si quieres utilizar DHCP. 

después de ponerle el nombre a la maquina lo único que he hecho y no crear disquete de arranque la maquina reiniciara. Nos preguntara por el meridiano en el que nos encontramos, y si queremos habilitar MD5 y shadow passwords le decimos que si a los dos tipos de  contraseñas y le daremos la contraseña al root y meteremos un usuario normal. 

Cuando nos pregunta si queremos utilizar la conexión PPP para instalar el sistema le diremos que no, ya que utilizaremos el CD para este propósito. Utilizaremos nonus-software nonfree-software pero no utilizaremos contrib-software, ya que al final de la instalación teníamos que meter un par de librerías para que amavis pudiese descomprimir unos archivos para la búsqueda de virus y estas librerías solo están en non-free software, la opción nonus es porque estamos fuera de EEUU y podemos utilizar paquetes cifrados. Cuando nos pregunte si queremos añadir alguna fuente apt  le diremos que si y añadiremos la que nos convenga, yo utilizo http de debian.org en España. 

Al preguntarnos la instalación si queremos añadir la parte security updates a nuEstro sources list, le diremos que si, esto nos actualizará al sistema mas estable que haya en el momento. Cuando nos pregunte si queremos ejecutar TASKSEL y DSELECT le diremos que no, esto nos dejara el sistema base, sin nada de nada, ya utilizaremos apt-get para instalar lo que nos va haciendo falta. 

Ahora se tirara un rato descargando paquetes de internet para dejarnos el sistema básico. Luego nos hace 3 preguntas sobre como queremos tratar los mensajes que genera el sistema operativo yo he utilizado las opciones 4, none, y, esto hará que todos los mensajes que genera woody los deje en el directorio local del root.

Ya podemos validarnos para entrar en el sistema.

ANTES DE COMENZAR

Si ya tenéis conexión a internet utilicémosla y quitemos de /etc/apt/sources.list la línea del cd para dejarla algo así:

deb http://ftp.es.debian.org/debian/ stable main non-free
deb-src http://ftp.es.debian.org/debian/ stable main non-free

deb http://security.debian.org/ stable/updates main contrib non-free

Estas han sido mis opciones vosotros podéis tener otras cosas o directamente dejar el cd, yo lo quito porque sino me lo pide y a veces me lo dejaba olvidado y cuando se iba la luz en casa al reiniciar el sistema arrancaba desde el cd y se quedaba esperando a que le diese una opción de instalación.

Crearemos el grupo y el usuario MAILDROP.

cartero:~#groupadd -g 108 maildrop
cartero:~#useradd -d /var/spool/mail -g 108 -u 108 -s /bin/false -M maildrop

Crearemos un directorio donde compilaremos la fuentes y meteremos lo que bajemos de internet, yo lo he llamado cosas.

cartero:~#mkdir /cosas

A partir de ahora iremos paso a paso instalando cada servicio que debe correr en la maquina, os pongo las versiones de cada aplicación que he ido instalando, para saber que versión habéis instalado vosotros podéis poner en cualquier momento el comando siguiente: dpkg -l nombre_paquete, pero aun así os digo que casi todo es de WOODY, algo de BACKPORTS y un par de paquetes compilados directamente.

En el resto del documento todas las acciones que realizo las hago como ROOT.

INSTALACION DE SSH  3.4p1-1.woody:

Una vez acabada la instalación de Debian,  de lo primero que he hecho ha sido instalar el servicio SSH, para mi muy útil ya que con putty puedo copiar y pegar cosas y además puedo ir utilizando internet mientras voy realizando la instalación del servidor.

Saltaos esta instalación si no queréis manejar el servidor remotamente.

cartero:~#apt-get install ssh

Nos instalara un total de 3 paquetes y ya podremos entrar mediante SSH al servidor para su manejo remoto. El archivo de configuración de SSH se encuentra en   /etc/ssh/sshd_config  donde podremos retocar el puerto sobre el que escucha, podremos denegar el acceso al root (en la practica muy aconsejable) y un largo etcétera de opciones.

INSTALACION DE MYSQL 3.23.49-8.9 

Bueno como el sistema de correo que queremos utilizar esta basado en acceso a bases de datos para la autenticación de usuarios, y no crear a los usuarios en el sistema, utilizaremos MYSQL, muy facilita de manejar y encima casi todos las aplicaciones que podamos utilizar tendrán alguna opción para guardar datos en MYSQL (squirrelmail para guardar perfiles de usuarios, ....)

Bueno la instalación de MYSQL es muy facilita de realizar si sabemos que paquetes debemos decir que instale, estos son:

cartero:~#apt-get install gawk libc6-dev libdbd-mysql-perl libdbi-perl libmysqlclient10  libmysqlclient10-dev mysql-client mysql-common mysql-server perl perl-modules zlib1g-dev

Un total de 12 paquetes, no todos son para la instalación de MYSQL, pero si se utilizaran a lo largo de la configuración del servidor, casi todos los paquetes que aquí veis los tuve que utilizar para la posterior compilación de MAILDROP. 

Un ratito en internet descargando paquetes y nos preguntara un par de cositas, la primera si queremos que purgue las bases de datos, dile que no. La otra pregunta es que si queremos que el demonio de MYSQL arranque al iniciar, le diremos que si.

Muy bien ya tenemos la versión 3.23.49-8.9 de MYSQL (la estable en este momento, Abril 2005).

Ahora vamos a configurar todo lo que necesitamos.

Yo me he creado un archivo (vi /cosas/crea_bbdd.dat)  en el directorio /cosas en el cual he metido todo lo que necesito para crear la bases de datos, sus usuarios, etc. El archivo en cuestión queda así:

#
# Creo los usuarios postfix y maildrop para que puedan entrar a la bbdd 
#
USE mysql
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfix',password('postfix'));
INSERT INTO user (Host, User, Password) VALUES ('localhost','maildrop',password('postfix'));

INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','postfix','Y');
INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','maildrop','Y');

FLUSH PRIVILEGES;

#
# Creamos la bbdd postfix
#
CREATE DATABASE postfix;

#
# Creamos la estructura de la tabla alias
#
USE postfix;
CREATE TABLE alias (
address varchar(255) NOT NULL default '',
goto text NOT NULL,
domain varchar(255) NOT NULL default '',
create_date datetime NOT NULL default '0000-00-00 00:00:00',
change_date datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(4) NOT NULL default '1',
PRIMARY KEY (address)
) TYPE=MyISAM COMMENT='Virtual Aliases - mysql_virtual_alias_maps';
                             		                                                
#
# Creamos la estructura de la tabla domain
#
USE postfix;
CREATE TABLE domain (
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
transport varchar(255) NOT NULL default 'maildrop',
create_date datetime NOT NULL default '0000-00-00 00:00:00',
change_date datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(4) NOT NULL default '1',
PRIMARY KEY (domain)
) TYPE=MyISAM COMMENT='Virtual Domains - mysql_virtual_domains_maps';

#
# Creamos la estructura de la tabla mailbox
#
USE postfix;
CREATE TABLE mailbox (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
home char(255) default '/cartas/',
maildir varchar(255) NOT NULL default '',
quota varchar(255) NOT NULL default '10000000S',
domain varchar(255) NOT NULL default '',
create_date datetime NOT NULL default '0000-00-00 00:00:00',
change_date datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(4) NOT NULL default '1',
passwd_expire enum('N','Y') default 'Y',
uid int(10) unsigned default '108',
gid int(10) unsigned default '108',
PRIMARY KEY (username)
) TYPE=MyISAM COMMENT='Virtual Mailboxes - mysql_virtual_mailbox_maps';

#
# Creo al usuario postfixadmin con otro privilegios diferentes a los otros dos usuarios, nos servirá para administrar sin problemas esta base de datos
#
USE mysql
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfixadmin',password('postfixadmin'));

INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv) VALUES ('localhost', 'postfix', 'postfixadmin', 'Y', 'Y', 'Y', 'Y');
FLUSH PRIVILEGES;   

#
#  Creamos la estructura de la tabla admin
#
USE postfix;
CREATE TABLE admin (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
create_date datetime NOT NULL default '0000-00-00 00:00:00',
change_date datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(4) NOT NULL default '1',
PRIMARY KEY (username)
) TYPE=MyISAM COMMENT='Virtual Admins - Store Virtual Domain Admins';

Cuando paséis esto al archivo /etc/crea_bbdd.dat tened cuidado no dejéis intros entre las líneas que crean tablas o usuarios, es decir el documento que estáis leyendo me esta ajustando la línea para que podáis leerla pero en realidad no hay intros entre las comas, solo entre los puntos y coma, tened en cuenta esta regla durante todo el documento, vi es una pizca difícil de manejar pero una vez que te haces todo sale.... 

Una vez creado el archivo podemos darle las instrucciones a mysql para que haga todo lo que queremos, esto se hace con este comando, suponiendo que estemos como root:

cartero:~#mysql -u root < /cosas/crea_bbdd.dat

Podemos verificar que todo lo ha hecho bien:

cartero:~# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 3.23.49-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases
    -> ;
+----------+
| Database |
+----------+
| mysql    |
| postfix  |
| test     |
+----------+
3 rows in set (0.01 sec)

mysql> use postfix;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------+
| Tables_in_postfix |
+-------------------+
| admin             |
| alias             |
| domain            |
| mailbox           |
+-------------------+
4 rows in set (0.00 sec)

mysql> desc admin;
+-------------+--------------+------+-----+---------------------+-------+
| Field       | Type         | Null | Key | Default             | Extra |
+-------------+--------------+------+-----+---------------------+-------+
| username    | varchar(255) |      | PRI |                     |       |
| password    | varchar(255) |      |     |                     |       |
| domain      | varchar(255) |      |     |                     |       |
| create_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| change_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| active      | tinyint(4)   |      |     | 1                   |       |
+-------------+--------------+------+-----+---------------------+-------+
6 rows in set (0.00 sec)

mysql> desc alias;
+-------------+--------------+------+-----+---------------------+-------+
| Field       | Type         | Null | Key | Default             | Extra |
+-------------+--------------+------+-----+---------------------+-------+
| address     | varchar(255) |      | PRI |                     |       |
| goto        | text         |      |     |                     |       |
| domain      | varchar(255) |      |     |                     |       |
| create_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| change_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| active      | tinyint(4)   |      |     | 1                   |       |
+-------------+--------------+------+-----+---------------------+-------+
6 rows in set (0.00 sec)

mysql> desc domain;
+-------------+--------------+------+-----+---------------------+-------+
| Field       | Type         | Null | Key | Default             | Extra |
+-------------+--------------+------+-----+---------------------+-------+
| domain      | varchar(255) |      | PRI |                     |       |
| description | varchar(255) |      |     |                     |       |
| transport   | varchar(255) |      |     | maildrop            |       |
| create_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| change_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| active      | tinyint(4)   |      |     | 1                   |       |
+-------------+--------------+------+-----+---------------------+-------+
6 rows in set (0.00 sec)

mysql> desc mailbox;
+---------------+------------------+------+-----+---------------------+-------+
| Field         | Type             | Null | Key | Default             | Extra |
+---------------+------------------+------+-----+---------------------+-------+
| username      | varchar(255)     |      | PRI |                     |       |
| password      | varchar(255)     |      |     |                     |       |
| name          | varchar(255)     |      |     |                     |       |
| home          | varchar(255)     | YES  |     | /postfix/           |       |
| maildir       | varchar(255)     |      |     |                     |       |
| quota         | varchar(255)     |      |     | 10000000S           |       |
| domain        | varchar(255)     |      |     |                     |       |
| create_date   | datetime         |      |     | 0000-00-00 00:00:00 |       |
| change_date   | datetime         |      |     | 0000-00-00 00:00:00 |       |
| active        | tinyint(4)       |      |     | 1                   |       |
| passwd_expire | enum('N','Y')    | YES  |     | Y                   |       |
| uid           | int(10) unsigned | YES  |     | 108                 |       |
| gid           | int(10) unsigned | YES  |     | 108                 |       |
+---------------+------------------+------+-----+---------------------+-------+
13 rows in set (0.00 sec)

mysql> select * from mysql.user;
+-----------+------------------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+
| Host      | User             | Password         | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv |
+-----------+------------------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+
| localhost | root             |                  | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         | Y          | Y               | Y          | Y          |
| cartero   | root             |                  | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         | Y          | Y               | Y          | Y          |
| localhost |                  |                  | N           | N           | N           | N           | N           | N         | N           | N             | N            | N         | N          | N               | N          | N          |
| cartero   |                  |                  | N           | N           | N           | N           | N           | N         | N           | N             | N            | N         | N          | N               | N          | N          |
| localhost | debian-sys-maint | 24644518650727ed | N           | N           | N           | N           | N           | N         | Y           | Y             | N            | N         | N          | N               | N          | N          |
| localhost | postfix          | 3ecf3e4f55dd846f | N           | N           | N           | N           | N           | N         | N           | N             | N            | N         | N          | N               | N          | N          |
| localhost | maildrop         | 7e986dfe1718fb08 | N           | N           | N           | N           | N           | N         | N           | N             | N            | N         | N          | N               | N          | N          |
| localhost | postfixadmin     | 0b553b00631b84ae | N           | N           | N           | N           | N           | N         | N           | N             | N            | N         | N          | N               | N          | N          |
+-----------+------------------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+
8 rows in set (0.00 sec)

INSTALACION DE COURIER-IMAP 1.4.3-2.5

Como vamos a utilizar Postfix para con soporte Maildir
 necesitamos Courier IMAP que permite el acceso a este tipo de bases de datos, será tambien el encargado de dar servicio POP3 e IMAP en nuestro servidor.

La instalación constara de un total de 5 paquetes, son estos:

cartero:~#apt-get install courier-authdaemon courier-authmysql courier-base courier-imap courier-pop

La instalación nos pedirá un OK, se lo damos, solo tenemos esa opción.

Vamos a configurar todo lo que hemos instalado:

Lo primero, editaremos el archivo /etc/courier/authdaemonrc

Buscaremos la línea: 

authmodulelist="authpam" 

y la cambiaremos por: 

authmodulelist="authmysql"

después de esto editaremos el archivo /etc/courier/authmysqlrc

Yo borro por completo lo que viene por defecto y pongo lo que aquí os dejo:

MYSQL_SERVER            localhost
MYSQL_USERNAME          postfix
MYSQL_PASSWORD          postfix
MYSQL_SOCKET            /var/run/mysqld/mysqld.sock
MYSQL_PORT              3306
MYSQL_OPT               0
MYSQL_DATABASE          postfix
MYSQL_USER_TABLE        mailbox
MYSQL_CRYPT_PWFIELD     password
MYSQL_UID_FIELD         uid
MYSQL_GID_FIELD         gid
MYSQL_LOGIN_FIELD       username
MYSQL_HOME_FIELD        home
MYSQL_NAME_FIELD        name
MYSQL_MAILDIR_FIELD     maildir
MYSQL_QUOTA_FIELD       quota
MYSQL_WHERE_CLAUSE      active=1
Aseguraos que el la línea MYSQL_SOCKET esta bien puesta podemos cerciorarnos editando el archivo /etc/mysql/my.cnf y fijarnos donde pone socket, debe ser la misma ruta.

Reiniciaremos los servicios para que recoja la nueva configuración:

cartero:~# /etc/init.d/courier-authdaemon restart

cartero:~# /etc/init.d/courier-imap restart

cartero:~# /etc/init.d/courier-pop restart

Comprobaremos que todo funciona:

cartero:~# netstat -an |grep LISTEN
tcp        0      0 0.0.0.0:37              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:9               0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:13              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN

Perfecto el puerto 110 y el puerto 143 están a la escucha, probemos mas, esto lo podemos hacer desde la misma maquina que estamos configurando o desde otra que tenga acceso por red al servidor de correo, yo lo he hecho en la misma maquina:

cartero:~# telnet 10.19.4.17 110
Trying 10.19.4.17...
Connected to 10.19.4.17.
Escape character is '^]'.
+OK Hello there.
quit
+OK Better luck next time.
Connection closed by foreign host.

cartero:~# telnet 10.19.4.17 143
Trying 10.19.4.17...
Connected to 10.19.4.17.
Escape character is '^]'.
* OK Courier-IMAP ready. Copyright 1998-2002 Double Precision, Inc.  See COPYING for distribution information.
0 logout
* BYE Courier-IMAP server shutting down
0 OK LOGOUT completed
Connection closed by foreign host.

Perfecto por ahora todo va bien, sigamos.

INSTALACION DE MAILDROP 1.6.3

Este fue uno de los huesos duros de roer, aquí me quede enganchado un par de días, no había quien compilase este paquete. Alguien dirá ¿y por que lo compila si existe en la distribución de woody? Porque el que viene en la distribución de woody no soportaba el acceso a MYSQL, con lo cual se cargaba todo el chiringuito. Bueno fue duro para mi pero espero que con este documento os resulte fácil. Deciros tambien que la compilación que logre fue de la versión 1.6.3, en ese momento ya estaba la versión 1.8 pero me fue imposible realizarla, y además el manual que yo seguía hablaba de la 1.6.3 así que mejor que mejor.

Lo primero que vamos a hacer es instalar un gestor de descargas, un descompresor y los paquetes esenciales para compilar el paquete que descarguemos:

cartero:~# apt-get install wget bzip2 build-essential

Ésto nos instalará un total de 15 paquetes (binutils build-essential bzip2 cpp cpp-2.95 dpkg-dev g++ g++-2.95 gcc gcc-2.95 libbz2-1.0 libstdc++2.10-dev make patch wget)

Un rato descargando y un OK y tenemos instalado lo que necesitábamos.

Ahora nos vamos al directorio /cosas y descargaremos el paquete de maildrop.

cartero:~# cd /cosas
cartero:/cosas# wget <http://puzzle.dl.sourceforge.net/sourceforge/courier/maildrop-1.6.3.tar.bz2>

--18:03:20--  http://puzzle.dl.sourceforge.net/sourceforge/courier/maildrop-1.6.3.tar.bz2
           => `maildrop-1.6.3.tar.bz2'
Resolving puzzle.dl.sourceforge.net... done.
Connecting to puzzle.dl.sourceforge.net[195.141.101.221]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 658,173 [application/x-redhat-package-manager]

100%[==================================================================================>] 658,173       41.06K/s    ETA 00:00

18:03:36 (41.06 KB/s) - `maildrop-1.6.3.tar.bz2' saved [658173/658173]

(aquí se ve perfectamente lo que os contaba arriba del ajuste de línea al crear el documento, toda la línea va seguida salvo un espacio entre wget y la dirección url)

Muy bien ya tenemos descargado el archivo maildrop-1.6.3.tar.bz2 en /cosas/

A descomprimirlo:

Yo he creado dentro de cosas para no liarme un directorio llamado source donde meteré lo que iré descomprimiendo, los puntos suspensivos son los archivos que se van descomprimiendo:

cartero:/cosas# mkdir /cosas/source
cartero:/cosas# tar -jxvf maildrop-1.6.3.tar.bz2 -C /cosas/source/
	.....	
	.....
	.....
cartero:/cosas# cd /cosas/source/maildrop-1.6.3/

Muy bien ya estamos donde se ha descomprimido Maildrop. Ahora vamos a compilarlo, no sabéis lo que me costo sacar esta línea para compilarlo:

cartero:/cosas/source/maildrop-1.6.3#./configure --enable-syslog=1 --enable-maildrop-uid=108 --enable-maildrop-gid=108 --enable-maildropmysql --with-mysqlconfig=/etc/maildropmysql.config --without-db --enable-maildirquota
	.....
	.....	
	.....
	.....
Otra vez el ajuste de línea, los puntos suspensivos son los paquetes que se están compilando.

Hagamos el make:

cartero:/cosas/source/maildrop-1.6.3#make -s
	.....	
	.....
	.....
	.....
Ultimas comandos para hacerlo funcional:

cartero:/cosas/source/maildrop-1.6.3# cd maildrop
cartero:/cosas/source/maildrop-1.6.3/maildrop# strip maildrop
cartero:/cosas/source/maildrop-1.6.3/maildrop# cp maildrop /usr/bin
cartero:/cosas/source/maildrop-1.6.3/maildrop# chmod a+rx /usr/bin/maildrop
cartero:/cosas/source/maildrop-1.6.3# mkdir /etc/maildrop
cartero:/cosas/source/maildrop-1.6.3# cd ..
cartero:/cosas/source/maildrop-1.6.3# cp maildropmysql.config /etc/
cartero:/cosas/source/maildrop-1.6.3# cp maildir/quotawarnmsg /etc/maildrop/

Para comprobar que todo funciona pondremos el siguiente comando:

cartero:/cosas/source/maildrop-1.6.3/maildrop# maildrop -v
maildrop 1.6.3 Copyright 1998-2003 Double Precision, Inc.
Maildir quota extension enabled.
Virtual user database via MySQL extension enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.

Si nos damos cuenta debe decirnos que tenemos la versión 1.6.3 y que tenemos habilitado el uso de quota y el uso de usuarios virtuales a través de MYSQL.

No sabéis que alegría cuando vi el resultado de este ultimo comando.

Sigamos con la configuración de Maildrop, no todo esta hecho:

Crearemos un directorio para los buzones de correo, yo le he llamado cartas y cuelga del directorio raíz, si ya te creaste la partición del disco duro pues el primer comando te lo ahorras:

cartero:/# mkdir /cartas
cartero:/# chown maildrop /cartas/
cartero:/# chmod 770 /cartas/

Configuraremos el archivo /etc/maildropmysql.config, yo borro el contenido del que copie por defecto  meto lo que escribo mas abajo:

hostname                localhost
port                    3306
socket                  /var/run/mysqld/mysqld.sock
database                postfix
dbuser                  maildrop
dbpw                    maildrop
dbtable                 mailbox
default_gidnumber       108
default_uidnumber       108
uid_field               username
uidnumber_field         uid
gidnumber_field         gid
maildir_field           maildir
homedirectory_field     home
quota_field             quota
mailstatus_field        active
where_clause            ""

Cuidado con el socket, acordaos que debe coincidir con el que esta en 
/etc/mysql/my.cnfen la ligna socket.

Maildrop ya esta instalado, vayamos a por lo siguiente:

INSTALACION DE POSTFIX 2.1.5-0.backports.org.1

Para esta instalación, como ya os dije, utilizaremos Backpoorts, para instalar una versión algo mas actual, que nos soporte quotas. Lo primero que haremos será añadir a nuestro sources.list las líneas de backports para el paquete postfix, lo haremos editando el archivo /etc/apt/sources.list para dejarlo algo así:

cartero:/# vi /etc/apt/sources.list

deb http://ftp.es.debian.org/debian/ stable main non-free
deb-src http://ftp.es.debian.org/debian/ stable main non-free

deb http://www.backports.org/debian stable postfix
deb-src http://www.backports.org/debian stable postfix

deb http://security.debian.org/ stable/updates main contrib non-free

después haremos un update de los paquetes de apt y luego instalaremos:

cartero:/# apt-get update

Esto actualizara los paquetes

cartero:/# apt-get install postfix-tls postfix-mysql postfix

Y esto nos instalara la versión 2.1.5-0.backports.org.1 de POSTFIX. Si os salen mas de tres paquetes a instalar volved a mirar el /etc/apt/sources.list para ver si quedo bien lo que añadisteis y comprobad que hizo bien el apt-get update. Puede ser que ponga mas paquetes, a mes de abril de 2005 solo son esos 3, todo esto lo digo porque me ha pasado y al ir a editar el archivo 
/etc/postfix/master.cf (lo veremos mas adelante) me encontré cosas que no quería.

Para seguir configurando Postfix necesitamos crearnos 4 archivos, éstos archivos  tendrán las configuraciones de acceso a la bbdd.

Estos archivos deben estar en /etc/postfix

/etc/postfix/mysql_virtual_alias_maps.cf

user = postfix
password= postfix
dbname = postfix
table = alias
select_field = goto
where_field = address
hosts = localhost

/etc/postfix/mysql_virtual_mailbox_maps.cf

user = postfix
password= postfix
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
hosts = localhost

/etc/postfix/mysql_transport_maps.cf

user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = domain
select_field = transport
where_field = domain

/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

user = postfix
password = postfix
dbname = postfix
table = mailbox
select_field = quota
where_field = username
hosts = localhost

Seguimos con la configuración de Postfix y ahora nos tendremos que editar el archivo /etc/postfix/master.cf, aquí tengo que hacer una reseña, yo NO he enjaulado a Postfix. Es algo que me queda por hacer. Para el siguiente manual, lo tendré hecho. A lo que estábamos, editamos el archivo  
/etc/postfix/master.cf.

El archivo /etc/postfix/master.cf tiene una aspecto de tabla, si nos fijamos en la columna chroot (enjaulado) nos viene un -, yo he puesto todos a n.

El otro cambio que hay que hacer ahora en este archivo es el siguiente:

Buscamos la línea que pone:

maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}

y la cambiamos por esta:

maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=maildrop argv=/usr/bin/maildrop -w 90 -d ${recipient}
Comprobad que tenemos el archivo maildrop en el directorio /usr/bin, si no es así volved a la configuración de maildrop y allí teníamos una línea que nos copiaba el archivo a la carpeta.

Tenemos que tener especial cuidado al editar el archivo master.cf, respetad las columnas, es decir dejarlas igual que estaban lo único cambiando el guión por la n, otra cosa a tener en cuenta es que en el segundo retoque del archivo master.cf debemos dejar al menos dos espacios antes de la palabra flags. 

Ahora editaremos el archivo /etc/postfix/main.cf, el archivo que deja por defecto es muy simple, borrad todo lo que tiene y cambiadlo por este:

#======== CONFIGURACIONES ===============
queue_directory = /var/spool/postfix/
program_directory=/usr/sbin
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
mail_owner = postfix
default_privs=nobody
default_transport=smtp
alias_maps=hash:/etc/postfix/aliases
alias_database=hash:/etc/postfix/aliases
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
manpage_directory = /usr/local/man
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
smtpd_banner=$myhostname ESMTP MI DOMINIO
disable_vrfy_command=yes
home_mailbox=Maildir/

                                                                                
# ========== NOMBRE DE LOS DOMINIOS ===========
myhostname=cartero.dominio.com
mydomain=cartero.local
myorigin= $mydomain
mydestination= $mydomain, $transport_maps

#=====REDES ======
# Solo pongo la 127.0.0.1
#
mynetworks=127.0.0.0/8  

#======== MYSQL ==============
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_base = /cartas
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_uid_maps = static:108
virtual_gid_maps = static:108
transport_maps = mysql:/etc/postfix/mysql_transport_maps.cf
local_recipient_maps=

#======= CUOTA ============
virtual_mailbox_limit_inbox = no
virtual_mailbox_limit_maps= mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_create_maildirsize = yes
virtual_mailbox_limit = 100000000
virtual_maildir_limit_message = Lo siento, el usuario se ha quedado sin espacio en el buzon.
virtual_overquota_bounce = yes
                                                                                
# =======MAILDROP ==========
fallback_transport = /usr/bin/maildrop
maildrop_destination_recipient_limit = 1
unknown_local_recipient_reject_code = 450

Si os fijáis hay en la línea local_recipient_maps= no hay nada escrito, esto arregla un error que me daba, para ser mas exactos error 450 al hacer telnet al puerto 25, lo que hacemos es deshabilitar a los usuarios locales.
Bueno, ahora nos queda arreglar otro error que me daba a mi, un error en el log de /var/log/mail.log, un error de aliases.

cartero:/# cp /etc/aliases /etc/postfix/
cartero:/# newaliases
postalias: warning: /etc/postfix/aliases.db: duplicate entry: "news"

Nos da un warning, una entrada duplicada en news, no ocurre nada.

Seguimos.

Es momento de empezar a llenar las tablas con datos, para ello yo intente hacerlo con webmin, pero no me cogia los datos por defecto que debía rellenar, aun así no pasa nada porque mas adelante lo haremos con postfixadmin, para los usuarios de ahora nos creamos un pequeño script y metemos los datos, el script es este:

Script para crear usuario:

INSERT INTO mailbox(username,password,name,home,maildir,quota,domain)VALUES ('juanmi@domino.com' ,encrypt('juanmi') ,'Juan Miguel' ,'/cartas/' ,'dominio.com/juanmi/Maildir/' ,'10000000S' ,'dominio.com');
 
Script para crear dominio:

INSERT INTO domain(domain,description,transport,active) VALUES ('dominio.com' ,'Dominio de Prueba' ,'maildrop' ,'1');

Para introducir los datos en la base de datos POSTFIX haremos lo siguiente:

cartero:/cosas# mysql -D postfix -u root < /cosas/crea_dominio.dat
cartero:/cosas# mysql -D postfix -u root < /cosas/crea_usuario.dat

Muy bien podemos mirar si lo hemos hecho bien:

cartero:/cosas# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5 to server version: 3.23.49-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use postfix;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from mailbox;

	.....
	.....
	.....

mysql>select * from domain;

	.....	
	.....
	.....

mysql> exit;
Bye

Ahora tenemos que crear los directorios donde se almacenaran los correos de la gente, el sistema es fácil dentro del directorio cartas colgaran tantos directorios como dominios tengamos en la base de datos, dentro de cada directorio con nombre de dominio tendremos tantos usuarios como usuarios del dominio. Por ejemplo /cosas/dominio.com/juanmi. Para crearlos haremos lo siguiente:

cartero:/# mkdir -p /cartas/dominio.com/juanmi
cartero:/# maildirmake /cartas/dominio.com/juanmi/Maildir
cartero:/# chown maildrop /cartas/ -R
cartero:/# chmod 770 /cartas/ -R

Fijaos que la M de Maildir esta en mayusculas.

El comando maildirmake nos ha creado dentro de juanmi un directorio llamado Maildir que contiene las tres carpetas del buzon, cur, new, tmp.

Reiniciemos los servicios de Postfix:

cartero:/# /etc/init.d/postfix restart
Stopping mail transport agent: Postfix.
Starting mail transport agent: Postfix.

Perfecto, empezemos a hacer pruebas:

Lo primero testearemos el maildrop, utilizaremos el siguiente comando:

cartero:/# cat /etc/lilo.conf |maildrop -d juanmi@dominio.com <mailto:juanmi@dominio.com>
cartero:/# ls /cartas/dominio.com/juanmi/Maildir/new/
1113302660.M221752P414V0000000000000802I00007DE7_0.cartero,S=4105

Perfecto funciona.

Miremos el log:

cartero:/# vi /var/log/mysql.log

Justo al final nos deben salir unas líneas así:

050412 12:45:40       7 Connect     maildrop@localhost on
                      7 Init DB     postfix
                      7 Query       SELECT username, uid, gid, home, maildir, qu
ota FROM mailbox WHERE username = "juanmi@dominio.com" ""
                      Quit

Perfecto, probemos ahora a postfix. Para ello utilizaremos el telnet:

cartero:/# telnet 10.19.4.10 25
Trying 10.19.4.10...
Connected to 10.19.4.10.
Escape character is '^]'.
220 cartero.dominio.com ESMTP MI DOMINIO
ehlo localhost
250-cartero.dominio.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250 8BITMIME
mail from: juanmi@pruebitas.com
250 Ok
rcpt to:juanmi@dominio.com
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
Hola pepsicola
.
250 Ok: queued as 44B412AF10
quit
221 Bye
Connection closed by foreign host.

Muy bien comprobemos que esta todo en su directorio:

cartero:/# ls /cartas/dominio.com/juanmi/Maildir/new

Este comando debe sacarnos un nuevo mail.

Miremos el log, buscad las líneas donde pone status sent:

cartero:/# vi /var/log/mail.log

Apr 12 12:55:00 cartero postfix/smtpd[606]: 44B412AF10: client=unknown[10.19.4.10]
Apr 12 12:55:07 cartero postfix/cleanup[614]: 44B412AF10: message-id=<20050412105451.44B412AF10@cartero.dominio.com>
Apr 12 12:55:07 cartero postfix/qmgr[605]: 44B412AF10: from=<juanmi@pruebitas.com>, size=353, nrcpt=1 (queue active)
Apr 12 12:55:07 cartero postfix/pipe[628]: 44B412AF10: to=<juanmi@dominio.com>, relay=maildrop, delay=16, status=sent (dominio.com)
 
Perfecto, funciona todo. No sabéis lo que me costo conseguir todo esto, espero que no os encontréis con muchos problemas.

Sigamos haciendo comprobaciones, ya hemos enviado, veamos si podemos leer lo que nos hemos enviado:

Empezaremos con el protocolo IMAP:

cartero:/# telnet 10.19.4.10 143
Trying 10.19.4.10...
Connected to 10.19.4.10.
Escape character is '^]'.
* OK Courier-IMAP ready. Copyright 1998-2002 Double Precision, Inc.  See COPYING for distribution information.
C:a login juanmi@dominio.com juanmi
C:a OK LOGIN Ok.
C:a select inbox
* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
* OK [PERMANENTFLAGS (\Draft \Answered \Flagged \Deleted \Seen)] Limited
* 3 EXISTS
* 3 RECENT
* OK [UIDVALIDITY 1113303852] Ok
C:a OK [READ-WRITE] Ok
0 logout
* BYE Courier-IMAP server shutting down
0 OK LOGOUT completed
Connection closed by foreign host.

Perfecto tengo 3 mails y los tres sin leer.

Probemos ahora con POP3

cartero:/# telnet 10.19.4.10 110
Trying 10.19.4.10...
Connected to 10.19.4.10.
Escape character is '^]'.
+OK Hello there.
user juanmi@dominio.com
+OK Password required.
pass juanmi
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 4235
2 4235
3 422
.
quit
+OK Bye-bye.
Connection closed by foreign host.

Perfecto, sigo teniendo los tres mails. Sigamos adelante, nos va quedando menos.

CUOTA DE DISCO 

Lo único que haremos serán comprobaciones ya que las configuraciones las realizamos mas atrás. El encargado de llevar a cabo el tema de las cuotas es Maildrop, cuando enviamos un mensaje al buzon, Maildrop crea un archivo dentro de la carpeta Maildir correspondiente al buzon llamado maildirsize (/cartas/dominio.com/juanmi/Maildir/maildirsize), aquí tenemos cual es nuestra cuota máxima y cuanto van sumando nuestros mensajes. Podemos comprobarlo así:

cartero:/#cat /cartas/dominio.com/juanmi/Maildir/maildirsize

10000000S
       0    0
    4105    1
    4105    1
     411    1

Tengo 3 mails con sus tamaños correspondientes y una cuota máxima de 10.000.000, alrededor de 10 Mb.

Perfecto vamos a intentar superar esa cuota, bajémosla primero y luego llenaremos el buzon.

cartero:~# mysql -D postfix -u root -e "UPDATE mailbox SET quota='1000000S' WHERE username='juanmi@dominio.com';"

Comprobemos que se ha actualizado:

cartero:~# mysql -D postfix -u root -e "SELECT username, quota from mailbox where username='juanmi@dominio.com';"
+--------------------+----------+
| username           | quota    |
+--------------------+----------+
| juanmi@dominio.com | 1000000S |
+--------------------+----------+

Perfecto una vez actualizada la cuota llenémosla:

Para ello yo he utilizado el outlook express, le he puesto un archivito adjunto de 600 Kb, el primer mail lo acepta pero el segundo me lo rechaza, este es el mensaje de Postfix, que me aparece en el outlook express:

This is the Postfix program at host cartero.dominio.com.

I'm sorry to have to inform you that your message could not be
be delivered to one or more recipients. It's attached below.

For further assistance, please send mail to <postmaster>

If you do so, please include this problem report. You can
delete your own text from the attached returned message.

The Postfix program

<juanmi@dominio.com <mailto:juanmi@dominio.com>>: permission denied. Command output: maildrop: maildir over
quota.

Veamos que nos dice el log:

cartero:~# vi /var/log/mail.log

Apr 12 13:44:15 cartero postfix/qmgr[351]: A16C82AF10: from=<juanmi@dominio.com>, size=903014, nrcpt=1 (queue active)
Apr 12 13:44:15 cartero postfix/smtpd[416]: disconnect from unknown[10.19.4.12]
Apr 12 13:44:15 cartero postfix/pipe[427]: A16C82AF10: to=<juanmi@dominio.com>, relay=maildrop, delay=1, status=bounced (permiss
ion denied. Command output: maildrop: maildir over quota. )

Perfecto, otra forma de probarlo sin utilizar el outlook express es bajar mas la cuota y empezar a llenarlo con mensaje de texto, acordaos de la línea de arriba:

cartero:~#cat /etc/lilo.conf |maildrop -d juanmi@dominio.com <mailto:juanmi@dominio.com>

Subamos de nuevo la cuota, si queremos seguir haciendo pruebas, que podamos ¿no?

Volvemos a poner el comando, pero esta vez con un 0 mas:

cartero:~# mysql -D postfix -u root -e "UPDATE mailbox SET quota='10000000S' WHERE username='juanmi@dominio.com <mailto:username%3D'juanmi@dominio.com>';"

INSTALACION SASL 1.5.27-3.1woody5

Este ha sido otro de los huesos, y además algo sin lo que este servidor no puede estar, necesitamos que para realizar el envío de correos el usuario se valide, sino nuestro servidor seria un coladero para los que se dedican a enviar SPAM.

La otra opción es utilizar la opción del archivo /etc/postfix/main.cf, donde pone  mynetworks pusimos 127.0.0.1, debido a que yo quiero que se valide todo el mundo, nunca sabes si dentro de tus redes quieren hacer envío de SPAM, otra opción es que tu sepas quien va a enviar y le des permiso en mynetworks y no utilizaras SASL.

Como os he dicho la instalación de SASL fue muy dura, me obsesiones intentando pones la versión sasl2, y claro no me acabo de funcionar, así que a por la de la versión de woody, que funciona a las mil maravillas (Bendito WOODY).

Manos a la obra:

** NOTA sobre actualizacion ** (Junio 2005). Debido al cambio de la version estable de Debian (paso de woody a sarge) me di de bruces con el sasl, en la version de sarge no esta disponible la version de SASL 1.* es decir estamos obligados a pasar a sasl2. Abajo pongo como instalarlo.

cartero:~# apt-get install sasl-bin libsasl-modules-plain libpam-mysql

Esta instalación nos habrá dejado un par de directorios nuevos (/etc/postfix/sasl y /etc/pam.d/) tenderemos que crearnos dos archivos nuevos para que postfix autentique a los usuarios, debemos decirle a Postfix que utilice SASL y PAM y a PAM que utilice a MYSQL para validar a los usuarios.

Lo dicho debemos crearnos los dos archivos, el primero:

cartero:/# vi /etc/postfix/sasl/smtpd.conf

Debe contener lo siguiente:

pwcheck_method: pam

El otro fichero a crear será /etc/pam.d/smtp y contendra lo siguiente:

auth required pam_mysql.so user=postfix passwd=postfix host=localhost db=postfix table=mailbox usercolumn=username passwdcolum
n=password crypt=1

account sufficient pam_mysql.so user=postfix passwd=postfix host=localhost db=postfix table=mailbox usercolumn=username passwd
column=password crypt=1

Acordaos del ajuste de línea

Editaremos de nuevo el archivo /etc/postfix/main.cf y añadiremos las siguientes líneas:

# ========== SASL ===========
smtpd_sasl_auth_enable=yes
broken_sasl_auth_clients=yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,check
_relay_domains

Cuidado de nuevo con el ajuste línea

Reiniciamos todos los servicios, hemos hecho demasiados cambios en la configuración, init 6 y reiniciamos la maquina.

Cartero:~# init 6 

Muy bien después de hacer esto empezaremos a hacer pruebas, la primero que hago es intentar mandar un correo, a un dominio de fuera, desde outlook express sin marcarle la casilla de “Mi servidor requiere autenticación”, da este error:

El mensaje no se pudo enviar, uno de los destinatarios fue rechazado por el servidor. Su dirección de correo electrónico es "juanmi@dominio <mailto:juanmi@dominio>defuera.com". Asunto 'Prueba SASL', Cuenta: '10.19.4.10', Servidor: '10.19.4.10', Protocolo: SMTP, Respuesta del servidor: '554 <juanmi@dominiodefuera.com>: Recipient address rejected: Relay access denied', Puerto: 25, Seguridad (SSL): No, Error de servidor: 554, Número de error: 0x800CCC79

Perfecto, marquemos ahora la casilla “Mi servidor requiere autenticación” para que nos valide, nos debe enviar el correo y el log debe decirnos esto:

cartero:~# vi /var/log/mail.log

Apr 12 17:32:33 cartero postfix/smtpd[430]: connect from unknown[10.19.4.12]
Apr 12 17:32:33 cartero postfix/smtpd[430]: 485652AF10: client=unknown[10.19.4.12], sasl_method=LOGIN, sasl_username=juanmi@dominio.com
Apr 12 17:32:33 cartero postfix/cleanup[439]: 485652AF10: message-id=<009801c53f74$d8a5d4f0$0c04130a@xxxxx.local>
Apr 12 17:32:33 cartero postfix/qmgr[345]: 485652AF10: from=<juanmi@dominio.com>, size=1377, nrcpt=1 (queue active)
Apr 12 17:32:33 cartero postfix/smtpd[430]: disconnect from unknown[10.19.4.12]
Apr 12 17:32:34 cartero postfix/smtp[442]: 485652AF10: to=<juanmi@dominiodefuera.com>, relay=mailhost.dominiodefuera.com[195.54.44.123], del
ay=1, status=sent (250 Ok, message saved)
Apr 12 17:32:34 cartero postfix/qmgr[345]: 485652AF10: removed

Perfecto, validados contra mysql y enviando a un servidor de fuera.

Sin tener que autenticarme, puedo enviar mensajes de correo a cuantas de dentro, es decir: pedro@palotes.mentira <mailto:pedro@palotes.mentira> podría enviar a juanmi@dominio.com <mailto:juanmi@dominio.com> sin tener que validarse, podemos hacer la prueba:

cartero:~# telnet 10.19.4.10 25
Trying 10.19.4.10...
Connected to 10.19.4.10.
Escape character is '^]'.
220 cartero.dominio.com ESMTP MI DOMINIO
ehlo localhost
250-cartero.dominio.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
mail from:pedro@palotes.mentira
250 Ok
rcpt to:juanmi@dominio.com
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
Hola
.
250 Ok: queued as 4DD902AF10
quit
221 Bye
Connection closed by foreign host.

Y podemos ver que nos ha llegado por ejemplo con este comando:

cartero:~#cat /cartas/dominio.com/juanmi/Maildir/new/1113320292.M955133P463V0000000000000802I00007DF0_0.cartero,S\=403

Return-Path: <pedro@palotes.mentira>
Delivered-To: juanmi@dominio.com
Received: from localhost (unknown [10.19.4.10])
        by cartero.dominio.com (Postfix) with ESMTP id 4DD902AF10
        for <juanmi@dominio.com>; Tue, 12 Apr 2005 17:37:57 +0200 (CEST)
Message-Id: <20050412153757.4DD902AF10@cartero.dominio.com>
Date: Tue, 12 Apr 2005 17:37:57 +0200 (CEST)
From: pedro@palotes.mentira
To: undisclosed-recipients:;

Hola

Si intentamos hacer lo mismo contra un dominio de fuera, nos dará un error:

cartero:~# telnet 10.19.4.10 25
Trying 10.19.4.10...
Connected to 10.19.4.10.
Escape character is '^]'.
220 cartero.dominio.com ESMTP MI DOMINIO
ehlo localhost
250-cartero.dominio.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
mail from:pedro@palotes.mentira
250 Ok
rcpt to:juanmi@dominiodefuera.es
554 <juanmi@dominiodefuera.es>: Recipient address rejected: Relay access denied
quit
221 Bye
Connection closed by foreign host.

Perfecto ya no pueden utilizar nuestro servidor como una pasarela para enviar SPAM. Seguimos adelante. Aun queda.

INSTALACION DE APACHE 1.3.26-0woody6 Y SQUIRRELMAIL 1.2.6-3 (Luego desinstalaremos Squirrelmail)

Bueno esta instalación no tiene mucho de particular, saber que paquetes debemos instalar y adelante. Sobre la configuración de apache, no hablare mucho, ya que no tengo mucha idea.

cartero:~# apt-get install apache apache-common aspell libaspell10 libexpat1 libltdl3 libmm11 libpspell4 mime-support php4 php4-mysql squirrelmail wwwconfig-common

En la instalación de estos 13 paquetes nos preguntara si queremos utilizar Apache SSL, yo en mi caso no. Nos hará otra pregunta sobre si queremos ver el archivo de configuración de apache , yo le he dicho que no, y la ultima pregunta que nos hace es si queremos habilitar en apache la extensión para MYSQL le diremos que si, si por casualidad le habéis dicho que no, debéis añadir en /etc/php4/apache/php.ini la línea extension=mysql.so

Sobre la instalación nada mas

Comprobemos que se ha instalado bien en cualquier explorador con acceso al servidor ponemos:

http://10.19.4.10

Esta claro que este es mi caso, en el vuestro poned vuestra dirección IP.

Welcome to Your New Home in Cyberspace!
Ahí tenéis la bienvenida de apache.

Ahora tenemos que dar acceso a apache para que nos enseñe los mails cuando accedamos por el squirrelmail.

cartero:~# chown maildrop:www-data /cartas/ -R

Ahora podemos intentar utilizar squirrelmail en su versión mas simple, no hemos añadido ningún plugin ni actualizado el idioma ni nada pero podemos probar, mete en cualquier explorador web esta dirección e introduce los datos de la cuenta que hemos creado:

<http://10.19.4.10/squirrelmail/index.php>

Luego seguiremos hablando de la configuración de squirrelmail y de apache, ahora instalaremos el antivirius

INSTALACION DE AMAVIS-NEW 2.0030616p10-4.backports.org.1 Y 
SPAMASSASSIN 3.0.2-0.backports.org.1

Para esta instalación utilizaremos el paquete de Backports. Añadiremos las siguientes líneas a nuestro fichero /etc/apt/sources.list

deb http://www.backports.org/debian stable amavisd-new
deb-src http://www.backports.org/debian stable postfix amavisd-new

deb http://www.backports.org/debian stable clamav
deb-src http://www.backports.org/debian stable clamav

deb http://www.backports.org/debian stable spamassassin
deb-src http://www.backports.org/debian stable spamassassin

deb http://www.backports.org/debian stable unrar-nonfree
deb-src http://www.backports.org/debian stable unrar-nonfree

después de haber añadido las líneas al archivo haremos el correspondiente:

cartero:~# apt-get update
	....
	....
	....

Perfecto, ya tenemos hecho el update, ahora a instalar los paquetes, es aquí donde nos hace falta la parte nonfree que decía al principio, ya que utilizaremos  el paquete zoo para que amavis descomprima datos adjuntos y compruebe si tienen virus:

cartero:~#apt-get install amavisd-new clamav clamav-base clamav-daemon clamav-freshclam file libarchive-tar-perl libarchive-zip-perl libclamav1 libcompress-zlib-perl libconvert-tnef-perl libconvert-uulib-perl libdigest-md5-perl libdigest-sha1-perl libgmp3 libhtml-parser-perl libhtml-tagset-perl libio-multiplex-perl libio-stringy-perl libmailtools-perl libmime-base64-perl libmime-perl libnet-perl libnet-server-perl libstorable-perl libtime-hires-perl libtimedate-perl libunix-syslog-perl spamassassin spamc ucf unrar-nonfree lha zoo bzip2 unarj

Diréis: que cantidad de paquetes, pues si, eso digo yo, son descompresores que utilizara amavis para la búsqueda de virus en archivos comprimidos y un montón mas de cosas......

Ala a instalar.

Nos va a hacer unas preguntillas, una sobre si queremos que el demonio de actualización del antivirus este activo, yo en mi caso le he dicho que si, recomendable. Luego nos pregunta el sitio de donde descargaremos esta actualización y si queremos que se nos notifique si ha sido actualizada la base de datos de virus, le decimos que si.

La instalación de estos paquetes me da un error:

Errors were encountered while processing:
 base
 clamav-freshclam
 clamav
 clamav-daemon
E: Sub-process /usr/bin/dpkg returned an error code (1)

Si os sale volved a decirle:

cartero:~#apt-get install amavisd-new clamav clamav-base clamav-daemon clamav-freshclam file libarchive-tar-perl libarchive-zip-perl libclamav1 libcompress-zlib-perl libconvert-tnef-perl libconvert-uulib-perl libdigest-md5-perl libdigest-sha1-perl libgmp3 libhtml-parser-perl libhtml-tagset-perl libio-multiplex-perl libio-stringy-perl libmailtools-perl libmime-base64-perl libmime-perl libnet-perl libnet-server-perl libstorable-perl libtime-hires-perl libtimedate-perl libunix-syslog-perl spamassassin spamc ucf unrar-nonfree lha zoo bzip2 liblzo1 lzop unarj

Y ahora si que funciona. No se porque lo hace pero luego funciona a la perfección.

Las actualizaciones del antivirus las podemos ver editando el archivo en cuestión con este comando:

cartero:/# vi /var/log/clamav/freshclam.log

Ahora configuraremos a AMAVIS.

Tenemos que retocar un par de archivos, lo primero que haremos será editar el archivo /etc/amavis/amavisd.conf.

Este archivo de configuración es enorme así que solo os dejare lo que he cambiado, lo demás lo he dejado tal y como viene por defecto, en algunas líneas a mi me viene por defecto pero las pongo para que os cercioréis de que están así, aun así explicare cada cosa:

$mydomain = 'dominio.com';      # (no useful default)
$myhostname = 'cartero.dominio.com';  # fqdn of this host, default by uname(3)
# @bypass_virus_checks_acl = qw( . );  # uncomment to DISABLE anti-virus code
# @bypass_spam_checks_acl  = qw( . );  # uncomment to DISABLE anti-spam code
$final_virus_destiny      = D_REJECT; # (defaults to D_BOUNCE)
$final_banned_destiny     = D_REJECT;  # (defaults to D_BOUNCE)
$final_spam_destiny       = D_PASS;  # (defaults to D_REJECT)
$final_bad_header_destiny = D_PASS;  # (defaults to D_PASS), D_BOUNCE suggested
$warnbannedsender = 1;  # (defaults to false (undef))
$warnbadhsender = 1;    # (defaults to false (undef))
$virus_quarantine_to  = 'virus-quarantine';    # traditional local quarantine
$sa_spam_subject_tag = '***SPAM*** ';   # (defaults to undef, disabled)
$banned_filename_re = new_RE(
#  qr'^UNDECIPHERABLE$',  # is or contains any undecipherable components
   qr'\.[^.]*\.(exe|vbs|pif|scr|bat|cmd|com|dll)$'i, # some double extensions
   qr'[{}]',     # curly braces in names (serve as Class ID extensions - CLSID)
#  qr'.\.(exe|vbs|pif|scr|bat|cmd|com)$'i,           # banned extension - basic
#  qr'.\.(ade|adp|bas|bat|chm|cmd|com|cpl|crt|exe|hlp|hta|inf|ins|isp|js|
#        jse|lnk|mdb|mde|msc|msi|msp|mst|pcd|pif|reg|scr|sct|shs|shb|vb|
#        vbe|vbs|wsc|wsf|wsh)$'ix,                  # banned extension - long
   qr'.\.(mim|b64|bhx|hqx|xxe|uu|uue)$'i, # banned extension - WinZip vulnerab.
#  qr'^\.(zip|lha|tnef|cab)$'i,                      # banned file(1) types
#  qr'^\.exe$'i,                                     # banned file(1) types
#  qr'^application/x-msdownload$'i,                  # banned MIME types
#  qr'^application/x-msdos-program$'i,
   qr'^message/partial$'i,  # rfc2046. this one is deadly for Outcrook
#  qr'^message/external-body$'i, # block rfc2046
);
$sa_tag_level_deflt  = 4.0; # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 5.0; # add 'spam detected' headers at that level

No hay que comentar nada sobre las dos primeras líneas son mas que claras.

La tercera y cuarta línea a mi me vienen por defecto así, pero aseguraos de que así están ya que si no la detección de virus y spam no funcionara. La función de las líneas 5 6 7 y 8 es decirle a AMAVIS que debe hacer con los mails que localiza como virus, spam, prohibidos o mal formados, reject significa rechazar y pass que le dejamos pasar, yo he elegido estas configuraciones, vosotros podéis ponerlas como queráis. Las líneas que comienzan con $warn son las que definen si queremos que se avise al remitente del destino de lo que ha pasado con su mail, yo las he descomentado para que envíe un mensaje al remitente, cuidado con enviar un mensaje de aviso a los destinatarios de spam, sus dominios casi nunca existen con lo cual podemos generar una cola de envíos bastante grande. Sobre la línea $virus_quarantine decir que debe estar así, los virus los meterá en la carpeta /var/lib/amavis/virusmails así que si queremos borrarlos de vez en cuando pues ya sabéis rm /var/lib/amavis/virusmails/*. En la línea donde aparece ***SPAM*** se define que hará cuando reciba un mensaje que es SPAM, pues si la descomentamos se escribirá en el asunto del mensaje ***SPAM*** y se dejara pasar al buzon, para que el usuario repase de vez en cuando su correo y elimine el spam. Sobre las ultimas líneas (que realmente es una línea pero que tiene muchas opciones) decir que son importantes que las leáis, marcara como prohibidos los mensajes con ficheros de tal extensión, ..... Saber que si esta descomentada esa función entra en juego y si la descomentamos no. 

Configuremos ahora el archivo de postfix /etc/postfix/master.cf para que mande los archivos a amavis al puerto 10024 y si todo va bien que lo mande al puerto 10025 de postfix. Debemos añadir al final del archivo las siguientes líneas:

#---AMAVIS---
127.0.0.1:10025 inet    n       -       n       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks=127.0.0.0/8
        -o strict_rfc821_envelopes=yes
        -o smtpd_error_sleep_time=0
        o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000

amavis unix - - n - 2 lmtp
        -o lmtp_data_done_timeout=1200
        -o lmtp_send_xforward_command=yes
 
Y en el archivo /etc/postfix/main.cf añadir lo siguiente:

#======== AMAVIS ===========
content_filter = amavis:[127.0.0.1]:10024

En el mismo archivo repasaremos el apartado SASL añadiendo o modificando las líneas que aquí dejo, deben quedar como estas:

# ========== SASL ===========
smtpd_sasl_auth_enable=yes
broken_sasl_auth_clients=yes

smtpd_helo_required = yes
disable_vrfy_command = yes

smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,reject_rbl_client relays.ordb.org,permit

smtpd_data_restrictions =reject_unauth_pipelining,permit

Estos últimos cambios son para añadir al sistema de correo otro tipo de medidas para rechazar correo no deseado, este tipo de medidas son por ejemplo asegurarnos que el proceso HELO que hacen a nuestro servidor se haga correctamente, deshabilitar la concatenación de comandos (lo suelen usar los spammers en ataques de diccionario), etc. Decir además que este orden debe quedarse como lo he puesto, si ponemos al principio que no permita todo, pues pasara todo.

Ahora debemos crearnos el siguiente archivo (No veáis lo que me ha costado hacer funcionar a SpamAssassin, mas de una semana dando vueltas por listas de correo, google, etc) Pero bueno ya esta hecho espero que a vosotros no os traiga tan locos. Todo el problema se solucionaba creando el archivo /etc/maildroprc y poniendo estas líneas:

cartero:/# vi /etc/maildroprc
if ( $SIZE < 26144 )
{
    exception {
       xfilter "/usr/bin/spamassassin"
    }
}

if (/^X-Spam-Flag: *YES/)
{
    exception {
        to "$HOME/$DEFAULT"
    }
}
else
{
    exception {
        to "$HOME/$DEFAULT"
    }
}

Reiniciaremos los servicios para que la nueva configuración tenga efecto:

cartero:/# /etc/init.d/amavis restart
cartero:/# /etc/init.d/postfix restart

Podemos empezar a hacerle pruebas, si lo habéis dejado como yo debe aceptaros por ejemplo el envío de archivos con extensión exe, probad que os acepta este tipo de envíos, probad a adjuntar un archivo con doble extensión, es decir por ejemplo archivo.zip.exe (esto lo hacen muchos virus, ya que en muchos ordenadores se esconden las extensiones para archivos conocidos, la victima lee archivo.zip y lo ejecuta y realmente lo que esta ejecutando es un exe) debe rechazároslo, si lo habéis dejado como yo. Probad a adjuntar algún virus o troyano (Yo lo he probado con el troyano back orifice, lo he descargado de <http://heanet.dl.sourceforge.net/sourceforge/bo2k/bo2k_1_0.zip> cuidado con lo que haceis con el). Si todo funciona como debe no os debe dejar enviarlo y además os debe mandar una advertencia a vuestro mail. Miremos el log y veremos como funciona:

cartero:/# vi /var/log/mail.log

Apr 13 16:52:43 cartero postfix/smtpd[2346]: connect from unknown[10.19.4.12]
Apr 13 16:52:43 cartero postfix/smtpd[2346]: 779D02AF63: client=unknown[10.19.4.12], sasl_method=LOGIN, sasl_username=juanmi@dominio.com
Apr 13 16:52:43 cartero postfix/cleanup[2355]: 779D02AF63: message-id=<013f01c54038$78927ea0$0c04130a@dominio.local>
Apr 13 16:52:43 cartero postfix/qmgr[2171]: 779D02AF63: from=<juanmi@dominio.com>, size=657520, nrcpt=1 (queue active)
Apr 13 16:52:43 cartero postfix/smtpd[2346]: disconnect from unknown[10.19.4.12]
Apr 13 16:52:44 cartero amavis[2088]: (02088-02) Clam Antivirus-clamd FAILED - unknown status: /var/lib/amavis/amavis-20050413
T155047-02088/parts: Access denied. ERROR\n
Apr 13 16:52:44 cartero amavis[2088]: (02088-02) WARN: all primary virus scanners failed, considering backups
Apr 13 16:52:45 cartero postfix/smtpd[2386]: connect from cartero[127.0.0.1]
Apr 13 16:52:45 cartero postfix/smtpd[2386]: 210772AF66: client=cartero[127.0.0.1]
Apr 13 16:52:45 cartero postfix/cleanup[2355]: 210772AF66: message-id=<VA02088-02@cartero.dominio.com>
Apr 13 16:52:45 cartero postfix/qmgr[2171]: 210772AF66: from=<>, size=2928, nrcpt=1 (queue active)
Apr 13 16:52:45 cartero postfix/smtpd[2386]: disconnect from cartero[127.0.0.1]
Apr 13 16:52:45 cartero amavis[2088]: (02088-02) INFECTED (Trojan.Orifice2K.PI_#1, Trojan.Lithium.Capture, BDC.Moses.115.EdS),
 <?@[10.19.4.12]> -> <juanmi@dominio.com>, quarantine virus-20050413-165245-02088-02, Message-ID: <013f01c54038$78927ea0$0c04130
a@dominio.local>, Hits: -
Apr 13 16:52:45 cartero postfix/lmtp[2358]: 779D02AF63: to=<juanmi@dominio.com>, relay=127.0.0.1[127.0.0.1], delay=2, status=bou
nced (host 127.0.0.1[127.0.0.1] said: 550 5.7.1 Message content rejected, id=02088-02 - VIRUS: Trojan.Orifice2K.PI_#1, Trojan.
Lithium.Capture, BDC.Moses.115.EdS (in reply to end of DATA command))
Apr 13 16:52:45 cartero postfix/cleanup[2355]: E72D62AF67: message-id=<20050413145245.E72D62AF67@cartero.dominio.com>
Apr 13 16:52:45 cartero postfix/pipe[2389]: 210772AF66: to=<postmaster@dominio.com>, relay=maildrop, delay=0, status=bounced (us
er unknown. Command output: Invalid user specified. )
Apr 13 16:52:45 cartero postfix/qmgr[2171]: 210772AF66: removed
Apr 13 16:52:46 cartero postfix/qmgr[2171]: E72D62AF67: from=<>, size=52002, nrcpt=1 (queue active)
Apr 13 16:52:46 cartero postfix/qmgr[2171]: 779D02AF63: removed
Apr 13 16:52:46 cartero postfix/pipe[2389]: E72D62AF67: to=<juanmi@dominio.com>, relay=maildrop, delay=1, status=sent (dominio.com
)
Apr 13 16:52:46 cartero postfix/qmgr[2171]: E72D62AF67: removed
Apr 13 16:52:48 cartero imaplogin: Connection, ip=[::ffff:10.19.4.12]
Apr 13 16:52:48 cartero imaplogin: LOGIN, user=juanmi@dominio.com, ip=[::ffff:10.19.4.12]
Apr 13 16:52:48 cartero imaplogin: LOGOUT, user=juanmi@dominio.com, ip=[::ffff:10.19.4.12], headers=0, body=0
Apr 13 16:52:48 cartero imaplogin: Connection, ip=[::ffff:10.19.4.12]
Apr 13 16:52:48 cartero imaplogin: LOGIN, user=juanmi@dominio.com, ip=[::ffff:10.19.4.12]
Apr 13 16:52:48 cartero imaplogin: LOGOUT, user=juanmi@dominio.com, ip=[::ffff:10.19.4.12], headers=0, body=51348

Si os fijáis, el funcionamiento es simple, nos conectamos al puerto 25, SASL nos autentica, mandamos el mail y postfix se lo pasa a amavis, amavis comprueba si tiene virus y le da la contestación a postfix, postfix rechaza el mail infectado y manda un correo al remitente diciéndole que no puede enviarlo porque tiene un virus.

Probad muchas cosas, enviadlo en rar, zip, ...... y aseguraos que lo que queréis es la configuración que hemos hecho.

Para hacerle la prueba a Spamassassin haremos lo siguiente:

Buscad el archivo sample-spam.txt, en mi equipo esta 
/usr/share/doc/spamassassin/examples/ y lo que hacemos es pedirle a spamassassin que analize el archivo que le mandamos. Esto es lo que debe hacernos nuestro sistema automáticamente, cuando llega un mensaje le pide a spamassassin que analice el correo y lo puntúe, si supera 5 la etiquetara como spam. El comando para hacer la prueba es este:

cartero:/# cd /usr/share/doc/spamassassin/examples/
cartero:/usr/doc/spamassassin/examples# spamassassin -t <sample-spam.txt > spam.out
cartero:/usr/doc/spamassassin/examples# vi spam.out

Y debe enseñarnos esto:

Received: from localhost by cartero
        with SpamAssassin (version 3.0.2);
        Tue, 19 Apr 2005 11:20:01 +0200
From: Sender <sender@example.net>
To: Recipient <recipient@example.net>
Subject: Test spam mail (GTUBE)
Date: Wed, 23 Jul 2003 23:30:00 +0200
Message-Id: <GTUBE1.1010101@example.net>
X-Spam-Flag: YES
X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on cartero
X-Spam-Status: Yes, score=997.2 required=5.0 tests=ALL_TRUSTED,GTUBE
        autolearn=unavailable version=3.0.2
X-Spam-Level: **************************************************
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----------=_4264CD41.11429616"

This is a multi-part message in MIME format.

------------=_4264CD41.11429616
Content-Type: text/plain
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

Spam detection software, running on the system "cartero", has
identified this incoming email as possible spam.  The original message
has been attached to this so you can view it (if it isn't spam) or label
similar future email.  If you have any questions, see
the administrator of that system for details.

Content preview:  This is the GTUBE, the Generic Test for Unsolicited
  Bulk Email If your spam filter supports it, the GTUBE provides a test
  by which you can verify that the filter is installed correctly and is
  detecting incoming spam. You can send yourself a test mail containing
  the following string of characters (in upper case and with no white
  spaces and line breaks): [...]

Content analysis details:   (997.2 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
-2.8 ALL_TRUSTED            Did not pass through any untrusted hosts
1000 GTUBE                  BODY: Generic Test for Unsolicited Bulk Email

------------=_4264CD41.11429616
Content-Type: message/rfc822; x-spam-type=original
Content-Description: original message before SpamAssassin
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

Subject: Test spam mail (GTUBE)
Message-ID: <GTUBE1.1010101@example.net>
Date: Wed, 23 Jul 2003 23:30:00 +0200
From: Sender <sender@example.net>
To: Recipient <recipient@example.net>
Precedence: junk
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

This is the GTUBE, the
        Generic
        Test for
        Unsolicited
        Bulk
        Email

If your spam filter supports it, the GTUBE provides a test by which you
can verify that the filter is installed correctly and is detecting incoming
spam. You can send yourself a test mail containing the following string of
characters (in upper case and with no white spaces and line breaks):

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

You should send this test mail from an account outside of your network.

------------=_4264CD41.11429616--

Spam detection software, running on the system "cartero", has
identified this incoming email as possible spam.  The original message
has been attached to this so you can view it (if it isn't spam) or label
similar future email.  If you have any questions, see
the administrator of that system for details.

Content preview:  This is the GTUBE, the Generic Test for Unsolicited
  Bulk Email If your spam filter supports it, the GTUBE provides a test
  by which you can verify that the filter is installed correctly and is
  detecting incoming spam. You can send yourself a test mail containing
  the following string of characters (in upper case and with no white
  spaces and line breaks): [...]

Content analysis details:   (997.2 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
-2.8 ALL_TRUSTED            Did not pass through any untrusted hosts
1000 GTUBE                  BODY: Generic Test for Unsolicited Bulk Email

La siguiente prueba la haremos desde outlook express, montaremos un mensaje de correo para el usuario juanmi@dominio.com <mailto:juanmi@dominio.com>, en el asunto pondremos lo que nos de la gana t en el body del mensaje pondremos esto:

This is the GTUBE, the
       Generic
       Test for
       Unsolicited
       Bulk
       Email

If your spam filter supports it, the GTUBE provides a test by which you
can verify that the filter is installed correctly and is detecting incoming
spam. You can send yourself a test mail containing the following string of
characters (in upper case and with no white spaces and line breaks):
 
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
 
You should send this test mail from an account outside of your network.

Nos debe contestar con un mensaje parecido al de spam.out y un archivo adjunto.

Probemos con un mensaje bueno, no vaya a ser que nos lo coja todo como spam, mandadle uno como queráis con un simple hola. ¿Funciona bien verdad?

Seguimos adelante ya tenemos configurado el antivirus y el antispam. El antivirus se actualiza el solito pero al antispam tenemos que enseñarle a diferenciar Spam de correo bueno.

Muy bien para empezar deciros que para que SpamAssassin funcione como es debido debemos darle al filtro bayesiano una suma de spam bastante grande, unos mil correos detectados como spam, luego meterlos en una carpeta del servidor y luego ejecutar este comando:

cartero:/# sa-learn --spam /cartas/dominio.com/juanmi/Maildir/cur
Learned from 1991 message(s) (1992 message(s) examined).

Como veis yo he metido los mails detectados como spam en ese directorio (Ahora os cuento como lo he  hecho) y luego simplemente le he dicho que se ponga a aprender.

Para meter los mails yo he hecho lo siguiente, tengo una cuenta de correo que recibe los spam del dominio de mi trabajo, la he recibido con Outlook express configurando lo cuenta como es debido, luego he agregado la cuenta del dominio que estamos creando en nuestro caso dominio.com como IMAP, importante lo de IMAP, He seleccionado todos los mensajes de la cuenta de mi trabajo y le he dicho Mover a Carpeta y ahí he marcado la bandeja de entrada de dominio.com. Por cierto CUIDADO CON LA CUOTA DEL BUZON.

Le hemos metido SPAM, ahora debemos meterle HAM, que es el correo bueno.

Vamos allá, haré el mismo proceso que he utilizado para pasar los mails al servidor pero ahora los pasare buenos.

Previamente y después de haberle enseñado a SpamAssassin el correo malo, he borrado los mensajes que tenia para meterle el correo bueno. Lo he borrado mediante el comando purgar de Outlook express.

cartero:/# sa-learn --ham /cartas/dominio.com/juanmi/Maildir/cur
Learned from 663 message(s) (670 message(s) examined).

Muy bien intentemos hacer una prueba: para ver si el filtro bayesiano funciona. En mi caso la prueba no puedo hacerla desde fuera ya que aun no he publicado el dominio, es decir tengo que hacerla desde dentro del servidor. He cogido un mensaje que me ha llegado como SPAM a otra cuenta de correo y he guardado el mensaje, luego he creado el siguiente archivo /cosas/bayesiano.txt y he metido el mensaje de correo que me llego:

cartero:/cosas# vi bayesiano.txt
Received: from mail pickup service by arcexchange.dominioexterno.es with Microsoft SMTPSVC;
	 Tue, 19 Apr 2005 12:43:59 +0200
Thread-Topic: peak performance
Received: from unclebear.com ([218.80.86.242]) by arcexchange.dominioexterno.es with Microsoft SMTPSVC(5.0.2195.6713); Tue, 19 Apr 2005 12:43:57 +0200
Message-ID: <F9BAB10E.7DED040@unclebear.com>
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Date: Tue, 19 Apr 2005 17:18:22 -0700
Reply-To: "pansy fox" <matildecleland@unclebear.com>
From: "pansy fox" <matildecleland@unclebear.com>
User-Agent: Pegasus Mail for Win32 (v3.12a)
X-Accept-Language: en-us
MIME-Version: 1.0
To: "Miranda Elliott" <sales@cove.es>
Subject: sales@cove.es - Bayesian Filter detected spam - peak performance
Content-Type: text/html;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit
Return-Path: <matildecleland@unclebear.com>
X-OriginalArrivalTime: 19 Apr 2005 10:43:58.0859 (UTC) FILETIME=[B14D7DB0:01C544CC]

<HTML>
&quot;My girlfriend loves the results, but she doesn't know what I do. She
thinks 
it's natural&quot; -Thomas, CA<br>
<br>
&quot;I've been using your product for 4 months now. I've increased my
length from 2&quot; 
to nearly 6&quot; . Your product has saved my sex life.&quot; -Matt, FL<br>
<br>
<br>
Pleasure your partner every time with a bigger, longer, stronger  Unit<br>
Realistic gains quickly<br>
<br><a href="http://aiom.4C.ultimatemasterproduct.com/d/">to be a stud
press here</a>
<br>
<br>
<br>
<br>All you need do is to toss one into your mouth each day and swallow it
<br><a href="http://ivf.uDmN.ultimatemasterproduct.com/d/">no, then link
above</a>
<br>At this they both put their heads over the side of the buggy and looked
down<br>Yes; there was land below them; and not so very far away, either It
will nourish you, satisfy your hunger and build up your health and strength
The ordinary food of mankind is more or less injurious; this is entirely
beneficial
</FONT></HTML>

cartero:/cosas# spamassassin -t <bayesiano.txt > bayesiano.out
cartero:/cosas# vi bayesiano1.out
Received: from localhost by cartero
        with SpamAssassin (version 3.0.2);
        Tue, 19 Apr 2005 11:57:45 +0200
From: "pansy fox" <matildecleland@unclebear.com>
To: "Miranda Elliott" <sales@cove.es>
Subject: sales@cove.es - Bayesian Filter detected spam - peak performance
Date: Tue, 19 Apr 2005 17:18:22 -0700
Message-Id: <F9BAB10E.7DED040@unclebear.com>
X-Spam-Flag: YES
X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on cartero
X-Spam-Status: Yes, score=7.1 required=5.0 tests=ADDRESS_IN_SUBJECT,BAYES_99,
        DATE_IN_FUTURE_12_24,HTML_20_30,HTML_MESSAGE,MIME_HTML_ONLY
        autolearn=no version=3.0.2
X-Spam-Level: *******
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----------=_4264D619.0BFB706A"

This is a multi-part message in MIME format.

------------=_4264D619.0BFB706A
Content-Type: text/plain
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

Spam detection software, running on the system "cartero", has
identified this incoming email as possible spam.  The original message
has been attached to this so you can view it (if it isn't spam) or label
similar future email.  If you have any questions, see
the administrator of that system for details.

Content preview:  "My girlfriend loves the results, but she doesn't know
  what I do. She thinks it's natural" -Thomas, CA "I've been using your
  product for 4 months now. I've increased my length from 2" to nearly 6"
  . Your product has saved my sex life." -Matt, FL [...]

Content analysis details:   (7.1 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
 3.0 DATE_IN_FUTURE_12_24   Date: is 12 to 24 hours after Received: date
 1.8 ADDRESS_IN_SUBJECT     To: address appears in Subject
 0.2 HTML_20_30             BODY: Message is 20% to 30% HTML
 1.9 BAYES_99               BODY: Bayesian spam probability is 99 to 100%
                            [score: 1.0000]
 0.2 MIME_HTML_ONLY         BODY: Message only has text/html MIME parts
 0.0 HTML_MESSAGE           BODY: HTML included in message

The original message was not completely plain text, and may be unsafe to
open with some email clients; in particular, it may contain a virus,
or confirm that your address can receive spam.  If you wish to view
it, it may be safer to save it to a file and open it with an editor.

------------=_4264D619.0BFB706A
Content-Type: message/rfc822; x-spam-type=original
Content-Description: original message before SpamAssassin
Content-Disposition: attachment
Content-Transfer-Encoding: 8bit

Received: from mail pickup service by arcexchange.dominioexterno.es with Microsoft SMTPSVC;
         Tue, 19 Apr 2005 12:43:59 +0200
Thread-Topic: peak performance
Received: from unclebear.com ([218.80.86.242]) by arcexchange.dominioexterno.es with Microsoft SMTPSVC(5.0.2195.6713); Tue, 19 Apr 2
005 12:43:57 +0200
Message-ID: <F9BAB10E.7DED040@unclebear.com>
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Date: Tue, 19 Apr 2005 17:18:22 -0700
Reply-To: "pansy fox" <matildecleland@unclebear.com>
From: "pansy fox" <matildecleland@unclebear.com>
User-Agent: Pegasus Mail for Win32 (v3.12a)
X-Accept-Language: en-us
MIME-Version: 1.0
To: "Miranda Elliott" <sales@cove.es>
Subject: sales@cove.es - Bayesian Filter detected spam - peak performance
Content-Type: text/html;
        charset="us-ascii"
Content-Transfer-Encoding: 7bit
Return-Path: <matildecleland@unclebear.com>
X-OriginalArrivalTime: 19 Apr 2005 10:43:58.0859 (UTC) FILETIME=[B14D7DB0:01C544CC]

<HTML>
&quot;My girlfriend loves the results, but she doesn't know what I do. She
thinks
it's natural&quot; -Thomas, CA<br>
<br>
&quot;I've been using your product for 4 months now. I've increased my
length from 2&quot;
to nearly 6&quot; . Your product has saved my sex life.&quot; -Matt, FL<br>
<br>
<br>
Pleasure your partner every time with a bigger, longer, stronger  Unit<br>
Realistic gains quickly<br>
<br><a href="http://aiom.4C.ultimatemasterproduct.com/d/">to be a stud
press here</a>
<br>
<br>
<br>
<br>All you need do is to toss one into your mouth each day and swallow it
<br><a href="http://ivf.uDmN.ultimatemasterproduct.com/d/">no, then link
above</a>
<br>At this they both put their heads over the side of the buggy and looked
down<br>Yes; there was land below them; and not so very far away, either It
will nourish you, satisfy your hunger and build up your health and strength
The ordinary food of mankind is more or less injurious; this is entirely
beneficial
</FONT></HTML>

------------=_4264D619.0BFB706A--

Spam detection software, running on the system "cartero", has
identified this incoming email as possible spam.  The original message
has been attached to this so you can view it (if it isn't spam) or label
similar future email.  If you have any questions, see
the administrator of that system for details.

Content preview:  "My girlfriend loves the results, but she doesn't know
  what I do. She thinks it's natural" -Thomas, CA "I've been using your
  product for 4 months now. I've increased my length from 2" to nearly 6"
  . Your product has saved my sex life." -Matt, FL [...]

Content analysis details:   (7.1 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
 3.0 DATE_IN_FUTURE_12_24   Date: is 12 to 24 hours after Received: date
 1.8 ADDRESS_IN_SUBJECT     To: address appears in Subject
 0.2 HTML_20_30             BODY: Message is 20% to 30% HTML
 1.9 BAYES_99               BODY: Bayesian spam probability is 99 to 100%
                            [score: 1.0000]
 0.2 MIME_HTML_ONLY         BODY: Message only has text/html MIME parts
 0.0 HTML_MESSAGE           BODY: HTML included in message

Perfecto funciona a las mil maravillas, si os fijáis el filtro bayesiano ya nos da una puntuación. El mensaje a superado los 5 puntos y nos lo rechaza.

Podemos hacer casi infalible el sistema AntiSpam, me explico, si sabemos donde va a haber correo bueno y correo malo podemos decirle a cron que ejecute los comandos sa-learn --ham /directorio_HAM y sa-learn --spam /directorio_SPAM. De esta forma si diariamente SpamAssassin va actualizando su base de datos bayesiana, el filtrado de correo lo haremos cada día mejor. 

Mas opciones de filtrado de SpamAssassin son las WhiteList y las BlackList, podemos añadir a la lista de cualquiera de ellas de la siguiente forma:

spamassassin -add-addr-to-whitelist=*@dominioquequiera.dom <mailto:add-addr-to-whitelist%3D*@dominioquequiera.dom>

spamassassin -add-addr-to-whitelist=pericopalotes@dominioquequiera.dom <mailto:add-addr-to-whitelist%3Dpericopalotes@dominioquequiera.dom>

spamassassin -add-addr-to-blacklist=*@dominioquequiera.dom <mailto:add-addr-to-blacklist%3D*@dominioquequiera.dom>

spamassassin -add-addr-to-blacklist=pericopalotes@dominioquequiera.dom <>

Estos comandos forzaran a la lista automática a que recoja los valores que le digamos. Se puede hacer de forma manual editando el archivo 
./spamassassin/users_prefs a mi me lo ha metido en el directorio cartas.

Se que existen muchas mas opciones para configurar SpamAssassin, cambiar las puntuaciones, idiomas, etc. Pero no se como ni donde cambiarlas, solo he leído esto:

cartero:/# man Mail::SpamAssassin::Conf

Estoy un poco verde en el uso de SpamAssassin, todo lo que me digáis será bueno.

Si os va lento, mucha gente se queja, podéis mirar en <http://wiki.apache.org/spamassassin/FasterPerformance> yo todavía no lo he probado demasiado.

Dejar una cosa clara antes de pasar a otro punto, no se si esta funcionando de manera optima el SpamAssassin, si alguien ha conseguido montarlo de otra forma o sacarle mas configuraciones POR FAVOR enviadme un mail a juanmi@planalfa.es <mailto:juanmi@planalfa.es>

INSTALACION DE POSTFIXADMIN

La instalación de Postfixadmin, es muy fácil, he utilizado el postfixadmin que utiliza Marco A. S. Maximo en su manual (http://www.linuxdicas.com.br/tutoriais1/tutorial_courier_mysql_postfix.txt), lo he traducido a castellano y he retocado su script para crear a la vez que el buzon de correo una carpeta llamada Spam. Esta carpeta nos valdrá para que maildrop al localizar Spam, nos lo envíe a la carpeta Spam.

La instalación de Postfix, no es una instalación como tal, se trata de dejarlo publicado para poder acceder a el.

He dejado publicado en internet el postfixadmin traducido al castellano por mi en la dirección <http://www.dominio.com/postfixadmin>
O os lo envio por correo.

cartero:/cosas/# wget http://www.dominio.com/postfixadmin_modificado.tar <http://www.juagu.com/postfixadmin_modificado.tar>
cartero:/cosas/# mkdir /var/www/html
cartero:/cosas/# tar xvf postfixadmin.tar -C /var/www/html/
cartero:/cosas/# mv /var/www/html/postfixadmin/*.sh /var/www/
cartero:/cosas/# chmod 700 /var/www/*.sh
cartero:/cosas/# chown www-data:www-data /var/www/postfixadmin/ -R

Ahora tendremos que editar el archivo /var/www/html/postfixadmin/config.inc.php para que postfixadmin logre conectarse a la base de datos.

cartero:/cosas/# vi /var/www/html/postfixadmin/config.inc.php

// Login information for the database^M
$db_host = "localhost";^M
$db_name = "postfix";^M
$db_user = "postfixadmin";^M
$db_pass = "postfixadmin";^M

Solo cambiaremos el apartado para la conexión con la base de datos, es decir lo que he dejado ahí arriba.

Seguimos adelante, para que postfixadmin funcione como es debido debemos instalar SUDO, utilizaremos esta aplicación para que se ejecuten como WWW-DATA los scripts de creación de buzones.

Vamos a instalarlo:

cartero:/# apt-get install sudo

El archivo de configuración es /etc/sudoers, vamos a añadir las líneas para que haga lo que queremos. Debe quedar como las que pongo aquí abajo.

cartero:/# vi /etc/sudoers

# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL
www-data ALL=NOPASSWD:/var/www/adduser.sh
www-data ALL=NOPASSWD:/var/www/userdel.sh

Si editamos los scripts de creación de buzones podemos ver lo siguiente:

cartero:/# vi /var/www/adduser.sh

#!/bin/bash

# Script para creación de diretorios del usuario
#
#

home_base=$1
if [ ! "$home_base" ]; then
    echo "Falta una variable"
        exit 0
fi

login=$2
if [ ! "$login" ]; then
    echo "Falta una variable"
        exit 0
fi

domain=$3

userdir="$home_base/$domain/$login"

mkdir -p $userdir
maildirmake $userdir/Maildir
maildirmake -f Spam $userdir/Maildir
cp /cartas/courierimapsubscribed $userdir/Maildir
chmod -R 770 $userdir
chown -R maildrop:www-data $userdir

Si os fijáis lo que hago después de crear el buzon, creo una carpeta llamada Spam y copio el archivo /cartas/courierimapsubscribed en el nuevo buzon. Esto ultimo lo hago para que nada mas entrar el nuevo usuario tenga le aparezca la carpeta Spam, si damos con algún usuario torpe (que será lo común) este no añadirá jamás la carpeta Spam y no podrá revisarla. El archivo 
/cartas/courierimapsubscribed contiene lo siguiente:

cartero:/# vi /cartas/courierimapsubscribed

INBOX.Elementos Enviados
INBOX.Papelera
INBOX.Borrador
INBOX.Spam

Veréis que esta en castellano, como aun no nos hemos puesto con Squirrelmail dejad esto para cuando tengamos terminado el Squirrelamail.

Ya tenemos instalado y funcionando perfectamente Postfixadmin (No sabéis la de trabajo que ahorra esta web que se ha trabajado el equipo de High5).

RECONFIGURACION DE SQUIRRELMAIL Y ACTUALIZACION A LA VERSION 1.4.4

Os preguntareis porque he reconfigurado Squirrelmail, bueno la versión que instala woody es bastante antigua y los plugins que existen para esa versión son muy pocos. Lo actualice para que me aceptase mas plugins y para poder configurarlo de la forma mas fácil, en cuanto a estas configuraciones, la versión 1.4.4 esta muchísimo mejor trabajada que la de woody.

Empezaremos desinstalando el antiguo squirrelmail, nos ha venido muy bien instalarlo porque nos ha instalado todas sus dependencias, ahora lo único que haremos será quitarlo y poner el nuevo.

cartero:/# dpkg -r squirrelmail
cartero:/# dpkg -p squirrelmail
cartero:/# dpkg --purge squirrelmail

Ahora nos bajamos la versión mas actual y estable de squirrelmail desde su pagina o mi version retocada:

cartero:/cosas/# wget <http://ovh.dl.sourceforge.net/sourceforge/squirrelmail/squirrelmail-1.4.4.tar.bz2>
cartero:/cosas/# mkdir /var/www/dominio/
cartero:/cosas/# tar xvf correo.tar -C /var/www/dominio.com/ <http://ovh.dl.sourceforge.net/sourceforge/squirrelmail/squirrelmail-1.4.4.tar.bz2> 
cartero:/cosas/# mv squirrelmail-1.4.4 correo

Ya tenemos la versión 1.4.4 de squirrelmail publicada en nuestro web.

Ahora configuremoslo, para empezar cambiaremos el idioma, esto es algo complicado porque debemos instalarnos unos paquetes y reconfigurarlos:

cartero:/cosas/# apt-get install locales
cartero:/cosas/# dpkg-reconfigure locales

Reiniciemos el servicio apache para que no coja las nuevas configuraciones.

cartero:/cosas/# /etc/init.d/apache restart

Una vez reiniciado el servicio ejecutaremos la pequeña aplicación para configurar squirrelmail:

cartero:/cosas/# cd /var/www/dominio.com/correo/config/
cartero:/var/www/dominio.com/correo/config/# ./conf.pl

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Main Menu --
1.  Organization Preferences
2.  Server Settings
3.  Folder Defaults
4.  General Options
5.  Themes
6.  Address Books
7.  Message of the Day (MOTD)
8.  Plugins
9.  Database
10. Languages

D.  Set pre-defined settings for specific IMAP servers

C   Turn color on
S   Save data
Q   Quit

Command >>

Como veis es muy fácil de configurar, solo tenemos que ir entrando en cada uno de los apartados y decirle lo que vamos necesitando.

Las cosas a tener en cuenta en esta configuración son la forma en la que conectara squirrelmail al servidor IMAP, donde se encuentra este y el idioma, os dejo mas abajo las configuraciones:

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Server Settings

General
-------
1.  Domain                 : dominio.com
2.  Invert Time            : false
3.  Sendmail or SMTP       : SMTP

A.  Update IMAP Settings   : 127.0.0.1:143 (courier)
B.  Update SMTP Settings   : 127.0.0.1:25

R   Return to Main Menu
C   Turn color on
S   Save data
Q   Quit

Command >>

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Language preferences
1.  Default Language       : es_ES
2.  Default Charset        : iso-8859-1
3.  Enable lossy encoding  : false

R   Return to Main Menu
C   Turn color on
S   Save data
Q   Quit

Command >>

Vale, ahora comprobemos que todo esta en castellano, si vemos que no nos sale aun, volvamos a hacer cartero:/cosas/# dpkg-reconfigure locales.

Es hora de meterse en la pagina de squirrel y bajarnos todos los plugins que nos parezcan buenos. Yo tengo instalados los siguientes:

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Plugins
  Installed Plugins
    1. translate
    2. squirrelspell
    3. calendar
    4. abook_take
    5. compatibility
    6. change_mysqlpass
    7. quota_usage
    8. abook_import_export
    9. address_add
    10. archive_mail
    11. autocomplete
    12. msg_flags
    13. notify
    14. quicksave
    15. view_as_html

  Available Plugins:
    
R   Return to Main Menu
C   Turn color on
S   Save data
Q   Quit

Command >>

Para la instalación de los plugins tenemos que descargarlos y descomprimirlos en la carpeta /var/www/dominio.com/correo/plugins. Leer dentro de cada uno de los plugins las indicaciones de instalación y luego entrar en el archivo de configuración ./conf.pl y decirle que lo habilite.

Sobre todos los plugin debo deciros que os tocara entrar en cada pagina .php que necesitéis retocar y cambiarla a castellano, muchos de ellos no acepta la configuración de locales. 

Sobre el plugin quota_usage debo deciros que es muy bueno pero que tendremos que retocarlo para que nos funcione con debian y la versión de Imap que tenemos, los cambios que debemos realizar son los siguientes, 

cartero:/# vi /var/www/dominio.com/correo/plugins/quota_usage/functions.php

Buscaremos la función  sqimap_get_quota, es la que pongo aquí debajo:

/**
  * Gets current quota usage from IMAP server
  *
  * @param resource $imap_stream An open stream to the IMAP server
  * @param string $mailbox The mail folder for which to check quota 
  *                        usage
  *
  * @return array A four-element array, consisting of numbers in kilobytes
  *               representing (in this order):  
  *                  - storage used (size quota)
  *                  - total storage available (size quota)
  *                  - messages used (message count quota)
  *                  - total messages available (message count quota)
  *               If either size or message count quota is not available,
  *               the corresponding numbers will instead be returned as
  *               empty strings.
  *               If no quota is given or available, the first element
  *               in the return array is given as "NOQUOTA".
  *
  */
function sqimap_get_quota ($imap_stream, $mailbox) 
{

   global $quota_usage_debug;

   if (check_quota_capability($imap_stream)) 
   {

      $imap_command = "a001 GETQUOTAROOT \"$mailbox\"\r\n";

      fputs ($imap_stream, $imap_command);
      $read_ary = sqimap_read_data ($imap_stream, 'a001', true, $result, $message);

      if (check_sm_version(1, 5, 0))
         $read_ary = $read_ary['a001'];

      if ($quota_usage_debug) 
      {
         echo "IMAP command sent: $imap_command<br />";
         echo 'IMAP response recieved:';
         sm_print_r($read_ary);
      }

      foreach ($read_ary as $response)
      {
         $storageUsed = '';
         $storageTotal = '';
         $messagesUsed = '';
         $messagesTotal = '';
         if (is_array($response))
            foreach ($response as $resp)
            {
               if (strpos($resp, 'STORAGE') !== FALSE || strpos($resp, 'MESSAGE') !== FALSE)
               {
                  preg_match('/[(]([STORAGEMESSAGE0-9 ]+)[)]/', $resp, $matches);
                  $usageArray = explode(' ', $matches[1]);
                  if ($usageArray[0] == 'STORAGE')
                     list($storageUsed, $storageTotal) = array($usageArray[1], $usageArray[2]);
                  if (!empty($usageArray[3]) && $usageArray[3] == 'STORAGE')
                     list($storageUsed, $storageTotal) = array($usageArray[4], $usageArray[5]);
                  if ($usageArray[0] == 'MESSAGE')
                     list($messagesUsed, $messagesTotal) = array($usageArray[1], $usageArray[2]);
                  if (!empty($usageArray[3]) && $usageArray[3] == 'MESSAGE')
                     list($messagesUsed, $messagesTotal) = array($usageArray[4], $usageArray[5]);
                  return array($storageUsed, $storageTotal, $messagesUsed, $messagesTotal);
               }
            }
         else if (strpos($response, 'STORAGE') !== FALSE || strpos($response, 'MESSAGE') !== FALSE)
         {
            preg_match('/[(]([STORAGEMESSAGE0-9 ]+)[)]/', $response, $matches);
            $usageArray = explode(' ', $matches[1]);
            if ($usageArray[0] == 'STORAGE')
               list($storageUsed, $storageTotal) = array($usageArray[1], $usageArray[2]);
            if (!empty($usageArray[3]) && $usageArray[3] == 'STORAGE')
               list($storageUsed, $storageTotal) = array($usageArray[4], $usageArray[5]);
            if ($usageArray[0] == 'MESSAGE')
               list($messagesUsed, $messagesTotal) = array($usageArray[1], $usageArray[2]);
            if (!empty($usageArray[3]) && $usageArray[3] == 'MESSAGE')
               list($messagesUsed, $messagesTotal) = array($usageArray[4], $usageArray[5]);
            return array($storageUsed, $storageTotal, $messagesUsed, $messagesTotal);
         }
     }

   }

   return array('NOQUOTA');

} 

Una vez localizada lo único que tendremos que hacer es comentar tres líneas, os dejo la función completa con las líneas comentadas:

/**
  * Gets current quota usage from IMAP server
  *
  * @param resource $imap_stream An open stream to the IMAP server
  * @param string $mailbox The mail folder for which to check quota 
  *                        usage
  *
  * @return array A four-element array, consisting of numbers in kilobytes
  *               representing (in this order):  
  *                  - storage used (size quota)
  *                  - total storage available (size quota)
  *                  - messages used (message count quota)
  *                  - total messages available (message count quota)
  *               If either size or message count quota is not available,
  *               the corresponding numbers will instead be returned as
  *               empty strings.
  *               If no quota is given or available, the first element
  *               in the return array is given as "NOQUOTA".
  *
  */
function sqimap_get_quota ($imap_stream, $mailbox) 
{

   global $quota_usage_debug;
  /**
  * if (check_quota_capability($imap_stream)) 
  * {
  */
      $imap_command = "a001 GETQUOTAROOT \"$mailbox\"\r\n";

      fputs ($imap_stream, $imap_command);
      $read_ary = sqimap_read_data ($imap_stream, 'a001', true, $result, $message);

      if (check_sm_version(1, 5, 0))
         $read_ary = $read_ary['a001'];

      if ($quota_usage_debug) 
      {
         echo "IMAP command sent: $imap_command<br />";
         echo 'IMAP response recieved:';
         sm_print_r($read_ary);
      }

      foreach ($read_ary as $response)
      {
         $storageUsed = '';
         $storageTotal = '';
         $messagesUsed = '';
         $messagesTotal = '';
         if (is_array($response))
            foreach ($response as $resp)
            {
               if (strpos($resp, 'STORAGE') !== FALSE || strpos($resp, 'MESSAGE') !== FALSE)
               {
                  preg_match('/[(]([STORAGEMESSAGE0-9 ]+)[)]/', $resp, $matches);
                  $usageArray = explode(' ', $matches[1]);
                  if ($usageArray[0] == 'STORAGE')
                     list($storageUsed, $storageTotal) = array($usageArray[1], $usageArray[2]);
                  if (!empty($usageArray[3]) && $usageArray[3] == 'STORAGE')
                     list($storageUsed, $storageTotal) = array($usageArray[4], $usageArray[5]);
                  if ($usageArray[0] == 'MESSAGE')
                     list($messagesUsed, $messagesTotal) = array($usageArray[1], $usageArray[2]);
                  if (!empty($usageArray[3]) && $usageArray[3] == 'MESSAGE')
                     list($messagesUsed, $messagesTotal) = array($usageArray[4], $usageArray[5]);
                  return array($storageUsed, $storageTotal, $messagesUsed, $messagesTotal);
               }
            }
         else if (strpos($response, 'STORAGE') !== FALSE || strpos($response, 'MESSAGE') !== FALSE)
         {
            preg_match('/[(]([STORAGEMESSAGE0-9 ]+)[)]/', $response, $matches);
            $usageArray = explode(' ', $matches[1]);
            if ($usageArray[0] == 'STORAGE')
               list($storageUsed, $storageTotal) = array($usageArray[1], $usageArray[2]);
            if (!empty($usageArray[3]) && $usageArray[3] == 'STORAGE')
               list($storageUsed, $storageTotal) = array($usageArray[4], $usageArray[5]);
            if ($usageArray[0] == 'MESSAGE')
               list($messagesUsed, $messagesTotal) = array($usageArray[1], $usageArray[2]);
            if (!empty($usageArray[3]) && $usageArray[3] == 'MESSAGE')
               list($messagesUsed, $messagesTotal) = array($usageArray[4], $usageArray[5]);
            return array($storageUsed, $storageTotal, $messagesUsed, $messagesTotal);
         }
     }

   }

   return array('NOQUOTA');
/**
* } 
*/

En total, tres líneas, lo que hacemos al anular estas tres líneas es quitar la comprobación de nuestra versión IMAP, la que tenemos supuestamente no acepta quota, pero con maildrop la acepta perfectamente, así que si descomentamos estas líneas hará lo que debe y no se saltara el IF donde nos calcula la quota.

Sobre los plugins no debo deciros mucho mas.

Yo personalmente he retocado mucho código del squirrelmail, ya que quería cosas un poco raras, pero muy útiles, por ejemplo que cuando me llegue spam y lo deje en la carpeta spam (ahora veremos como hacerlo) puede ocurrir que sean falsos negativos, lo que he hecho es poner un botón, que moverá el spam a su carpeta correspondiente . Dependiendo en que carpeta este nos deberá enseñar un botón u otro (Si estoy en la carpeta Spam debe aparecer el botón NO SPAM y si estoy en alguna de las otras carpetas debe aparecer el botón SPAM). Me falta a la vez que muevo el mensaje a su sitio enseñar a SpamAssassin lo que es ham y spam, estoy pensando como hacerlos todavía. Esto tiene un peligro, LOS CLIENTES QUE QUIERAN PODRAN ENSEÑAR MAL A SPAMASSASSIN, es una buena función si nos fiamos de nuestros usuarios, por eso estoy pensando la forma de hacerlo.

Aun así os dejo comprimido mi carpeta de correo, al que le valga perfecto, aun así creo que es mejor trabajársela uno y enterarse de que ocurre por debajo con squirrelmail.

El fichero comprimido de mi squirrelmail se encuentra en http://www.dominio.com/squirrelmail_modificado.tar <http://www.juagu.com/squirrelmail_modificado.tar>

CONFIGURACIONES FINALES 

En este apartado os pongo configuraciones que he tenido que ir retocando para dejarlo a mi gusto. Por ejemplo empezaremos con el tamaño de mensajes que pueden enviar nuestros clientes (Por defecto esta en 2mb):

cartero:/# vi /etc/php4/apache/php.ini

Buscaremos las líneas :

max_execution_time = 200
memory_limit = 25M
post_max_size = 20M

Y las dejaremos al gusto, la línea post_max_size es la que nos permitirá subir a la sesión php archivos de 20 mb, la línea memory_limit y max_execution_time nos asignaran las megas y tiempos de ejecución de scripts correspondientes a las sesiones php, debemos subirlas ,las que vienen por defecto son muy bajas para nuestro servidor de correo, sino el servicio se cae cada dos por tres.

Muy por ahora hemos dejado que la sesión php acepte estos mensajes grandes pero postfix tiene por defecto un valor menor a estas 20 mb (Por defecto nos deja recibir y enviar ficheros de un tamaño menor o igual a 10 mb). Arreglaremos el error 552 Error: message too large. Para hacerlo tendremos que añadir la siguiente línea a nuestro main.cf antes de la línea  # ========== NOMBRE DE LOS DOMINIOS ===========

cartero:/# vi /etc/postfix/main.cf

message_size_limit=100240000
# ========== NOMBRE DE LOS DOMINIOS ===========

La línea que he dejado acepta el envío y la recepcion de mensaje menores a 100 mb.
Para que Maildrop nos mande los mensaje localizados como Spam a la carpeta Spam de cada buzon deberemos cambiar el archivo /etc/maildroprc para dejarlo así:

cartero:/# vi /etc/maildroprc

if ( $SIZE < 26144 )
{
    exception {
       xfilter "/usr/bin/spamassassin"
    }
}

if (/^X-Spam-Flag: *YES/)
{
    exception {
        to "$HOME/$DEFAULT/.Spam"
    }
}
else
{
    exception {
        to "$HOME/$DEFAULT"
    }
}

Reiniciaremos apache y postfix para que nos aplique los cambios realizados:

cartero:/# /etc/init.d/apache restart
cartero:/# /etc/init.d/postfix restart

Configuración de Apache

La primera configuración que debemos hacer en Apache será para restringir el acceso al sitio postfixadmin/admin, recordad que para realizar cambios en la zona especifica de cada dominio lo que hace es pedirnos un usuario y un password, pero para la zona de Admin (la que da de alta administradores de dominios, alta de dominios, etc) no nos pedía nada, haremos que nos pida un usuario y un password. Esto se hace de la siguiente forma:

Añadiremos al final del archivo /etc/apache/httpd.conf lo siguiente:

<Directory "/var/www/html/postfixadmin/admin">
AuthName "Area Restringida"
AuthType Basic
AuthUserFile /usr/.postfixadmin
require valid-user
</Directory>

Muy bien necesitamos crearnos el archivo /usr/.postfixadmin, lo que contiene este archivo es un nombre de usuario y su contraseña codificada. Apache leerá este archivo y comprobara que las credenciales coinciden.

Creemos el archivo:
cartero:/# cd /usr
cartero:/usr/# htpasswd -c .postfixadmin administrador
New password:
Re-type new password:
Adding password for user administrador
cartero:/usr/# vi .postfixadmin
administrador:Z4r.sJHJif7BE

Perfecto podemos comprobar que nos pide las credenciales entrando al sitio <http://direccionipdelservidor/html/postfixadmin/admin/index.php>

Configuremos ahora los virtual host del apache.

La configuración de apache para publicar nuestro sitio en internet son faciles, supongo que cambiara según quien lo haga, aun así yo os pongo la mía. La estructura de directorios que he seguido ha sido simple, dentro del directorio /var/www/ he ido creando carpetas como dominios tengo. Dentro de cada directorio de dominio, creo las carpetas que quiero publicar, por ejemplo www o correo. Luego en el archivo de configuración de apache (/etc/apache/httpd.conf) añadiré nombres de encabezado como carpetas tenga dentro de cada directorio de dominio. Lo veréis mas claro en el ejemplo, solo os dejo la configuración de los virtual host y la configuración de área restringida:

cartero:/# vi /etc/apache/httpd.conf

<Directory "/var/www/html/postfixadmin/admin">
AuthName "Area Restringida"
AuthType Basic
AuthUserFile /usr/.postfixadmin
require valid-user
</Directory>

NameVirtualHost *:80

<VirtualHost *:80>
ServerName www.dominio.com
ServerAlias dominio.com
ServerPath /var/www/dominio.com/www
DocumentRoot /var/www/dominio.com/www
CustomLog /var/log/apache/www.dominio.com.log combined
</VirtualHost>

<VirtualHost *:80>
ServerName correo.dominio.com
ServerPath /var/www/dominio.com/correo
DocumentRoot /var/www/dominio.com/correo
CustomLog /var/log/apache/correo.dominio.com.log combined
</VirtualHost>

<VirtualHost *:80>
ServerName www.postfixadmin.intranet
ServerPath /var/www/html/postfixadmin
DocumentRoot /var/www/html/postfixadmin
CustomLog /var/log/apache/postfixadmin.log combined
</VirtualHost>

¿Que significa todo esto? fácil, todas las direcciones ip (*) que entren por el puerto 80 con el encabezado www.dominio.com <http://www.dominio.com/> o su alias dominio.com serán redireccionadas a su server path y serán registradas sus entradas y errores en su custom log.

Yo dejo el custom log como combined, me registrara errores y accesos, posteriormente lo utilizare para crear estadísticas web.

Si os dais cuenta en el virtualhost de postfixadmin he puesto .intranet no podrá entrar nadie de fuera ( a no ser que sepa que esta ahí y se lo ponga en el host), no me interesa que eso sea visto desde internet. Si vais a tener muchos usuarios no es mala idea publicarlo en internet y delegar la creación de usuarios al dueño del dominio.

Otra cosa mas, en esta configuración si no cumple ninguno de los encabezaos (imaginad que queréis entrar con la dirección ip) enseñara el primer virtual host.

ACLARACIONES

No utilicéis las contraseñas, nombres de dominios que salen aquí. El documento puede tener errores. TODOS LOS ERRORES QUE VEAIS, mandádmelos a la dirección de correo juanmi@planalfa.es <mailto:juanmi@planalfa.es> y los iré corrigiendo, si conocéis mejor forma de utilizar SpamAssassin, mandadme vuestros comentarios. Cualquier cosa que mejore lo presente será aceptada. podéis escribirme si tenéis alguna duda y siempre que pueda y sepa os contestare. Yo comparto este documento, compartid vosotros, lo que tengáis que añadir mandádmelo.

ACTUALIZACIONES (de Woddy a Sarge)

Como habreis leido mas arriba debido a un cambio de la version estable de Debian, (de Woody paso a Sarge) me tope con mas de un problema, si lo teneis hecho el servidor de correo con Woody cuidado con el upgrade (mi servidor de correo se quedo tirado tres dias, menos mal que estaban Pizco y Alfonso que me ayudaron a recuperarlo). Mi problema principal fueron SASL y SPAMASSASSIN ademas de un monton de aplicaciones que se me desinstalaron.

Despues de reescribir LILO (para que arrancase la nueva version instalada, sarge) empeze a instalar paquetes de nuevo, ya de la nueva version estable. Mi sorpresa fue cuando le dije que instalase SASL y me decia que no existia el paquete, solo existia SASL2 (me vi negro intentando instalarla de primera en la version woody, por eso mas arriba esta la version 1). Manos a la obra y a inteentar recuperar el SASL.

cartero:~#apt-get install sasl2

Las configuraciones en /etc/postfix/main.cf no cambian, si que cambian en /etc/postfix/sasl/smtp.conf

cartero:~#vi /etc/postfix/sasl/smtp.conf

sql_user: postfix
sql_passwd: postfix
sql_hostnames: localhost
sql_database: postfix
sql_statement: SELECT password FROM mailbox WHERE username = '%u@%r'
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: GSSAPI DIGEST-MD5 CRAM-MD5

Para sacar estas lineas y que me funcionase me tire dos dias desesperantes (pufffffffffff).

Sobre el SpamAssassin el problema fue con la base de datos, habia que actualizarlas:

cartero:~#sa-learn -D --import --dbpath /cartas/.spamassassin

Se que me dio un par de errores y luego se puso a funcionar, no os pasara si no realizais actualizacion, es decir si comenzais a instalarlo desde la sarge como digo mas arriba, no tendreis problemas con la version qeu sea.

GRACIAS

Agustín Calvo Flores, lo hemos hecho casi todo juntos.
Alfonso de MicroAlcarria, me ayudo al comienzo, decisiones iniciales.
Maximo de Linuxdicas, sino es por su manual no creo que hubiese podido.
A Pizco por mis multiples problemas con la actualizacion.
A vosotros que juntos mejoraremos este documento.

Saludos y espero que no tengáis muchos problemas.

Juan Miguel Alcarria Herrera
juanmi@planalfa.es