私は電子メールクライアントとして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 $_;
}