De una impresora virtual PDF al buzón de correo del usuario …

… no hay tanto camino como uno pudiera creer.

Tomando como base las notas que guardo en mi wiki al respecto estoy creando un filtro secundario para utilizarlo en el servidor de impresión de mi trabajo.

Ya tengo un paquete Debian creado al respecto llamado empresa-printers-pdf que arrastra como dependencia a cups y a cups-pdf y lo configura a mi gusto en cuanto a rutas de trabajo y otros parámetros en la creación de los PDF. Como carencia puedo citar que no es muy bueno renumerando los archivos cuando ya existen en el directorio final, pero eso es algo que voy a intentar arreglar hoy.

En la configuración de cups-pdf existe un parámetro especial (PostProcessing) para definir un filtro final de los documentos. Este filtro es invocado con los siguientes parámetros:

  1. Ruta completa del documento PDF
  2. Nombre del usuario que recibe el documento (que a su vez es el que ha creado el trabajo de impresión).

Y es necesario tener en cuenta que el programa funcionará con los privilegios del usuario, por lo que pueden darse comportamientos extraños en su funcionamiento. Y es un detalle importante. Mi problema principal es que algunos usuarios que crean el trabajo sólo existen en un determinado sistema (cosa de las herencias recibidas y demás) y no en el servidor de impresión, por lo que situar documentos PDF en algunos directorios es un lío para que luego los encuentren. Claro, si resulta que soy fulanito en un sistema y tengo dispuesto que mis archivos están en, pongamos por caso, /var/pdf/menganito, pues me costará más llegar a ellos, ¿ no ? Y son usuarios, válgame, no les hagas que cambien un centímetro su forma de trabajar porque implosionan o se desintegran o algo así de truculento.

Si el filtro fuese llamado con mayores privilegios podría simplemente buscar en el nombre de usuario en una tabla e ir copiando o moviendo los documentos de un directorio a otro, incluso a varios si existe una cuenta compartida (que es uno de los casos, curiosamente). No es el caso y no estoy ahora para ir modificando código de terceros que funciona bien.

Pero entonces me dí cuenta de que el envío por correo electrónico, sobre todo si es a cuentas internas, si que está al alcance de cualquier pelado en el sistema. Y aunque el programa que cito de Nickolay Kondrashov está bastante bien lo veo más complejo de lo que yo pretendo, sobre todo en la configuración y que además no tiene la posibilidad de envío a múltiples cuentas. Vale, eso podría hacerse fácilmente con alias de correo, pero como las cuentas corporativas (empresariales más bien, que somos pocos) están en manos de Google, la cosa de los alias se complica más y se vuelve pelín farragosa.

Y ahora que recuerdo hay un detalle más, el programa utiliza un archivo en el directorio donde se depositan los documentos PDF para obtener la dirección de reenvío. No es buena idea porque los homínidos podrán verlo y seguro que lo cambian, lo borran o lo trastocan de alguna forma que luego tendré que arreglar con prisas. Mejor empleo una tabla global y así tampoco pueden enviarse la información a cuentas raras.

He buscado un programa en el sistema que permita realizar envíos de correo con adjuntos y que pueda usarse desde otro con facilidad y he encontrado en el viejo y fiable mailx que puede añadir archivos adjuntos con mucha facilidad.

Los parámetros principales son:

  • -a archivo adjunto
  • -s asunto del mensaje
  • -r dirección de remite
  • dirección o direcciones destino

El cuerpo del mensaje lo lee de la entrada estándar así que, encima, es más sencillo de integrar. Una primera versión sería la siguiente:

#!/bin/bash

#   Variables
VERSION=0.2
MAP=${MAP:-/etc/venexma/cups-pdfmap.conf}
MAILX=$(which mailx)

#   Parámetros
PDF=$1
USER=$2

if [ -z "$PDF" -o -z "$USER" -o ! -r $MAP ]; then 
    PROG=$(basename $0)
    cat >&2 <<EOF

$PROG - $VERSION

Filtro de segundo nivel para enviar los documentos PDF 
creados con cups-pdf a una dirección de correo electrónico. 

uso: $PROG documento_pdf usuario 

El mapa de usuarios se espera en $MAP.

EOF
    exit 1
fi

#   Si no tenemos programa para enviar correo 
if [ -x $MAILX]; then 
    exit 0
fi


#   Localizamos la dirección destino del usuario 
EMAIL=$(grep $USER $MAP | cut -d ":" -f 2)
if [ -n "$EMAIL" ]; then 
    # Preparamos asunto 
    ASUNTO="Impreso: $(basename $PDF)"
    # y despachamos 
    cat <<EOF | $MAILX -s "$ASUNTO" -a $PDF $EMAIL

Adjunto el resultado del trabajo de impresión 
convertido a formato PDF.

--
Su administrador

EOF

fi 


Y funciona estupendamente. Basta con instalarlo en el sistema, en mi caso concreto vía empaquetado Debian, e indicarle a cups-pdf que lo utilice como herramienta de postproceso.

En el archivo /etc/cups/cups-pdf.conf  añadimos la directiva

PostProcessing /usr/bin/cups-pdf2email

y reiniciamos para que lea los cambios (por si acaso).

Un detalle también a tener en cuenta es que el mapa de usuarios debe ser accesible para todos dado que no sabemos qué privilegios se usarán cuando se acceda a él.