Imprimir mensajes de correo electrónico desde mutt: ¿cómo evitar saltos de línea?

Imprimir mensajes de correo electrónico desde mutt: ¿cómo evitar saltos de línea?

Utilizo mutt como cliente de correo electrónico y recientemente decidí arreglar mi configuración de impresión de correo electrónico.

Conozco Muttprint, pero decidí no usarlo. Se me ocurrió lo siguiente.

En .muttrc, tengo:

set print_command="grep -v X-Spam-Status | $HOME/bin/mutt_print.sh"

El ~/bin/mutt_print.shguión, que adapté de cosas que encontré en la red, es este:

#!/bin/bash

PDIR="$HOME/tmp/mutt_print" 
OPEN_PDF=zathura

# create temp dir if it does not exist
if [ ! -d "$PDIR" ]; then
    mkdir -p "$PDIR" 2>/dev/null
    if [ $? -ne 0 ]; then
        echo "Unable to make directory '$PDIR'" 1>&2
        exit 2
    fi
fi

infile="`mktemp $PDIR/mutt_XXXXXXXX.txt`"
tmpfile="`mktemp $PDIR/mutt_XXXXXXXX.ps`"
outfile="`mktemp $PDIR/mutt_XXXXXXXX.pdf`"

echo "infile = $infile"
echo "tmpfile = $tmpfile"
echo "outfile = $outfile"

while read line
do
  echo "$line" >> $infile
done < "${1:-/dev/stdin}"

echo "running vim $infile -c \"hardcopy > $outfile | q\""
vim $infile -c "hardcopy > $tmpfile | q"
echo "running ps2pdf $tmpfile $outfile"
ps2pdf $tmpfile $outfile

read
$OPEN_PDF $outfile >/dev/null 2>&1 &
sleep 1
rm $infile $tmpfile $outfile

Entonces, cuando decido imprimir un mensaje, Mutt lo abre con Zathura y puedo imprimirlo o guardar el PDF; esta es la configuración que quiero.

Sin embargo, noté que aunque solía grepeliminar la X-Spam-Statuslínea, no siempre funciona: a veces el me gusta parece estar roto antes de enviarlo al comando de impresión, y parte de él se muestra en el PDF:

Date: Wed, 11 May 2016 21:17:14 −0300
From: John Doe <[email protected]>
To: my-email@here
Subject: Re: blah
tests=FREEMAIL_FROM,HTML_MESSAGE,RDNS_NONE,T_DKIM_INVALID

La X-Spam-Statuslínea en el mensaje original era

X-Spam-Status: No, hits=2.4 required=8.0 tests=FREEMAIL_FROM,HTML_MESSAGE,RDNS_NONE,T_DKIM_INVALID

que se divide entre required=8.0y tests....

Entonces, ¿cómo puedo evitar romper esa línea?

(También agradezco cualquier sugerencia de mejora del guión)

Respuesta1

Parece que esa X-Spam-Statuslínea es un encabezado RFC822 "continuo" que abarca varias líneas.

Un encabezado comienza con un espacio sin espacios en blanco en el primer carácter de una línea. Una línea que no está en blanco con un espacio en blanco al principio es una continuación de la línea anterior y una línea en blanco finaliza los encabezados.

Si desea filtrar un encabezado en particular, necesitará algo más compatible con RFC822 que grep. Quizás una cosa perlo awk.

Incluso podrías hacer algo al respecto en ese

while read line
do
  echo "$line" >> $infile
done < "${1:-/dev/stdin}"

como no repetir una línea que comienza con a X-Spam-Status(y establecer una bandera), luego omitir las líneas 'continuas' hasta llegar a un nuevo encabezado (y borrar la bandera).

De cualquier manera, es necesario que el programa sea consciente de cómo se formatean los encabezados RFC822.

Tal vez necesites preguntarte si realmente te importa tanto ese encabezado en tu impresión.

Aun así, un filtro no es tan difícil.

#!/user/bin/perl

my $skip=0;

# First do the headers
while(<STDIN>)
{
        #Test for end of headers
        if(/^\s*$/)
        {
                #copy the header ending blank
                printf $_;

                #exit the while loop
                last;
        }

        #Starts with non whitespace, new header
        $skip = 0 if /^\S/;

        #skip stuff if its the header we don't want
        $skip = 1 if /^X-Spam-Status/i;

        #copy lines if we're not skipping
        print $_ if !$skip;
}

# now the rest of the file
while(<STDIN>)
{
        #copy lines
        print $_;
}

Respuesta2

Como dice @infixed, el encabezado X-Spam-Status continúa en varias líneas.

Si lo ha procmailinstalado, puede utilizar su formailutilidad para concatenar encabezados continuos.

De man formail:

-c Concatenar campos continuos en el encabezado. Puede resultar útil al posprocesar correo con utilidades de texto estándar (orientadas a líneas).

Por ejemplo:

set print_command="formail -c | grep -v X-Spam-Status: | $HOME/bin/mutt_print.sh"

Aún mejor, puedes utilizar formail -Ipara eliminar un encabezado, sin necesidad de grep -v:

set print_command="formail -I X-Spam-Status | $HOME/bin/mutt_print.sh"

-I campo de encabezado

Igual que -i, excepto que cualquier campo similar existente simplemente se elimina. Si el campo de encabezado consta únicamente de un nombre de campo, efectivamente elimina el campo.


RE: mejoras al script:

  1. ¿Por qué usar vim (ycopia impresa) ¿Cuándo gustan a2psy enscriptexisten las herramientas?

    Ambos tienen todo tipo de opciones útiles para formatear el texto y la salida postscript.

  2. ¿Por qué el while read line...bucle lento cuando puedes usarlo cat ${1:--} > "$infile"para guardar la entrada estándar en un archivo?

  3. Coloque siempre comillas dobles alrededor de las variables cuando las utilice. por ejemplo, no use $infile, use "$infile"en su lugar.

  4. Utilice $(...) en lugar de comillas invertidas.

  5. El script no utiliza ninguna característica específica de bash, así que úselo #!/bin/sh(o tal vez #!/bin/dashsi lo tiene instalado).

  6. Si está utilizando mkdir -p, no necesita probar si el directorio ya existe. mkdir -pya lo hace por ti.

  7. gjots2lprdesde elgjots2El paquete parece hacer la mayor parte o la totalidad de lo que hace su script.

    Su secuencia de comandos podría reemplazarse con un contenedor simple gjots2lprque establezca las variables de entorno que usa para anular los valores predeterminados (por ejemplo, para indicarle si usar a2pso enscript, qué visor ps/pdf usar, qué comando de impresión usar, etc.).

    De gjots2lpr -h:

Uso: gjots2lpr [-pt] [nombre de archivo...]

Imprime un archivo de texto, si es posible utilizando Postscript o PDF y visores previos disponibles y diálogo de impresora. Busca y utiliza cualquier utilidad que pueda encontrar en el sistema.

Si no se proporciona 'nombre de archivo', se imprime STDIN.

información relacionada