sábado, 19 de febrero de 2011

E-mail desde la línea de comandos

El correo electrónico se ha convertido en los últimos años en un medio de comunicación muy popular, algo cotidiano. Esto no significa que sea una tecnología reciente, ya que se viene usando durante décadas en Internet -no en vano es uno de sus servicios básicos- e incluso antes de la invención de ésta. La mayoría del gran público lo ha conocido ya en forma de webmail (al estilo de Hotmail o Gmail) y no ha utilizado (o ni siquiera conoce de oídas) aplicaciones de escritorio (los llamados gestores o clientes de correo) como Pegasus Mail, Outlook Express o Mozilla Thunderbird. Menos aún imaginan clientes de correo con una interfaz de usuario en modo texto o incluso de línea de comandos. Y el caso es que existieron, existen y seguirán existiendo al margen de los entornos gráficos y las modas que los afectan.

Sin entrar en debates sobre si el uso actual de estos programas se debe a un alarde de "frikismo", nostalgia o incluso masoquismo, el caso es que parece justo y necesario que estos existan para poder ser utilizados en ciertos entornos y situaciones. Una de ellas, la que ha motivado este post, es la provocada por la necesidad de realizar un envío de mensajes de e-mail de forma no interactiva desde un script. Entonces uno agradece las múltiples utilidades de consola que existen para realizar cualquier tarea imaginable y enviar mail no podía ser menos.

Antes de centrarnos en el ámbito de Unix/Linux, comentar que en Windows también puede hacerse recurriendo a programas como MAILSEND, Send Mail o Bmail o mediante el uso de sencillos scripts en VBS. Todas estas opciones se valoran en este interesante documento web.

En el mundo Linux, por su herencia de Unix, hay también múltiples utilidades y programas que proporcionan distintas soluciones al problema:
  • Una solución clásica sería usar la siguiente combinación software: un cliente de correo de consola como mail (el llamado MUA o "agente de usuario de correo") más un servidor de envío / enrutamiento de correo como exim (el llamado MTA o "agente de transporte de correo") configurado para enviar el correo a través de un servidor externo como puede ser el de Gmail. En el caso de distribuciones de GNU/Linux derivadas de Debian como Ubuntu, sólo habría que instalar el paquete mailutils y proceder a la configuración del servidor como se especifica en este blog.
  • Otra solución más sencilla y por tanto recomendable sería usar un derivado moderno y más potente del clásico programa mail que permita el envío directo a través de servidores SMTP externos y nos ahorre la instalación, configuración y mantenimiento de uno propio en nuestra máquina (exim en la solución descrita anteriormente). Ese programa es el llamado Heirloom mailx, híbrido entre el programa mail y una mejora posterior llamada mailx de la que ha cogido el nombre (también se le conoce como nail, su nombre anterior). En Ubuntu lo podemos instalar mediante el paquete heirloom-mailx. Lo bueno es que se puede configurar, no solo mediante el archivo de configuración estándar definido por la variable de sistema MAILRC, sino mediante el uso de sus propias variables de entorno para hacer una configuración "al vuelo" particular para cada script y que se le pasará ejecutándolo con env como puede apreciarse en el siguiente ejemplo:
#!/bin/bash

usuario_mail="usuario@gmail.com"
contras_mail="LaContraseña"

destinatario="administrador@empresa.com"
asunto="$(basename $0): Aviso importante"
mensaje="Este sería el cuerpo del mensaje"
f_mensaje="/tmp/body.msg"

echo "$mensaje" > $f_mensaje

env MAILRC=/dev/null from="$usuario_mail" \
smtp-use-starttls= smtp=smtp.gmail.com:587 \
smtp-auth=login smtp-auth-user=$usuario_mail \
smtp-auth-password=$contras_mail \
mailx -n -s "$asunto" $destinatario < $f_mensaje
El uso del servidor SMTP de Gmail requiere que tengamos una cuenta de usuario en dicho servicio gratuito (los mensajes se enviarán en nombre de ese usuario) y ha sido elegido, además de por proporcionar un buen funcionamiento (que incluye encriptación mediante TLS), para evitarnos los típicos problemas derivados de usar un servidor SMTP estándar (puerto 25) distinto al del ISP con el que conectemos a Internet.

Cuando necesitemos que un shell script de nuestro sistema (nos) notifique cualquier error o eventualidad vía e-mail no tendremos más que instalar el cliente de correo mailx y adaptar el código anterior para lograrlo. Próximamente publicaré una versión de vigila-wifi que lo incorpora para alertarnos de posibles intrusiones en nuestra red inalámbrica doméstica cuando no estemos en casa...