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。たぶん物事perlawkものです。

あなたは何かをすることができます

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. while read line...cat ${1:--} > "$infile"標準入力をファイルに保存するだけで使用できますが、なぜループがそんなに遅いのですか?

  3. 変数を使用するときは常に二重引用符で囲む必要があります。たとえば、を使用しない$infile"$infile"ください。

  4. バックティックの代わりに$(...)を使用してください。

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

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

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

    スクリプトは、デフォルト値をオーバーライドするために使用される環境変数を設定する単純なラッパーに置き換えることができます(例えば、ORをgjots2lpr使用するかどうか、使用するPS / PDFビューア、使用する印刷コマンドなど)。a2psenscript

    からgjots2lpr -h

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

テキストファイルの印刷 - 可能であれば、利用可能なプレビューとプリンタダイアログボックスを含むPostScriptまたはPDFを使用します。システムで見つけることができるすべてのユーティリティを見つけて使用します。

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

関連情報