私は電子メールクライアントとして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:スクリプトの改善:
vimを使う理由(そしてハードコピー
a2ps
)ツールはいつ好きでenscript
存在しましたか?どちらもテキストとPostScriptの出力形式を指定するのに便利なさまざまな便利なオプションを提供します。
while read line...
cat ${1:--} > "$infile"
標準入力をファイルに保存するだけで使用できますが、なぜループがそんなに遅いのですか?変数を使用するときは常に二重引用符で囲む必要があります。たとえば、を使用しない
$infile
で"$infile"
ください。バックティックの代わりに$(...)を使用してください。
このスクリプトは bash 関連の機能を使用しないため、代わりに使用します
#!/bin/sh
(または#!/bin/dash
既にインストールされている場合)。を使用している場合は、
mkdir -p
ディレクトリがすでに存在するかどうかをテストする必要はありません。mkdir -p
すでに完了しました。gjots2lpr
~からジョッツ2パッケージは、スクリプトが実行するタスクのほとんどまたはすべてを実行するようです。スクリプトは、デフォルト値をオーバーライドするために使用される環境変数を設定する単純なラッパーに置き換えることができます(例えば、ORを
gjots2lpr
使用するかどうか、使用するPS / PDFビューア、使用する印刷コマンドなど)。a2ps
enscript
から
gjots2lpr -h
:
使用法:gjots2lpr [-pt] [ファイル名...]
テキストファイルの印刷 - 可能であれば、利用可能なプレビューとプリンタダイアログボックスを含むPostScriptまたはPDFを使用します。システムで見つけることができるすべてのユーティリティを見つけて使用します。
「filename」が指定されていない場合は、STDINが印刷されます。