Mew 用 bogofilter 呼び出しスクリプトの書き直し

以前の記事、「bogofilter を正しく使おう」で書いた Mew 用判定スクリプトですが、高速化のために書き直しました。kakasi、nkf を perl のモジュールとして使用して全て perl で処理するようにしたのです。すると何と実行時間が 1/3 に短縮されました。

perl からこれらを使うために kakasi は Text::Kakasi を、nkf はソースを展開した後の NKF.mod サブディレクトリ以下にあるモジュールをインストールする必要があります。cygwin 上で特に特別なオプションをつけることなくコンパイル、インストールができました。

#!/usr/bin/perl
use Email::MIME;
use NKF;
use Text::Kakasi;
local $/;
my $k = Text::Kakasi->new;
$k->set("-w");
LOOP: foreach $filename (@ARGV)  {
open(I, $filename) || next LOOP;
my $message = <I>;
my $parsed = Email::MIME->new($message);
my @parts = $parsed->parts;
$message = nkf("-e", $parsed->_headers_as_string . "\n");
foreach my $p (@parts) {
if ($p->content_type =~ /text/i) {
$message = $message . nkf("-e", $p->body);
}
}
my $tokenized = $k->get($message);
open(O, "| bogofilter") || die("can't execute bogofilter");
print O $tokenized;
close(O) && print "$filename\n";
close(I);
}

稀におかしな形式のメールを処理するときに Email::MIME モジュールから Carp::croak が呼ばれて die してしまいやり残しのメールが出てしまうのですが、どうしたのものか考え中です。


2007. 2. 14 追記:

eval を使えば die をトラップできるというところまで調べました。ただ、綺麗に書ける自信なしです。


2007. 6. 16 追記:

内容を修正して改訂版を作っていますのでこちらを参照ください。