Artículo 4: RECOGIDA Y ENVIO DE CORREO ELECTRONICO

Autor: (c) Santiago Romero
Revista: Solo Linux (Prensa Técnica) - Octubre-2000


El correo electrónico es probablemente el servicio más útil para muchos de los usuarios de Internet (y uno de los más utilizados), permitiendo intercambio de información en unos tiempos mínimos. Veamos las enormes posibilidades del correo bajo Linux.


Como usuarios de Linux (un Sistema Operativo eminentemente de redes) nuestra primera tarea será la configuración de la recogida, envío y gestion de correo electrónico con los programas típicos incluidos en cualquier distribución. Y es que el correo electrónico en Linux no puede considerarse como un extra al sistema operativo, sino que forma parte del mismo pues es una característica inherente a todo Linux.

Lo que haremos en esta entrega será configurar unas herramientas que permitirán a nuestro cliente de correo trabajar de una forma mucho más productiva. En concreto, nuestro objetivo será:

a). Instalar y configurar sendmail. Sendmail es un programa (un servidor de correo) que envía nuestro correo electrónico conectandose al servidor de correo de nuestro ISP y realizando por nosotros todo el intercambio de información entre nuestra máquina y el servidor de correo remoto. Con sendmail funcionando en nuestra máquina podremos utilizar cualquier cliente de correo en modo offline (trabajar en modo desconectado). Esto implica que si usamos (por ejemplo) Netscape Messenger, Mutt, Balsa, Spruce, Evolution, o cualquier otro cliente de correo, al enviar un correo electrónico estando desconectados de la red, dicho correo irá a parar a nuestra máquina, al almacén (cola de correo) de sendmail, de modo que en la próxima conexión a Internet se envie todo el correo acumulado. Esto nos permite contestar el correo con el modem desconectado y por tanto nos evita almacenar el correo en alguna carpeta para luego tener que enviarlo uno a uno en la próxima conexión. Simplemente enviamos los mensajes dejándole a sendmail el posterior trabajo de envío al ISP.

En resumen, con sendmail correctamente configurado al enviar un mensaje con nuestro cliente de correo habitual en lugar de tratar de enviarlo al ISP se enviará al almacén de sendmail. Este almacén o cola de correo de sendmail está situado en /var/spool/mqueue, lugar donde se almacenan los mensajes en ficheros de texto hasta la hora en que se llame a sendmail (manual o automáticamente) para que coja todos estos mensajes y los envíe a nuestro proveedor. Sendmail no saca ningún tipo de salida por pantalla, funcionando en modo silencioso y mientras nosotros seguimos trabajando con nuestra máquina. Nada más transparente y útil, que nos permitirá olvidarnos del envío del correo.

b). Instalar y configurar fetchmail. Normalmente para recoger el correo estamos acostumbrados a conectar a Internet, entrar en nuestro cliente de correo (Netscape Messenger o Mutt, por ejemplo) y recoger todos los mensajes de las diferentes cuentas de correo que tengamos, una a una. Fetchmail nos va a evitar todo trabajo relacionado con la recogida del correo, permitiéndonos (junto a sendmail) la lectura y envío de correo offline. Fetchmail es un programa que se conecta a uno o más servidores de correo entrante (pop.arrakis.es, pop.ctv.es, o el que usemos habitualmente) y recoge el correo disponible en nuestras cuentas, almacenándolo en nuestra máquina (en /var/spool/mail/usuario) de forma que luego lo podamos recoger con nuestro cliente habitual de correo.

Previamente a la instalación de fetchmail necesitaremos instalar y configurar sendmail, puesto que fetchmail utiliza internamente a sendmail para la distribución del correo.


ENVIO DE CORREO CON SENDMAIL

Lo primero que deberemos hacer será instalar el paquete sendmail, estándar como servidor de correo en todas las distribuciones (excepto en Debian, donde está como secundario aunque incluido). A continuación procederemos a su configuración, para lo cual necesitamos entender qué ocurre cuando enviamos un email desde nuestra máquina.

Cuando escribimos un email que va fuera de nuestra red local (por ejemplo, a una dirección de correo electrónico en Internet) necesitamos un agente (programa) que extraiga dicho correo de /var/spool/mqueue (el almacén de sendmail) y lo envie a nuestro Proveedor de Servicios de Internet (como smtp.arrakis.es, smtp.ctv.es, etc.). Sendmail es un programa bastante complicado de configurar (existen libros de _miles_ de páginas sobre sendmail) de modo que nosotros nos centraremos en exponer el método más sencillo de configuración (aprovechando que podemos ser root de nuestras propias máquinas, y que si no lo somos, probablemente ya estará configurado por su administrador). Para configurar sendmail deberemos, como root, editar el fichero de configuración /etc/sendmail.cf, con el fin de modificar 2 líneas del mismo:

1.- Buscamos una línea similar a la siguiente:

# "Smart" relay host (may be null)
DS

Esta línea hay que cambiarla de forma que referencie a nuestro servidor de correo saliente o smtp (para que sendmail envíe a dicho servidor nuestro correo). Si por ejemplo nuestro servidor de correo saliente es smtp.arrakis.es, la línea deberá quedar como (sin espacio entre las 2 cadenas):

# "Smart" relay host (may be null)
DSsmtp.arrakis.es

2.- Lo siguiente es enmascarar nuestra dirección de correo (es decir, modificar el fichero de configuración para que las direcciones de retorno de e-mails no sean las que tenemos en nuestra máquina (como sromero@localhost), sino las direcciones de retorno reales (sromero@miisp.es). Para ello buscamos la siguiente línea:

# Who I masquerade as (null for no masquerading)
DM

A esta línea se le añade el dominio de nuestra dirección de correo. Si nuestra dirección de email es sromero@arrakis.es, el dominio es arrakis.es:

# Who I masquerade as (null for no masquerading)
DMarrakis.es

Con estos cambios estamos forzando a que cuando se escribe un email, la dirección de retorno del mismo tenga el dominio correcto, cosa que se podría modificar de igual manera (sin el retoque de sendmail.cf) si nuestro programa para leer/contestar el correo permite hacerlo (en mutt o en Pine se puede, por ejemplo). Para un usuario medio (acceso a Internet, recogida de correo de una o múltiples cuentas y envio de correo a través de un sólo proveedor.), el método comentado aquí es más que suficiente (y a la vez sencillo).

Cualquier cambio en el fichero de configuración sendmail.cf requiere que reiniciemos sendmail para que éste relea dicho fichero y comience a trabajar con la nueva configuración. Para ello no es necesario reiniciar la máquina (aunque también puede hacerse así), si no que bastará con reiniciar sendmail. En una distribución basada en Redhat (Redhat, Esware, Mandrake, etc.) habrá que pedirle al sistema que reinicie sendmail, mediante el comando /etc/rc.d/init.d/sendmail restart:

[root@compiler correo]# /etc/rc.d/init.d/sendmail restart
Shutting down sendmail:                          [  OK  ]
Starting sendmail:                               [  OK  ]

El directorio donde esté localizado el script de relanzamiento de sendmail puede variar en Debian o Suse, pero siempre localizable dentro de /etc/ y disponiendo de las mismas opciones (start, stop, restart y status). Cabe decir que de este mismo modo se pueden reiniciar otros muchos servicios de la máquina sin necesidad de reinicializarla toda ella completa (mirar servicios disponibles en /etc/rc.d/init.d).

Una vez realizada la configuración, supongamos que desde un usuario cualquiera enviamos un email a usuario@proveedor.es, mediante Netscape, mail, o cualquier otro cliente de correo. Dicho email se grabará en /var/spool/mqueue a la espera de ser enviado a nuestro ISP quien a su vez lo enviará al usuario <usuario>. Es decir, los e-mails que enviemos a Internet se guardarán en la cola de correo (un simple directorio) hasta que se realice su envio mediante sendmail en la próxima conexión a Internet, gracias al comando "sendmail -q". Los mensajes en cola de envío se encuentran en /var/spool/mqueue (por si queremos releerlos o borrar alguno), y podemos consultarlos mediante el comando mailq. Cada mensaje se almacena en el directorio mqueue en 2 ficheros, uno con la cabecera del mensaje (cuyo nombre de fichero empieza por la cadena qf) y otro con el texto del mensaje (cuerpo) en sí (cadena df).

Sendmail es un daemon o demonio, es decir, está ejecutandose en nuestra consola continuamente tratando de enviar el correo cada cierto tiempo. Esto puede ser una ventaja (si estamos conectados durante todo el día, dejarlo funcionando como daemon nos asegura que cada cierto tiempo, configurable, se autoenviará a Internet el correo que haya en la cola de correo) o un inconveniente (si deseamos que sólo se envíe cuando realizamos conexiones). Para evitar esto, y obligarle a que el envío se realice manualmente por nuestra parte, debemos modificar el arranque de sendmail en el fichero /etc/rc.d/init.d/sendmail cambiándolo para que arranque con las siguientes opciones (o similares):

daemon /usr/sbin/sendmail -bd -oDeliveryMode=d

Otro problema común es recibir una advertencia (warning) cada vez que un mensaje lleve más de unas determinadas horas sin ser enviado (4 por defecto). Tan sólo hay que editar /etc/sendmail.cf y comentar (colocando un símbolo # al principio de la línea, y, por tanto, deshabilitándola) la siguiente opción:

Timeout.queuewarn=4h

Esta opción nos avisaría (con un mensaje) cuando un correo lleva más de 4 horas sin ser enviado. Como en nuestro caso es muy probable que así suceda (por ejemplo, si un día no nos conectamos, el correo permanece en la cola de correo más de 4 horas), es recomendable deshabilitarla. Otra opción a comentar (añadiendo # al principio de la línea correspondiente en sendmail.cf) es la siguiente:

Timeout.queuereturn=5d

Esta opción especifica que si el correo no ha podido ser enviado durante 5 días debe ser devuelto a sendmail. Esto puede ser util si estamos enviando los emails a un proveedor y se pierden, con lo que gracias a la devolución podrían ser reenviados, pero en nuestro caso no va a ser necesario pues los mensajes residirán en nuestro disco duro hasta el momento en que los enviemos.

Recordemos que ante cualquier cambio del fichero de opciones deberemos reiniciar sendmail para que los cambios surtan efecto inmediato en el programa sin la necesidad de reiniciar la máquina completa.


RECOGIDA DE CORREO CON FETCHMAIL

Fetchmail es el daemon encargado de la recogida de correo, para posteriormente pasárselo a sendmail, que es quien lo distribuye. La forma más sencilla de configurar fetchmail es creando un fichero .fetchmailrc en nuestro directorio HOME (o en el directorio /root si somos root, de forma que sea root quien recoja el correo y se lo pase al usuario/usuarios que deban leerlo). Dicho fichero tiene un formato como el que sigue:


defaults
fetchall
flush
pass8bits
poll pop.servidor.es
  proto pop3
  user usuario
  pass "password"
  to usuario_local
Las opciones incluidas en este fichero son las siguientes:

defaults: establece los valores por defecto para fetchmail.
fetchall: recoge todos los mensajes pendientes en el servidor de correo.
flush: una vez recogidos los mensajes son borrados del servidor de correo. Para nuestras primeras pruebas es recomendable cambiar este parámetro por keep, para que los mantenga y así no perdamos correo en caso de un error de configuración.
pass8bits: Indica que el mensaje puede contener carácteres de 8 bits (acentos, eñes...).
Bloque poll/proto/user/pass: Indica las características de nuestro servidor de correo. Si disponemos de más de un servidor de correo, se deben incluir tantos bloques de este tipo (repetir la estructura para ambos) como servidores dispongamos.
poll: Indica el servidor de correo entrante (POP o IMAP) de donde leer el correo (como pop.arrakis.es, jet.es, pop.ctv.es, etc.).
proto pop3: Indica que nuestro servidor de correo entrante utiliza POP3 para la recogida del correo (alternativo a IMAP).
user y pass: indican la cuenta del correo y password del usuario en el buzón de correo.
to usuario_local: indica a qué cuenta de usuario se le ha de pasar el correo. Usuario ha de ser una cuenta de nuestro sistema Linux, tales como sromero, root, etc..
Un ejemplo de fichero .fetchmailrc con 2 cuentas en CTV:


defaults
fetchall
flush
pass8bits
poll pop.ctv.es
  proto pop3
  user micuenta1
  pass "mispassword1"
  to sromero
poll pop.ctv.es
  proto pop3
  user micuenta2
  pass "mipassword2"
  to sromero

Como puede verse, gracias a fetchmail podemos recoger el correo de todas las cuentas de correo que tengamos para cada usuario. Si usamos root para conectar a Internet (y lanzar sendmail -q) podemos incluir en el .fetchmailrc de root todas las cuentas de correo de todos los usuarios del sistema, de modo que recojamos el correo de todos los usuarios y le pasemos dicho correo a cada usuario.

Este fichero de configuración debe de tener unos permisos de lectura/escritura 0600, los cuales garantizan que nadie salvo nosotros podrá leer el contenido del fichero, ya que posee nuestro password de correo. Para evitar la lectura de los datos confidenciales por parte de otros usuarios le daremos los permisos apropiados ejecutando la orden chmod:


[root@localhost root]#   chmod 0600 .fetchmailrc

La forma de recoger el correo es, estando conectado, ejecutar la orden "fetchmail". Fetchmail puede ser ejecutado tanto como root como por los usuarios (fetchmail siempre consultará el .fetchmailrc del HOME de quien lo lance, de modo que cada usuario deberá crear su propio fichero de configuración). Para más información, ejecutar <man fetchmail>.

Por último, podemos hacer que fetchmail corra en forma de demonio (el equivalente en MSDOS sería como un programa residente), y que recoja el correo automáticamente cada N segundos, añadiendo la siguiente opción al fichero .fetchmailrc:


set daemon N
(ejemplo: set daemon 300)

Esto hará posible que fetchmail recoja el correo sin necesidad de interacción por nuestra parte, y de una forma automática cada N segundos.

Una vez recogidos los mensajes (ya sea en forma manual o como daemon), éstos son depositados por sendmail en /var/spool/mail/usuario, de manera que puedan ser accedidos por cualquier programa de correo del sistema (mailx, pine, Netscape, etc.), como veremos a continuación.


TRABAJANDO OFFLINE

¿Cuál es la utilidad de los 2 anteriores programas? Una vez configurados e instalados ya podemos utilizarlos en conjunción con nuestro cliente de correo habitual. Supongamos por un momento que este cliente habitual es Netscape Messenger (el más sencillo de utilizar por el momento, aunque el menos potente). Si disponemos de nuestros emails en /var/spool/mail nada nos impide utilizar Netscape para trabajar con ellos, y así de paso trabajar en modo desconectado u offline. Para ello tan sólo hemos de ir a las opciones del programa (Edit->preferences), y modificar los datos que especifican nuestro servidor de correo entrante y saliente.

Para ello vamos a la pestaña Mail & Groups, submenú Mail Server y como Outgoing mail (SMTP) server especificamos localhost, 127.0.0.1 o bien nuestro nombre de máquina (cualquiera de las 3 opciones designa a nuestro ordenador), de manera que al enviar emails con Netscape vayan a parar al directorio /var/spool/mqueue y como nombre de usuario introduciremos el de nuestro usuario local. Esto implica que cuando enviemos un email será sendmail quien se haga cargo de él para que sea enviado en la próxima conexión. Se acabó el hecho de tener que guardar los mensajes para enviarlos uno a uno en la siguiente conexión. Cuando contestamos o escribimos un mensaje, lo enviamos y ya se encargará sendmail de su entrega al servidor de correo de nuestro ISP.

En cuanto a la recogida del correo, como Mail server type especificamos la opción Movemail Application, y seleccionamos Built in, para que utilice la herramienta interna de Netscape para la recogida del correo. Por último como root habremos de cambiar los permisos del directorio /var/spool/mail para que Netscape pueda escribir en ellos:


[root@localhost root]# cd /var/spool
[root@localhost spool]# chmod 01777 mail

Una vez realizado esto, todas las recepciones y envíos se realizan sobre el directorio /var/spool/mail y /var/spool/mqueue, con lo que podremos leer y responder desde Netscape los emails recogidos con fetchmail, y cuyas respuestas serán enviadas por sendmail en la siguiente conexión a Internet.

De la misma manera, podemos especificar localhost como servidor de correo entrante (pop) y saliente (smtp) en otros programas de correo para que accedan a nuestra máquina y podamos trabajar en modo desconectado, como en el programa Kmail incluido en KDE. También podremos especificar directamente como spool de entrada el fichero /var/spool/mail/nuestro_usuario en aquellos clientes de correo que lo permitan (como mutt o kmail).


SENCILLEZ Y VELOCIDAD

Gracias a las herramientas hoy comentadas, realizar el envío y recogida del correo se reduce a llamadas como las siguientes:


[root@localhost root]# pppd
[root@localhost root]# sendmail -q
[root@localhost root]# fetchmail
[root@localhost root]# killall pppd

Tras lo cual (apenas un minuto o dos) ya podremos acudir a nuestro programa de lectura de correo con el fin de responder nuestro email personal.

Otro ejemplo de script de conexión es el siguiente:


pppd file /etc/ppp/options-miproveedor
while !(ifconfig | grep ppp0 ) >/dev/null
do
   sleep 1
   echo -ne "."
done
echo .
sleep 10
echo Conectado.
echo Enviando correo pendiente...
sendmail -q &
echo Recogiendo correo entrante...
fetchmail

Otra opción es incluir las llamadas a las funciones de envío y recogida en el fichero /etc/ppp/ip-up (cuyo contenido se ejecuta automáticamente al establecerse la conexión PPP), de manera que la recogida sea automática al realizarse la conexión. Además, como veremos en la próxima entrega, podremos utilizar procmail para distribuir el correo, de manera que nuestras posibilidades de trabajo con correo se amplien aún más. Las posibilidades de actuación de Linux son infinitas en este campo, pudiendo crear listas de correo, filtros anti-spam, etc.


FINALIZANDO

Gracias a fetchmail y sendmail ahora disponemos de correo offline. Este correo aún puede pasar por una etapa más: la de procesado. Este procesado nos permitirá eliminar el corrreo de determinados remitentes (correo basura y similar), clasificar nuestro correo en diferentes carpetas según su procedencia (para separar listas de correo de nuestro correo personal), etc. Todo eso lo veremos en nuestra próxima entrega con procmail.

Santiago Romero



Volver a la tabla de contenidos.