mutt から電子メール メッセージを印刷する - 改行を回避するにはどうすればよいでしょうか?

mutt から電子メール メッセージを印刷する - 改行を回避するにはどうすればよいでしょうか?

私は mutt を電子メール クライアントとして使用しており、最近、電子メールの印刷設定を修正することにしました。

Muttprint については知っていますが、使用しないことにしました。次の方法を思いつきました。

では.muttrc、次のものがあります:

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

~/bin/mutt_print.shネットで見つけたものを元にアレンジしたスクリプトは次のとおりです。

#!/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

したがって、メッセージを印刷することに決めた場合、Mutt は Zathura でそれを開き、それを印刷するか PDF として保存することができます。これが私が望む設定です。

grepしかし、以前は行を削除していましたが、必ずしも機能するとは限らないことに気付きましたX-Spam-Status。印刷コマンドに送信される前に行が壊れているように見え、その一部が 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

X-Spam-Status元のメッセージの内容は

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

required=8.0これはとの間で壊れていますtests...

それで、そのラインが壊れないようにするにはどうすればいいのでしょうか?

(スクリプトの改善に関する提案も歓迎します)

答え1

そのX-Spam-Status行は、複数行にまたがる「継続」RFC822 ヘッダーのようです。

ヘッダーは、行の最初の文字が空白以外で始まります。先頭に空白がある非空白行は前の行の続きであり、空白行はヘッダーを終了します。

特定のヘッダーをフィルター処理したい場合は、 よりも RFC822 に対応したものが必要になりますgrep。おそらくperlまたは のawkようなものでしょう。

あなたもそれについて何かできるかもしれない

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

たとえば、a で始まる行をエコーし​​ないX-Spam-Status(フラグを設定する) ようにし、新しいヘッダーに達するまで「継続」行をスキップする (フラグをクリアする) などです。

どちらの場合も、RFC822 ヘッダーのフォーマット方法をプログラムが認識する必要があります。

おそらく、印刷物のヘッダーを本当に気にしているかどうか自問する必要があるだろう。

それでも、フィルターはそれほど難しくない

#!/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 $_;
}

答え2

@infixed が言うように、X-Spam-Status ヘッダーは複数の行にまたがって続きます。

インストールしている場合はprocmail、そのformailユーティリティを使用して継続ヘッダーを連結できます。

からman formail

-c ヘッダー内の継続フィールドを連結します。標準の (行指向の) テキスト ユーティリティを使用してメールを後処理するときに便利な場合があります。

例えば:

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

さらに良いことに、 を使用すれば、formail -Iを必要とせずにヘッダーを削除できますgrep -v

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

-I ヘッダーフィールド

-i と同じですが、既存の同様のフィールドが単純に削除されます。ヘッダーフィールドがフィールド名のみで構成されている場合は、フィールドが実質的に削除されます。


RE: スクリプトの改善:

  1. vimを使う理由(そしてハードコピー) や のようなツールが存在する場合a2ps、どうenscriptなりますか?

    どちらにも、テキストの書式設定や PostScript 出力のためのさまざまな便利なオプションがあります。

  2. stdin をファイルに保存するだけでwhile read line...済むのに、なぜ遅いループを使用するのでしょうか?cat ${1:--} > "$infile"

  3. 変数を使用するときは、常に二重引用符で囲みます。たとえば、 を使用せず$infile"$infile"代わりに を使用します。

  4. バックティックではなく $(...) を使用してください。

  5. このスクリプトは bash 固有の機能を使用しないため、 を使用します#!/bin/sh(または#!/bin/dashインストールされている場合)。

  6. を使用している場合はmkdir -p、ディレクトリがすでに存在するかどうかをテストする必要はありません。 mkdir -pがすでにそれを実行します。

  7. gjots2lprからグジョット2パッケージはスクリプトが実行する機能のほとんどまたはすべてを実行するようです。

    スクリプトは、gjots2lprデフォルトを上書きするために使用する環境変数を設定する単純なラッパーに置き換えることができます (たとえば、a2psまたは のどちらを使用するかenscript、どの ps/pdf ビューアを使用するか、どの印刷コマンドを使用するかなどを指定する)。

    からgjots2lpr -h

使用方法: gjots2lpr [-pt] [ ファイル名 ... ]

テキスト ファイルを印刷します (可能な場合は、PostScript または PDF と、使用可能なプレビューアおよびプリンタ ダイアログを使用します)。システム上で見つかったユーティリティを検索して使用します。

'filename' が指定されていない場合は、STDIN が印刷されます。

関連情報