19 October '2003 - 00:39 | 雑記 yample
何年も前に procmailrc をなくして以来、あれをまた書くのは面倒くさすぎるってことで、その手のもは長らく使ってなかった。メーラでルールを書いたって、たかが知れてるしね。 が、今日見つけた yample というのは、一見したところ設定ファイルは procmailrc よりもだいぶ簡単に見えるし、なんとなく試してみることにした。おれ、新しもの好きだし。で、さっそく必要なモジュールをインストールして、設定ファイルを書いて実験してみると、動作はいいんだけれど、ひとつ気に入らないことを見つけてしまった。気づかなければよかったのに。
というのも、なんと、Maildir/new にコピーされたファイル名のうち、gethostname() になるべきところが hostname -s になっていたのだ。おいおい、ちゃんと仕様書を読めっての。
まぁ、NFS とか使わないし、いいっちゃいいんだけれど、気持ち悪いのでさっそく直すことにした。って、直すんじゃなくて、使うのをやめればいいんだけれど。べつに必要ないのだし。
とりあえずコードを見てみると、それは Mail::Audit ってやつがやってるらしいことが分かったので、そいつを見てみる。あったあった。ふーむ。hostname からドメイン部分をワザと消してやがる。まったく。さくっとハック。
そういえば、ファイル名の配送識別子が常に _1 だったので、かち合ってないなら _1 はなくてもいいじゃんか、ってことで、そいつもついでにハック。
てな感じでつらつらコードを読んでたら、もうひとつ発見。なんか、何も考えずに使いたかったのに… ま、perl のコードなんて長らく読んでないし書いてないし、たまにはいっか。
で、発見したのは、なんと、tmp にファイルを作って、new に移動するときに、また一からユニークなファイル名を生成していることだった。うーむ。Maildir の意味分かってんのかなぁ。分かってないんだろうなぁ。というわけで、これもハック。
<%= pre '
--- Audit.pm.orig Sun Mar 3 09:11:20 2002
+++ Audit.pm Sat Oct 18 00:34:36 2003
@@ -14,7 +14,7 @@
use File::Basename;
use Mail::Internet;
use Mail::Audit::MailInternet;
-use Sys::Hostname; (my $HOSTNAME = hostname) =~ s/\..*//;
+use Sys::Hostname; (my $HOSTNAME = hostname);
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $ASSUME_MSGPREFIX);
# @ISA will depend on whether the message is MIME; if it is, we\'ll be MIME::Entity. if not, we\'ll be Mail::Internet.
use Fcntl \':flock\';
@@ -481,11 +481,12 @@
_log(3, "will write to @_");
# since mutt won\'t add a lines tag to maildir messages, we\'ll add it here
- unless (length $self->get("Lines")) {
- my $num_lines = @{$self->body};
- $self->head->add("Lines", $num_lines);
- _log(4,"Adding Lines: $num_lines header");
- }
+# unless (length $self->get("Lines")) {
+# my $num_lines = @{$self->body};
+# $self->head->add("Lines", $num_lines);
+# _log(4,"Adding Lines: $num_lines header");
+# }
+ # since i do not see the point, i comment out the above lines
if ($maildir_time != time) { $maildir_time = time; $maildir_counter = 0 } else { $maildir_counter++ }
@@ -502,8 +503,9 @@
$file =~ s/\/$//;
my $msg_file;
- do { $msg_file = join ".", ($maildir_time, $$ . "_$maildir_counter", $HOSTNAME); $maildir_counter++; }
- while ( -e "$file/tmp/$msg_file" );
+ $msg_file = join ".", ($maildir_time, $$, $HOSTNAME);
+ while ( -e "$file/tmp/$msg_file" )
+ { $msg_file = join ".", ($maildir_time, $$ . "_$maildir_counter", $HOSTNAME); $maildir_counter++; }
# todo: consider sleeping. mengwong 20020116
$tmp_path = "$file/tmp/$msg_file";
@@ -530,14 +532,10 @@
foreach my $file (my @maildirs = @_) {
$file =~ s/\/$//;
- my $msg_file;
- do { $msg_file = join ".", ($maildir_time=time, $$ . "_$maildir_counter", $HOSTNAME); $maildir_counter++; }
- while ( -e "$file/new/$msg_file" );
-
# auto-create the maildir.
if (my $mkdir_error = mkdir_p(map { "$file/$_" } qw(tmp new cur))) { _log(0, $mkdir_error); next; }
- my $new_path = "$file/new/$msg_file";
+ (my $new_path = $tmp_path) =~ s/tmp/new/;
_log(3,"maildir: hardlinking to $new_path");
if (link $tmp_path, $new_path) { $success_count++; }
'%>
ふむ。これで満足。
って、肝心の rules の方は、まだ一行しか書いてなかった。なんだそれ。