目次
メーリングリスト用引用行数制限フィルタ

1. 概要
 メールボックス容量の制限の厳しいプロバイダを使っている人がメーリングリストのメンバーにいる場合、無駄な全文引用をぶら下げたメールが飛び交うと、メールボックスを早くあふれさせてしまう懸念があります。そうでなくても、無駄な全文引用を嫌う人はいます。
 ここでご紹介するのは、メーリングリストプログラムの前段で引用行数の制限を行うGAWKスクリプトです(UNIX系のOSを使ったサーバで動作します)。このスクリプトは、簡易メーリングリスト用GAWKスクリプト、Majordomo、fmlなど任意のメーリングリストプログラムの前処理フィルタとして使うことができます。

ご注意 無駄な引用を避けるというネチケットがよく守られているメーリングリストには、このフィルタは必要ないものです。システムで制限をかけることでかえって弊害が生じる場合もあります。メーリングリストのコミュニティの性質を考慮せずに興味本位で利用することはお奨めできません。

2. スクリプトの仕様
ファイル名: q-filter (quotation suppressing filter) ダウンロード
(Microsoft Internet Explorerでは、右クリックして「対象をファイルに保存」を選んでください。)

 行頭が「>」である行を引用行と判断し、連続して30行目を超えた引用行を削除して、代わりに警告行を入れます。
> 引用行1行目

> 引用行30行目
-- automatically snipped --
> 引用行31行目
> 引用行32行目

 引用行が30行以内の所で空白行を挟んで新規行を書き込めば、削除は行われません。空白行の所で引用行カウンターがリセットされます。
> 引用行1行目

> 引用行30行目以内

新規行
新規行

> 引用行1行目


 引用行の後ろの方が次の行へ折り返され、折り返しの行頭に「>」がない場合も、引用行の31行目以降は次の空白行の直前まで折り返しもろとも削除されます。
> 引用行1行目
折り返し

> 引用行30行目
折り返し
-- automatically snipped --
> 引用行31行目
折り返し
> 引用行32行目
折り返し

新規行
新規行

 引用行の折り返し(行頭に「>」がない)と新規行とは形の上では区別できないので、30行を超えた引用行の後に空白行を挟まずに書き込んだ新規行は削除されてしまいます。ご注意ください。
> 引用行1行目

> 引用行30行目
-- automatically snipped --
> 引用行31行目
新規行
新規行

 なお、空白行とは文字のない行のことですが、このスクリプトでは、任意個のスペースもしくは水平タブだけがある行も空白行として扱っています。

ご注意 このフィルタを適用すると、メーリングリストに新規に流す情報であっても元が引用行の形になっていれば30行まででカットされてしまいます。それを避けるには、行頭の「>」を一括して別の文字に置き換えるか削除する、あるいは30行以内ごとに空白行を挿入するなどの編集を行う必要があります。

3. 設定方法
 以下の設定は、rootになって行ってください。

(1) GAWKをインストールする
 もしメーリングリストサーバにまだGAWKが入っていなければ、GAWKをインストールしてください。方法については、「簡易メーリングリスト用GAWKスクリプト」をご覧ください。

(2) スクリプトを設定する
 前記2.でスクリプトをダウンロードしたら、それをサーバに置きます。ディレクトリ位置はどこでもかまいませんが、後記(3)のエイリアス設定では、/var/mlistというディレクトリを作ってあってその下に置くと仮定しています。別の場所に置く場合は、エイリアス設定をそれに合わせてください。
 スクリプトファイルのモードは、以下のようにしてください。
chmod 755 q-filter

(3) エイリアス設定を変更する
 /etc/aliasesファイルでのメーリングリストの別名定義がたとえば
friends:    "|/var/mlist/friends.sh"
であった場合、これを以下のように書き換えます(ほかのメーリングリストプログラムの場合は、「/var/mlist/friends.sh」の部分をそれに読み替えてください)。
friends:    "|/var/mlist/q-filter|/var/mlist/friends.sh"

 添付ファイル除去フィルタと併用するには、以下のようにします。
friends:    "|/var/mlist/a-filter|/var/mlist/q-filter|/var/mlist/friends.sh"

 /etc/aliasesファイルの編集が終わったら、
newaliases
を実行してください。これでフィルタが適用されます。

ご注意 事前に、自分だけに配信される試験用メーリングリストに適用してフィルタの動作確認をしておくことをお勧めします。

[付録 A] 改造
(1) 引用行数の制限値を変える
 この引用行数制限フィルタでは、引用行数の制限値を30にしています。これを変えたい場合は、スクリプトの4行目の
  quoted_lines_limit=30
という行の「30」を書き換えてください。

(2) 引用行の条件を変える
 この引用行数制限フィルタでは、行頭が「>」である行を引用行とみなしています。この条件を変えたい場合は、スクリプトの15行目の
  if (match($0, /^>/))
という行を書き換えてください。たとえば以下のような具合です。

任意個のスペースもしくは水平タブの後に「>」が来ても引用行とみなす。
  if (match($0, /^[ \t]*>/))

それに加えて、「>」の代わりに全角の「>」であっても引用行とみなす。
  if (match($0, /^[ \t]*(>|\033\$B!d)/))
このテクニックはむずかしいので、2バイト文字(全角文字)を条件としたい場合はお問い合わせください

 ただし、引用行とみなす条件をあまり広げると、送信者が意図して入れた行が削除対象になってしまう可能性が高くなります。初めからいろいろな形の引用行をカバーしようとするよりも、実際に無駄な引用文を流す人の引用行の形を見てから対処を考えた方がよいと思います。

(3) 本文先頭の見出しの引用がある時のみ引用行数を制限する (2000/10/26追記)
 簡易メーリングリスト用GAWKスクリプトのタイプ3または4を使って、
[friends 123]
[friends 124] (Reply-to-Me-Only)
のような見出しが本文の先頭に自動的に記入されるようにしている場合には、その見出しの引用がある時のみ引用行数が制限されるようにすることができます。そうすれば、すでにメーリングリストで流れているメールの全文引用はカットされる一方、ほかから得た情報を引用文の形で流した場合はカットされずにすみます。
 そのためには、スクリプトの15〜16行目の
  if (match($0, /^>/))
    ++quoted_lines
を以下のように書き換えてください。
  if (match($0, /^>/)) {
    if (match($0, /\[friends [0-9]+\]/))
      suppress=1
    if (suppress)
      ++quoted_lines
  }
friendsの部分を、実際に見出しに表示されるメーリングリスト名に置き換えてください。
 このようにした場合、スクリプトはそのメーリングリスト専用になります。複数のメーリングリストに適用するには、スクリプトファイルを各メーリングリスト用に別々に用意する必要があります。

目次 ホーム