メールに通し番号をつける


1. Subject 行にprefix をつける

メールヘッダの Subject 行(件名)にメーリングリスト名と通し番号(prefix)をつけたい場合はメーリングリスト作成時に ezmlm-make の[option] f を付けます.
$ ezmlm-make -f  DIR DOT hoge-MLNAME HOST
とすることによって DIR に prefix ファイルが 作成されます. prefix ファイルを
[hoge-MLNAME] -> [hoge-MLNAME #]
と "#" をつけることによってメールヘッダの Subject 行に 通し番号がつきます. 見え方は以下のとおりです.
Subject: [hoge-MLNAME 29] …

2. さらに上手な通し番号の付け方

上記のように行えば通し番号が Subject 行につく. しかし返信メールを出すと
Subject: Re: [hoge-MLNAME 29] …
というように綺麗に表示されません.これを
Subject: [epnetfan-ml 30]…
と表示させる方法についてこれから述べます. 以下はユーザ epnetfan のメーリングリストの例です. 各ユーザは値を適宜替えて同じように試してみて下さい.

2-1. DOT を編集する

DOT の
|/usr/local/bin/ezmlm/ezmlm-send '/home/hoge/DIR'
行をコメントアウト(# を行頭につける)します. そのかわり
|/home/hoge/prefix.pl hoge-MLNAME '/home/hoge/number' |/usr/local/bin/ezmlm/ezmlm-send '/home/hoge/DIR'
というような行を付け加えます(改行なしの一行で).
prefix.pl:Subject 行を編集するためのスクリプト(最後の付録参照)
number:メーリングリストの通し番号が書かれたファイル

2-2. 使っているメーリングリストの通し番号に合わせて numbur ファイルを書き込む

メーリングリスト管理ディレクトリ DIR の num ファイルの中身は
##:**
というようにコロンをはさんでふたつの数字が記されています. そのうち ## の数字を number ファイルの中身に記入します. 以上により Subject 行に美しく通し番号をつけることができます.

付録

#!/usr/bin/perl
#
#  This is a pert of the Dongury Perl library.
#  Copyright (C) 1999 Dongury Entertainment Corporation
#  All rights reserved.
#
#  Based on the program written by Kyoma TAKAHASHI.
#  Many thanks for his advice!
#
#  prefix.pl		ver 0.3.6
#
########################################################################

$UseLock     = 1;			# True : 1, False : 0
$FormatIndex = 4;			# Index の桁数

########################################################################

sub lock_file {
    local(*FILE) = @_;
    if ($UseLock) {
        eval("flock(FILE, 2)");
        if ($@) {
            return 0;
        }
    }
    return 1;
}

sub unlock_file {
    local(*FILE) = @_;
    if ($UseLock) {
        eval("flock(FILE, 8)");
    }
}

sub increment {
    my ($path) = @_;
    local $num;
    open(INDEX, "+<" . "$path") or return 0;
    if (!&lock_file(INDEX)) {
        close(INDEX);
        return 0;
    }
    chop ($num = <INDEX>);
    $num += 1;
    seek(INDEX, 0, 0);
    print INDEX "$num\n";
    &unlock_file(INDEX);
    close(INDEX);
    return $num;    
}

sub main {
    my ($prefix, $index, $result);

    shift; $prefix = $ARGV[0];
    if (-e $ARGV[1]) {
        $index = &increment($ARGV[1]);
    }
    if ($index) {
        $index = sprintf('%.' . $FormatIndex . 'd', $index);
    }
    else
    {
        $index = "" unless $index;
    }

    while (<STDIN>) {
        chop;
        if (s/^Subject:\s//) {
            s/((\|\s|RE):\s)+/Re: /gi;
            s/^\[$prefix\s?\d+\]\s*//;
            s/Re:\s\[$prefix\s?(\d+)\]\s*/Re:[$1] /g;
            foreach $s (split) {
                if ($s =~ /Re:\[\d+\]/ and $pre =~ /Re:\[\d+\]/) {
                    $pre = $s;
                    $s =~ s/Re://g if (($s =~ /Re:\[/) && (!$` or $` =~ /(Re:)+/));
                    $result .= $s;
                    next;
                }
                $pre = $s; $result .= " $s";
            }
            print "Subject: [$prefix $index]" . $result . "\n";
            last;
        }
        print; print "\n";
    }
    print <STDIN>;
    exit(0);
}

&main;


最終更新日: 2000/10/24(村田泰洋) Copyright (C) 2000 EPnetFaN