Elegir un manejador de listas de correo


Las listas de correo son sin duda de los más viejos servicios colectivos en línea, del tiempo que se les decía "telemáticos" o teleiformáticos". L@s viej@s llegamos a conocer bichos como Majordomo(external link), o los listserv de Bitnet(external link).

Actualmente, sin duda el manejador de listas de correo más utilizado es mailman(external link). En la UdelaR, tenemos varias instancias de mailman, cómo la de la Facultad de Ciencias, que usamos para la lista de correo de este grupo. Si bien mailman está bien mantenido y no sufre de "abandonware", su interfaz hacia el usuario final es de concepción algo antigua, y no es muy amigable (al menos en su configuración por omisión).

Para softwarelibre.edu.uy, nos proponemos probar Sympa(external link), un sistema de concepción más reciente y prolija, que ofrece interesantes ventajas, como su RSS nativo, su interoperabilidad con LDAP y otras interfaces estándar.

Instalación de Sympa

¿Qué versión elegir?

La instalamos en russell.csic.edu.uy(external link), vserver /(linux-vserver) con una debian squeezee.

Via apt (o aptitude) vemos que la debian squeezee propone sympa 6.0.2

Siempre es mejor instalar la versión de un paquete que viene con la distribución elegida, y a través del sistema de empaquetado. Eso nos garantiza que pasó el control de calidad y que a futuro tendremos actualizaciones, y un proceso fácil de migración.

No obstante, en ciertos casos, como "la última capa" web, con tecnologías que no tienen demasiada dependencia directa con librerías incrustadas profundamente en el sistema (como PERL -que utiliza Sympa- o PHP) y/o cuando conocemos bien el paquete que instalamos, podemos hacer excepción y elegir instalar un paquete directamente como lo propone su comunidad, y hacerle confianza al proceso de calidad de ésta. Ésto nos permite tener las versiones más recientes del paquete.

Considerando que la comunidad de desarrollo de Sympa ha sido particularmente activa desde entonces,
que en las Release Notes(external link) sugieren: WE STRONGLY SUGGEST YOU TO UPGRADE ANY PREVIOUS VERSION TO 6.1.1
y que, desde la 6.0.2 que integra la squeezee no hay nuevas exigencias de dependencias,
mejor instalar la última versión estable (6.1.6) desde el .tar.gz original.

Bajar la última versión de sympa

Vemos la última versión para descargar en el sitio oficial de sympa(external link) y la bajamos.

A la hora de hacerlo para sl.edu.uy era la 6.1.6 (¡capicúa, para suerte!).
Desde entonces salió la 6.1.7(external link), y lo actualizamos. Mejor andá a ver las fuentes(external link).

Luego iniciamos el proceso de instalación de la documentación oficial(external link), pero antes aprovechamos que ya hay una versión de sympa bastante cercana que está en los repos:

Dependencias y requerimientos

Utilizaremos el aptitude y sacaremos provecho de la versión de sympa presente en los repositorios para instalar fácilmente todas las dependencias:

Instalación de todas las dependencias de Sympa con aptitude

Procedimiento:

  1. como root, corremos aptitude
  2. Con "/" buscamos, ingresamos "sympa",
  3. entramos con "Enter" en la página de configuración de sympa
  4. Con las flechas bajamos para ver todas las dependencias, que podemos abrir con "Enter" (en rojo están las que faltan)
  5. Con "+" marcamos las dependencias para ser instaladas (van pasando a verde)
  6. Al final, lanzamos la instalación con "g", una primera vez para ver la lista, y una segunda para ejecutar la instalación


Para algunos paquetes, se proponen varias alternativas. Elegimos en particular postgresql como base de dato y postfix como manejador de correo (MTA).

La base de datos

¡Probemos instalarlo con postgres! Más libre, más comunitario, y conocido por su robusteza y calidad.

Para eso, en el paso precedente de las dependencias hay que ser atento en seleccionar la alternativa correcta, entre las dos que propone la dependencia correspondiente, postgresql o mysql-server.

Luego creamos el usuario para sympa, y la base sympa (esta documentación está buena(external link)):

# su - postgres
$ psql
postgres=# CREATE USER sympa WITH PASSWORD 'NoSeLoDigasANadie';
postgres=# CREATE DATABASE sympa;
postgres=# GRANT ALL PRIVILEGES ON DATABASE sympa TO sympa;


Luego, como dice la documentación de sympa(external link), para postgres el script de configuración (que vamos a correr más adelante) no configura la base de datos, y hay que hacerlo a mano. Luego de un poc de prueba/error vemos que postgres patea y para un script si ejecutamos un DROP TABLE <tabla>; con una <tabla> que no existe. Así que, a la propuesta de la doc de sympa, le comentamos todas las líneas DROP

Copiamos/pegamos el script que sigue en un shell postgres (o lo ejecutamos desde un archivo):

-- PostgreSQL Database creation script

-- esto ya esta
-- CREATE DATABASE sympa;

-- Connect to DB 
\connect sympa

-- DROP TABLE user_table;
CREATE TABLE user_table (
  	email_user          	varchar (100) NOT NULL,
  	gecos_user          	varchar (150),
	cookie_delay_user       int4,
        password_user		varchar (40),
        last_login_date_user	int4,
        last_login_host_user	varchar (60),
	wrong_login_count_user  int4,
        lang_user               varchar (10),
	attributes_user		varchar (255),
	data_user	        varchar (255),
	CONSTRAINT ind_user PRIMARY KEY (email_user)
);

-- DROP TABLE subscriber_table;
CREATE TABLE subscriber_table (
  	list_subscriber       	varchar (50) NOT NULL,
	user_subscriber		varchar (100) NOT NULL,
  	custom_attribute_subscriber varchar (500),
	robot_subscriber	varchar (80) NOT NULL,
	date_subscriber		timestamp with time zone NOT NULL,
	update_subscriber 	timestamp with time zone,
	visibility_subscriber	varchar (20),
	reception_subscriber	varchar (20),
	topics_subscriber	varchar (200),
	bounce_subscriber	varchar (35),
	bounce_score_subscriber int4,
	bounce_address_subscriber	varchar (100),
	comment_subscriber	varchar (150),
	subscribed_subscriber 	smallint,
	included_subscriber 	smallint,
	include_sources_subscriber varchar(50),
	suspend_subscriber      smallint,
	suspend_start_date_subscriber    int4,
	suspend_end_date_subscriber      int4,
	CONSTRAINT ind_subscriber PRIMARY KEY (robot_subscriber,list_subscriber,user_subscriber)
);
CREATE INDEX subscriber_idx ON subscriber_table (robot_subscriber,list_subscriber,user_subscriber);
CREATE INDEX subscriber_idx2 ON subscriber_table (user_subscriber);


-- DROP TABLE admin_table;
CREATE TABLE admin_table (
	list_admin 		varchar(50) NOT NULL,
 	user_admin 		varchar(100) NOT NULL,
 	robot_admin 		varchar(80) NOT NULL,
	role_admin 		varchar(15) NOT NULL,
	date_admin 		timestamp with time zone NOT NULL,
	update_admin 		timestamp with time zone,
	reception_admin 	varchar(20),
	visibility_admin 	varchar(20),
	comment_admin 		varchar(150),
	subscribed_admin  	smallint,
	included_admin  	smallint,
	include_sources_admin  	varchar(50),
	info_admin   		varchar(150),
	profile_admin  		varchar(15),
        CONSTRAINT ind_admin PRIMARY KEY (robot_admin, list_admin, role_admin, user_admin)
);
CREATE	INDEX admin_idx ON admin_table(robot_admin, list_admin, role_admin, user_admin);
CREATE	INDEX admin_idx2 ON admin_table(user_admin);

-- DROP TABLE exclusion_table;
CREATE TABLE exclusion_table (
	list_exclusion 		varchar(50),
 	user_exclusion 		varchar(100),
	date_exclusion 		int4,
        CONSTRAINT ind_exclusion PRIMARY KEY (list_exclusion, user_exclusion)
);
CREATE	INDEX exclusion_idx ON exclusion_table(list_exclusion, user_exclusion);

-- DROP TABLE netidmap_table;
CREATE TABLE netidmap_table (
        netid_netidmap              varchar (100) NOT NULL,
	serviceid_netidmap	    varchar (100) NOT NULL,
	robot_netidmap	            varchar (80) NOT NULL,
        email_netidmap              varchar (100),
        CONSTRAINT ind_netidmap PRIMARY KEY (netid_netidmap, serviceid_netidmap, robot_netidmap)
);
CREATE	INDEX netidmap_idx ON netidmap_table(netid_netidmap, serviceid_netidmap, robot_netidmap);

-- DROP TABLE logs_table;
CREATE TABLE logs_table (
	id_logs			bigint NOT NULL,
	date_logs		int4 NOT NULL,
	robot_logs		varchar (80),
	list_logs		varchar (50),
	action_logs		varchar (50) NOT NULL,
	parameters_logs		varchar (100),
	target_email_logs	varchar (100),
	user_email_logs		varchar (100),
	msg_id_logs		varchar (255),
	status_logs		varchar (10) NOT NULL,
	error_type_logs		varchar (150),
	client_logs		varchar (100),
	daemon_logs		varchar (10) NOT NULL,
        CONSTRAINT ind_logs PRIMARY KEY (id_logs)
);
CREATE	INDEX logs_idx ON logs_table(id_logs);

-- DROP TABLE session_table;
CREATE TABLE session_table (
	id_session			int8 NOT NULL,
	start_date_session		int4 NOT NULL,
	date_session		        int4 NOT NULL,
	remote_addr_session		varchar(60),
	robot_session		        varchar(80),
	email_session		        varchar(100),
	hit_session     	        int4,
	data_session		        varchar(255),
	CONSTRAINT ind_session PRIMARY KEY (id_session)
);
CREATE	INDEX session_idx ON session_table(id_session);


-- DROP TABLE one_time_ticket_table;
CREATE TABLE one_time_ticket_table (
	ticket_one_time_ticket		varchar(30),
	robot_one_time_ticket		varchar(80),
	email_one_time_ticket		varchar(100),
	date_one_time_ticket		bigint,
	data_one_time_ticket		varchar(200),
	remote_addr_one_time_ticket	varchar(60),
	status_one_time_ticket	varchar(60),
	CONSTRAINT ind_one_time_ticket PRIMARY KEY (ticket_one_time_ticket)
);
CREATE	INDEX one_time_ticket_idx ON one_time_ticket_table(ticket_one_time_ticket);

-- DROP TABLE bulkmailer_table;
CREATE TABLE bulkmailer_table(
  	messagekey_bulkmailer  	varchar(80),
	packetid_bulkmailer 	varchar(33),
  	messageid_bulkmailer  	varchar(100),
	receipients_bulkmailer 	text,
	returnpath_bulkmailer 	varchar(100),
	robot_bulkmailer 	varchar(80),
	listname_bulkmailer 	varchar(50),
	verp_bulkmailer 	smallint,
	merge_bulkmailer 	smallint,
	priority_message_bulkmailer 	int4,
	priority_packet_bulkmailer 	int4,
	reception_date_bulkmailer 	int4,
	delivery_date_bulkmailer 	int4,
	lock_bulkmailer 	varchar(30),
	constraint ind_bulkmailer PRIMARY KEY (messagekey_bulkmailer, packetid_bulkmailer)
);
CREATE INDEX  messagekey_bulkmailer_idx ON bulkmailer_table(messagekey_bulkmailer);
CREATE INDEX  packetid_bulkmailer_idx ON bulkmailer_table(packetid_bulkmailer);

-- DROP TABLE bulkspool_table;
CREATE TABLE bulkspool_table (
  	messagekey_bulkspool  	varchar(33),
  	messageid_bulkspool  	varchar(100),
	message_bulkspool 	text,
	lock_bulkspool 	smallint,
        dkim_privatekey_bulkspool  varchar(100),
	dkim_selector_bulkspool varchar(50),
	dkim_d_bulkspool varchar(50),
	dkim_i_bulkspool varchar(50),
	dkim_header_list_bulkspool varchar(500),
	constraint ind_bulkspool primary key (messagekey_bulkspool)
);
CREATE INDEX messagekey_bulkspool_idx ON bulkspool_table(messagekey_bulkspool);

-- DROP TABLE conf_table;
CREATE TABLE conf_table (
  robot_conf varchar(80),
  label_conf varchar(80),
  value_conf varchar(300),
  constraint ind_conf primary key (robot_conf,label_conf)
);
CREATE INDEX robot_conf_idx ON conf_table(robot_conf,label_conf);

Un acceso gráfico web a Postgres


Para tener un acceso gráfico web, instalamos phppgadmin para tener una interfaz gráfica. La instalación, que implica librerías php reemplaza el apache2-mpm-worker por apache2-mpm-prefork. Lo aceptamos.

En la wiki debian hay una explicación de la configuración de phppgadmin(external link).

Pero igual hay que meterle mano: Configuramos el phppgadmin para que esté accesible, pero sólo en https:
borramos la configuración por omisión de phppgadmin (que permite acceso, con un Alias, de cualquier VirtualHost), activamos el módulo ssl, instalamos un certificado autofirmado y creamos un VirtualHost en https idéntico al que viene con apache:

rm /etc/apache2/conf.d/phppgadmin.conf
aptitude install ssl-cert
a2enmod ssl
cd /etc/apache2/sites-available
cp default-ssl phppgadmin-ssl
a2ensite phppgadmin-ssl


En la definición del nuevo VirtualHost, /etc/apache2/sites-available/phppgadmin-ssl llamamos la configuración del phppgadmin:

<IfModule mod_ssl.c>
<VirtualHost _default_:443>
        ServerAdmin webmaster@russell.csic.edu.uy

        # para tener phppgadmin sólo en HTTPS
        Include /etc/phppgadmin/apache.conf

        DocumentRoot /var/www
    ....


Y en ese archivo, /etc/phppgadmin/apache.conf, permitimos el acceso distante que está desactivado por omisión:

...
order deny,allow
# deny from all
# allow from 127.0.0.0/255.0.0.0 ::1/128
allow from all
...


Activamos el nuevo VirtualHost y reiniciamos apache:

a2ensite phppgadmin-ssl
service apache2 restart


Y ahora en un navegador, vemos nuestro acceso phppgadmin(external link).

(En realidad, más adelante, vamos a integrar esta configuración a un solo VirtualHost: el del manejador de listas. Multiples VirtualHost en https plantean problemas de certificados un poco trickies).

Para configurar los usuarios y bases del postgres en sí, esta documentación(external link) me pareció la más clara.

Entramos desde el usario postgres, y creamos una base y un usuario para sympa, con una contraseña larga y generada aleatoriamente.

Módulos PERL


Acá está la lista de módulos PERL que requiere Sympa(external link).

Como documentado acá(external link), hay dos maneras de instalar los módulos PERL: preconfigurados como paquetes debian, o con el comando perl que los baja de CPAN.

El problema es que, instaldos de la primer manera, no son visibles desde el perl: Como documentado acá(external link), con instmodsh, y luego l vemos que sólo Perl está configurado.

Procedamos por tanteo, empezando por instalar todo lo está empaquetado en debian, y luego completando:
Instalamos (que de hecho no estaban en las dependencias de sympa...):
-+libdigest-md5-file-perl
Hagamos
para instalar los módulos que necesitamos, lanzamos:

# perl -MCPAN -e shell

Nos propone configurar lo más que puede automáticamente. (¿Será necesario YAML?)

Y luego ejecutamos (bajo el prompt cpan1> que nos da):

i /Base64/
install MIME::Base64
install CGI
install Crypt::CipherSaber

Enfin... luego de algunas idas y vueltas aprendiendo, todo parece ok.

De todas maneras, una vez que estemos compilando y configurando, hay un script de verificación para instalar todos los módulos PERL que faltan (dice que son 60 o 65!). Hicimos bien de hacer lo posible, ya que ese script también nos dice:

##########################################################################################
# This process will help you install all Perl (CPAN) modules required by Sympa software.
# Sympa requires from 50 to 65 additional Perl modules to run properly. 
# The whole installation process should take around 15 minutes.
# You'll first have to configure the CPAN shell itself and select your favourite CPAN server.
# Note that you might prefer to install the required Perl modules using your favourite DEB/RPM mechanism.
# Feel free to interrupt the process if needed ; you can restart it safely afterward.
##########################################################################################

Creación del usuario UNIX para sympa


Además de lo que dice la doc, le ponemos ciertas opciones para ser coherentes y seguros:

adduser --system --shell /bin/bash --group --disabled-password sympa


Compilación de sympa

Acá rapidito nos damos cuenta que necesitamos... un compilador. Y otras utilerías que identificamos luego de algunas idas y vueltas analizando el log de la configuración:

aptitude --with-recommends install gcc gettext make gawk


Ahí podemos compilar (los parámetros son los que requiere la debian: los deducimos luego de algunos errores):

./configure --with-initdir=/etc/init.d/ --with-lockdir=/var/lock/
make
make install

Al contrario de lo que sugiere la doc con un '$', el make install hay que hacerlo como root.

El final de la instalación nos da los comandos siguientes:

/home/sympa/bin/sympa_wizard.pl --check

¡y teníamos casi todos los módulos Perl!

Configuración de sympa

Ejecutamos:

/home/sympa/bin/sympa_wizard.pl


Y le damos todos los parámetros que del servidor (ver /etc/sympa.conf y /etc/wwsympa.conf)

Configuración de WWSympa

Russell es un vserver dedicado a sympa, y por ende también su apache. La documentación nos propone(external link) modificar el usuario de ejecución de apache. Modificamos /etc/apache2/envvars:

....
## ver: https://www.sympa.org/manual_6.1/web-interface#alternatives_all_versions
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
# export APACHE_RUN_USER=www-data
# export APACHE_RUN_GROUP=www-data
export APACHE_RUN_USER=sympa
export APACHE_RUN_GROUP=sympa
...


Nos faltó instalar:

aptitude install libapache2-mod-fastcgi

Y ahí podemos instalar ese módulo y otros y reiniciar:

a2enmod fastcgi
a2enmod ssl
service apache2 restart


En el DNS de softwarelibre.org.bo, ya tenemos configurado u A i un MX:

root@russell:# host listas.softwarelibre.edu.uy 
listas.softwarelibre.edu.uy has address 164.73.68.14
listas.softwarelibre.edu.uy mail is handled by 10 russell.csic.edu.uy.


Configurermos los VirtualHost de Apache. La interfaz web va a estar en https, pero correctamente re-dirigida desde http. En /etc/apache2/sites-available copiamos los modelos

cp default listas.softwarelibre.edu.uy
cp default-ssl listas.softwarelibre.edu.uy-ssl


En el primero ponemos sólo una redirección:

<VirtualHost *:80>
        ServerName listas.softwarelibre.edu.uy
        ServerAdmin webmaster@softwarelibre.edu.uy

        Redirect / https://listas.softwarelibre.edu.uy/
        ...
</VirtualHost>


En el segundo, la redirección de la raíz, y lo que indica la documentación de sympa:

<IfModule mod_ssl.c>
<VirtualHost _default_:443>
        ServerName listas.softwarelibre.edu.uy
        ServerAdmin webmaster@softwarelibre.edu.uy

                RedirectMatch ^/$ http://listas.softwarelibre.edu.uy/sympa/

        FastCgiServer /home/sympa/bin/wwsympa-wrapper.fcgi -processes 2

        # para tener phppgadmin sólo en HTTPS
        Include /etc/phppgadmin/apache.conf

        <Location /sympa>
                SetHandler fcgid-script
        </Location>

        Alias /static-sympa /home/sympa/static_content
        Alias /wwsicons /home/sympa/static_content/icons
        ScriptAlias /sympa /home/sympa/bin/wwsympa-wrapper.fcgi
        Alias /wws /var/www/_sympa_/wwsympa.fcgi

        ...
</VirtualHost>
</IfModule>

Últimos ajustes...

Intentamos re-iniciar sympa... y fracasa :-( :

root@russell:/home/sympa# /etc/init.d/sympa restart
Restarting Sympa subsystem: 
Stopping Sympa subsystem: 
Module bounced.pl not running
Module archived.pl not running
Stopping module bulk.pl: success

Module sympa.pl not running
Module task_manager.pl not running
Starting Sympa subsystem: 
Starting module sympa.pl: output checkfiles_as_root : Missing files. Aborting.
failure

Starting module bulk.pl: success

Starting module archived.pl: success

Starting module bounced.pl: success

Starting module task_manager.pl: success

Y urgando un poco, en los log /var/log/syslog/ encontramos:

Jul 24 00:32:04 russell sympa[14666]: err Conf::checkfiles_as_root() Failed to create aliases file /etc/mail/sympa_aliases
Jul 24 00:32:04 russell sympa[14666]: output checkfiles_as_root : Missing files. Aborting.


Alcanza con crear la carpeta que necesita:

mkdir /etc/mail

Volvemos a reiniciar sympa, esta vez funciona, y ya con esto podmos ver: listas.softwarelibre.edu.uy(external link)

Para que Sympa arranque solo cuando reiniciamos el servidor:

update-rc.d sympa defaults

Configuración del manejador de correo (MTA)

Sólo nos queda configurar postfix para que reciba correo para el dominio y que tome en consideración los alias que genera el sympa.

En /etc/postfix/main.cf Agregamos:

....
myhostname = russell.csic.edu.uy
alias_maps = hash:/etc/aliases hash:/etc/mail/sympa_aliases
alias_database = hash:/etc/aliases hash:/etc/mail/sympa_aliases
myorigin = /etc/mailname
mydestination = listas.softwarelibre.edu.uy
                softwarelibre.edu.uy
                russell.csic.edu.uy, localhost.csic.edu.uy, localhost
relayhost =
....


Agregamos los dominios a mydestination para que acepte correo @listas.softwarelibre.edu.uy y @softwarelibre.edu.uy.
El alias_maps toma en cuenta los alias de sympa, que genrea su alias_manager(external link) genera en /etc/mail/sympa_aliases.
Y el agregarlo también al alias_database asegura que el comando newaliases -que se puede correr manualmente, y que ejecuta el alias_manager de sympa cada vez que actualiza un nuevo alias- incluya la indexación en .db de ese archivo.

Algunos ajustes más para que no hayan problemas de derechos de acceso:

adduser postfix sympa
cd /etc/mail
chown root:root sympa_aliases
newaliases
chown sympa:sympa sympa_aliases*
chmod g+w sympa_aliases*
postfix reload


Creamos algunas listas de prueba, verificamos todo que -¡increíblemente!- funciona... Nos queda sólo personalizar el logo, el menu, finalizar bien la traducción de Sympa(external link), etc.


Próximos eventos

No hay registros que mostrar