Añadir firmas de correo automáticamente en Postfix

En la actualidad, estoy a cargo del sitio de la empresa de mi madre, que más bien es una empresa familiar donde cada uno ayuda cuando y como puede. El sitio tiene muy poco flujo y comparte servidor con la Comunidad de Laravel en Español. Para los que no saben, este servidor es un VPS alojado en DigitalOcean en el cual tengo instalado zPanel, un panel de web-hosting gratuito  – creo que ya está muerto, ahora existe un fork llamado Sentora -. Pero bien, el tema puntual era que mi madre y las otras persona con las que trabaja, no tenían una firma oficial de la empresa y cada uno se creaba la suya, a gusto propio. Me encargó la tarea de poder tener una firma con el mismo formato para todos. Ella lo veía simple, crear la firma y ya está… pero yo no. En el caso de mi madre, ella utiliza el cliente de correos de su celular, el cliente de correos en su portátil y el cliente web cuando está en otra computadora. Como ella no es muy amiga de la tecnología, no puedo sólo enviarle el HTML de la firma y decirle “ahí va la firma, mamá, la configuras y ya está“. De seguro me llamaría devuelta diciendo que no tiene idea de como hacer eso y que vaya a la casa cuando pueda a ayudarle y configurar sus 3 clientes de correo. Si multiplicamos eso por la cantidad de gente que trabaja en la empresa, se convierte en un infierno.

Como no es primera vez que me sucede algo así, me puse a investigar una forma en la que nadie tenga que configurar nada y que toda la magia se produzca en el servidor. Si alguien de la empresa envía un correo, éste llega al servidor, identifica al remitente, busca la firma correspondiente y la añade al final del mensaje. Recuerdo haber intentando hacerlo hace unos 6 meses, pero luego de investigar un par de días no encontré nada de información útil como punto de partida. Pero como ahora ya me lo estaban pidiendo, no quedó remedio que darle otra vuelta o perder mucho tiempo configurando clientes de correos de cada una de las personas que trabaja con mi madre.

EL PASO A PASO PARA LOGRAR LA MARAVILLA

Antes de empezar, aclarar que los pasos aquí detallados fueron probados en CentOS, pero deberían funcionar en cualquier otra distribución.

PASO 1: INSTALAR ALTERMIME

Sin alterMIME nada hubiese sido posible, es éste el que se encarga de modificar el mensaje y agregar la firma correspondiente.

sudo yum -y install altermime

Necesitamos crear un usuario y directorio para alterMIME:

useradd -r -c "Postfix Filters" -d /var/spool/filter filter
mkdir /var/spool/filter
chown filter:filter /var/spool/filter
chmod 750 /var/spool/filter

PASO 2: DEFINIR LOS CORREOS QUE VAN A TENER FIRMAS

Vamos a generar un archivo de texto donde en cada línea irán los correos a los cuales deseamos añadir de manera automática su firma correspondiente:

sudo touch /etc/postfix/signature_addresses

Una vez creado el archivo, se deben agregar los correos, debe verse algo así – bastante simple -:

niko@empresa.com
juan@empresa.com
paulina@otra-empresa.com

Si se dan cuenta, puede ir cualquier correo de cualquier dominio que el servidor de correos controle.

Nos queda modificar los permisos para que alterMIME pueda acceder al listado:

sudo chgrp filter /etc/postfix/signature_addresses
sudo chmod 750 /etc/postfix/signature_addresses

PASO 3: GENERAR LAS FIRMAS (HTML Y TXT)

Como ya definimos que correos se van a ver afectados por una auto-inserción de firmas, debemos ahora agregar esas firmas. Como bien saben los correos pueden ir tanto en HTML como en texto plano, por lo que debemos definir una firma para cada uno de los casos.

Vamos a crear la carpeta en donde irán las firmas:

sudo mkdir /etc/postfix/signatures
sudo touch /etc/postfix/signatures/default.txt
sudo touch /etc/postfix/signatures/default.html

Aparte de crear el directorio, también hemos creado dos archivos vacíos, que vendrían siendo los fallback en el caso de que alterMIME encuentre que el correo que se está enviando es uno de la lista que definimos más arriba, pero por algún motivo no tiene un archivo de firma. Entonces, en esos casos, va a utilizar el archivo default ya sea en HTML o texto plano. En mi caso puntual, yo generé una firma general sin datos personales y sólo con datos de la empresa de mi madre, por si en algún momento pasaba lo ya mencionado.

Bien, entonces, tomando un correo de ejemplo de los que puse en la lista, bastaría generar un archivo en formato .html .txt con la dirección de correo electrónica completa. Si alterMIME identifica el correo niko@empresa.com va a buscar en el directorio de firmas un archivo llamado niko@empresa.com.html niko@empresa.com.txt. Se repite la lógica para todos los otros correos.

Después de haber agregado las firmas pertinentes, aplicamos permisos:

sudo chgrp filter -R /etc/postfix/signatures
sudo chmod 750 -R /etc/postfix/signatures

Es muy importante que cada vez que agreguen nuevos archivos con firmas a este directorio, ajusten los permisos con los dos comandos de arriba, de lo contrario, no se podrán leer los archivos y las firmas no serán agregadas.

PASO 4: EL SCRIPT QUE HACE LA MAGIA

Ya tenemos la lista de correos y las firmas creadas. Ahora falta el “cerebro” que se encargue de todo, por lo que vamos a crear el siguiente archivo:

sudo touch /etc/postfix/signature

Y dentro, irá el siguiente script en bash, el cual fue robado prestado y modificado para hacerlo calzar con mi caso de uso en particular:

#!/bin/sh
# Localize these.
INSPECT_DIR=/var/spool/filter
SENDMAIL=/usr/sbin/sendmail.postfix
SIGNATURE_ADDRESSES=/etc/postfix/signature_addresses
SIGNATURE_FOLDER=/etc/postfix/signatures

# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15

# Start processing.
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit
$EX_TEMPFAIL; }

cat >in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; }

# Checks if exists a signature for the user. If a signature can't be
# found, it will return the "default" signature file (html or txt)
function check_signature () {
    if [ -e "${SIGNATURE_FOLDER}/$1.$2" ]; then
    echo "${SIGNATURE_FOLDER}/$1.$2"
else
    if [ "$2" == "txt" ]; then
        echo "${SIGNATURE_FOLDER}/default.txt"
    else
        if [ -e "${SIGNATURE_FOLDER}/$1.txt" ]; then
            echo "${SIGNATURE_FOLDER}/$1.txt"
        else
            echo "${SIGNATURE_FOLDER}/default.html"
        fi
    fi
fi
}

# Get "From" address. Thanks to: http://www.shellhacks.com/en/RegEx-Find-Email-Addresses-in-a-File-using-Grep
from_address=`grep -m 1 "From:" in.$$ | grep -oP "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b"`

if [ `grep -wi ^${from_address}$ ${SIGNATURE_ADDRESSES}` ]; then
    # Get the corresponding signature files
    signature_file_html=$(check_signature ${from_address} "html")
    signature_file_txt=$(check_signature ${from_address} "txt")
    /usr/bin/altermime --input=in.$$ \
    --disclaimer=$signature_file_txt \
    --disclaimer-html=$signature_file_html || \
    { echo Message content rejected; exit $EX_UNAVAILABLE; }
fi

$SENDMAIL "$@" <in.$$
exit $?

Una vez guardado el archivo, nuevamente como en los casos anteriores, debemos aplicar los permisos correspondientes:

sudo chgrp filter /etc/postfix/signature
sudo chmod 750 /etc/postfix/signature

PASO 5: AVISARLE A POSTFIX DE ESTOS CAMBIOS

Ya tenemos todo listo, ahora nos resta modificar la configuración de Postfix para que empiece a trabajar con el filtro de alterMIME que acabamos de crear. Para ello, primero vamos a hacer una copia de la configuración actual en modo de respaldo:

cp /etc/postfix/master.cf /etc/postfix/mastercf.orig

Ahora vamos a editar el archivo /etc/postfix/master.cf, donde van a encontrar algo como esto – o muy similar -:

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd -o content_filter=spamassassin

Justo debajo de smtp – que viene siendo la primera línea no comentada del archivo – vamos a agregar lo siguiente:

-o content_filter=dfilt:

Quedando así:

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd -o content_filter=spamassassin
-o content_filter=dfilt:

Luego, agregamos lo siguiente al final del archivo:

# altermime: signatures
dfilt     unix    -       n       n       -       -       pipe
      flags=Rq user=filter argv=/etc/postfix/signature -f ${sender} -- ${recipient}

Finalmente guardamos y reiniciamos Postfix con el comando /etc/init.d/postfix restart. Ya pueden hacer pruebas enviando un correo electrónico y revisando que efectivamente se haya adjuntado la firma correspondiente.

REFERENCIAS

How to Add Different Disclaimers using alterMIME and Postfix based on Domain | Gyp the Cat dot Com

Automatically Add Disclaimers To Outgoing Emails With alterMIME On Fedora 8

Anuncios

6 comments

  1. Hola. Este es un artículo digno de un crack, solo me faltaría una cosa para resolver un problema semejante al tuyo. Sabes si hay alguna manera de utilizar varias firmas por una misma dirección de correo electrónico? Es decir, si yo agrego al final el código firma_en que la inserte en inglés, o firma_es la inserte en español?

    Me gusta

    1. Podrías ocupar un placeholder al final de la firma, y en el script Bash identificar si contiene el sufijo “en” o “es” y dependiendo de eso agregar el contenido del archivo que corresponde. Gracias por tu comentario.

      Me gusta

        1. Habría que modificar la lógica del script, no te podría decir algo en palabras simples. De todas formas necesito hacer algo similar a lo tuyo, quizás pronto ponga una nueva versión para poder hacer ese remplazo. Saludos.

          Me gusta

    1. Hola, he ocupado el traductor de Google para entenderte, jajaja. Si ocupas Roundcube y sólo tienes acceso a esa herramienta, vas a tener que configurar la firma cuenta por cuenta, no vas a poder hacer algo automatizado como lo que yo expliqué en este post.

      Saludos.

      Me gusta

Deja un comentario (puedes utilizar Markdown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s