
私は 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 出力のためのさまざまな便利なオプションがあります。
stdin をファイルに保存するだけで
while read line...
済むのに、なぜ遅いループを使用するのでしょうか?cat ${1:--} > "$infile"
変数を使用するときは、常に二重引用符で囲みます。たとえば、 を使用せず
$infile
、"$infile"
代わりに を使用します。バックティックではなく $(...) を使用してください。
このスクリプトは bash 固有の機能を使用しないため、 を使用します
#!/bin/sh
(または#!/bin/dash
インストールされている場合)。を使用している場合は
mkdir -p
、ディレクトリがすでに存在するかどうかをテストする必要はありません。mkdir -p
がすでにそれを実行します。gjots2lpr
からグジョット2パッケージはスクリプトが実行する機能のほとんどまたはすべてを実行するようです。スクリプトは、
gjots2lpr
デフォルトを上書きするために使用する環境変数を設定する単純なラッパーに置き換えることができます (たとえば、a2ps
または のどちらを使用するかenscript
、どの ps/pdf ビューアを使用するか、どの印刷コマンドを使用するかなどを指定する)。から
gjots2lpr -h
:
使用方法: gjots2lpr [-pt] [ ファイル名 ... ]
テキスト ファイルを印刷します (可能な場合は、PostScript または PDF と、使用可能なプレビューアおよびプリンタ ダイアログを使用します)。システム上で見つかったユーティリティを検索して使用します。
'filename' が指定されていない場合は、STDIN が印刷されます。