誰も作ってくれないようなので自分で作りました。
---^ get_headline.pl
# 文字コードは SJIS でなく EUC でないと苦しい場合があるかもしれません。
$str =<<EOF; # ここにメッセージ本文を置いていろいろお試しください。
TSNET 参加者の皆さん、こんにちは。
さて、8/6 午後 6 - 10 時にかけて、サーバのハードを急遽交換する必要が生
じましたので、断続的にサービスを停止させていただきました。
...
また、先日アナウンスしました、参加している部屋を確認するシステムに関し、
一部不具合が残っています。こちらの復旧は、申し訳ありませんが 3-4 日お待
ちください。
--
本田博通(閑舎)
Hiromichi Honda <raku\@rakunet.org>
EOF
$str = get_headline($str);
print "$str\n";
sub get_headline {
my($line) = @_;
my($i, $second, @lines);
$line =~ s/^\s+//s;
$line =~ s/\r\n/\n/g;
$line =~ s/\r/\n/g;
@lines = split(/\n\n/, $line);
$lines[0] =~ s/^( | )*.{2,20}?(\@|@).[^\n]*(\n|$)//s;
$lines[0] =~ s/^.{10,20}?(です|ます)(\.|。|.)\s*$//;
$lines[0] =~ s/^.*(こんにちは|こんばんは|おはよう|初めまして|はじめまして).*$//s;
for ($i = 0; $i < @lines; $i++) {
$lines[$i] =~ s/^\s+//sg;
1 while (($lines[$i] =~ s/^([\|>#]|>)[^\n]*\n?//sg) or ($lines[$i] =~ s/^.{1,16}(\n|$)//sg));
if ($lines[$i] =~ /^([^\|>#]{2,16}([\|>#]|>)).*\n\1/s) {
$pre = $1;
1 while (($lines[$i] =~ s/^$pre[^\n]*(\n|$)//sg) or ($lines[$i] =~ s/^.{1,16}(\n|$)//sg));
}
$lines[$i] =~ s/(^|\n)--.*//sg;
next if ($lines[$i] =~ /^\s*([OI]n|At) .*wr[io]tes?[.:]\s*(\n|$)/si);
next if ($lines[$i] =~ /\@.*(wr[io]tes?|message)(:|\.$)/);
next if ($lines[$i] =~ /において.*(書き|いい|言い)ました(\.|。|.)?\s*$/s);
next if ($lines[$i] =~ /さん.*\@.*から(\.|。|.)?\s*(\n|$)/s);
next if ($lines[$i] =~ /(^|\n)(From|Date):/si);
next if ($lines[$i] =~ /^\s*$/s);
next if (length($lines[$i]) < 20);
if (length($lines[$i]) < 100) {
$lines[$i] =~ s/\n//sg;
} else {
$lines[$i] =~ s/^\s*//s;
$lines[$i] =~ s/^([^\n]+\n[^\n]+\n[^\n]+).*/\1.../s;
$lines[$i] =~ s/\n//sg;
}
return $lines[$i];
}
}
---$
実行は、
perl get_headline.pl
です。$str の部分にメール本文を入れて試してください。とても完全とはいき
ませんが、8-9 割はうまく取り出せていると思います。改良等あれば追加、修正
してください。
--
本田博通(閑舎)
テキストとスクリプトの http://rakunet.org/TSNET/