procmailscのヘルプ・マニュアル
日本語 英語
procmailsc --help
man procmailsc
PROCMAILSC(5) PROCMAILSC(5)
名前
procmailsc - procmail の重みつきスコアリング手法
書式
[*] w^x 条件文
説明
レ シピには伝統的な真偽条件を指定できるが、それに加えてマッチする -- あ
るいはマッチしない -- 条件に対して、重みつきスコアリング手法を採り入 れ
る こともできる。レシピに重みつきスコアリング手法を使う場合、あるレシピ
がマッチするということは、その最終スコアは必ず正の値である。
その条件に ‘weight’ 【訳注: 重み】 (w) 及び ‘exponent’ 【訳注: 指 数 】
(x) を置くことで、スコアが適用される。条件(の同一行)に
w^x
を 前 置 す れ ば ス コ ア リ ン グ手法を適用できる。但し、 w 及び x は
-2147483647.0 〜 2147483647.0 の範囲内(両端を含む)の実数である。
重み付き正規表現条件
最初に正規表現を見つけると、スコアに w を加算する。二番目を見つけると、
w*x を加算する。三番目を見つけると、 w*x*x を加算する。四番目を見つける
と、 w*x*x*x を加算する。以下同様。これは以下の簡単な公式で記述できる:
n
n k-1 x - 1
w * Σ x = w * ───
k=1 x - 1
これは上記の条件において n 回マッチする際のスコアの合計を表す。以下の場
合は区別されるので注意されたい:
x=0 最初のマッチのみがスコア w に影響する。後続のマッチは無視される
。
x=1 全てのマッチはスコア w に等しく影響する。スコアはマッチする度毎
にその数に比例して線形的に増加する。
0 L
という条件式は以下のような式でスコアに加算する:
x
/ M \
w * | --- |
\ L /
また:
* w^x < L
という条件式は以下のような式でスコアに加算する:
x
/ L \
w * | --- |
\ M /
両 者共、 L=M であればスコアに w を加算する。しかしながら前者の場合は大
きいメールが有利であり、後者の場合は小さいメールが有利である。 x の値に
よって関数の勾配を微調整することができるが、典型的には x=1 である。
その他
レ シ ピの全ての条件の最終的な合計スコアを問い合わせるには、環境変数 $=
を用いる。この変数は procmail がレシピ内の全ての条件をパースした後は い
つでも参照可能である。 (例えレシピが実行されなかったとしても。)
例
以下のレシピは本文が150行以上のメールを全て捨てる。最初の条件は空の正規
表現を含む。すなわち、この条件は全てにマッチし、予めスコアに負の値の オ
フ セットを与える為に使われる。 2番目の条件はメール中の全ての行にマッチ
し、1行毎に+1ポイントずつ加算することで、直前に設定していた負のオフセッ
ト値を消費する。最後の条件では、メールが150行以上である場合のみにスコア
が正の値になる。
:0 Bh
* -150^0
* 1^1 ^.*$
/dev/null
あなたがいつも真っ先に読む優先度の高いフォルダがあると仮定しよう。次 の
レ シピは重要度の高いメールを抜き出して特別なフォルダに放り込む。最初の
条件は定型的なものであり、スコアには何ら作用しないが、今回のケースに お
い てはこの条件が満たされていなければならない。【訳注: Precedence: 行は
各種メイリングリストや vacation 等の自動応答ソフト等、人手を介さない 配
送 ソフトがメールを配送する際に付加したり、配送すべきか否かを判断するヘ
ッダである。】これ以外の条件は以下のような状況を記 述 す る: John と
Claire はいつも何らかの重要な発言をする。会議は大概重要である。彼らに対
する返答はやや優先する。 Elvis に関するメール (これはあくまでも単なる一
例に過ぎないのであしからず :-) は優先する (更に言えば、そのメールはもっ
と優先するが、 Elvis に割り当てられる特別なスコアは、彼がどれほど頻繁に
言及しても、最大 4000 である)。沢山の引用行は忌み嫌われ、顔マークは評価
される (これらのスコアは最大 3500 に達する)。彼ら3人は通常は興味深い メ
ールを送信しないし、短いメールを好むはずだ (例えば、 2000バイトの長いメ
ールはスコアを -100 、 4000バイトの長いメールはスコアを -800 減じる 。)
。 ご覧の通り、重要でない誰かがメールを送信すると、まだ優先度の高いフォ
ルダに格納される機会がある。例えば、会議に関するメールや、少なくとも2つ
の顔マークを含んでいる場合である。
:0 HB
* !^Precedence:.*(junk|bulk)
* 2000^0 ^From:.*(john@home|claire@work)
* 2000^0 ^Subject:.*meeting
* 300^0 ^Subject:.*Re:
* 1000^.75 elvis|presley
* -100^1 ^>
* 350^.9 :-\)
* -500^0 ^From:.*(boss|jane|henry)@work
* -100^3 > 2000
priority_folder
仮 にあなたがメイリングリストに加入して、そして良質のメールだけを読みた
ければ、以下のレシピが目的に適うはずだ。先ず、当該メールがメイリング リ
ス トからのものであることを確認する。次に、評価に値する意見を述べる重要
人物からのメールであるか、あるいは確実に全ての内容を知りたい表題に関 す
る ものであるかをチェックする。もしそうならば、当該メールを前述のフォル
ダへファイリングする。さもなくば、引用行と原文行の比率が最大 1:2 である
か チェックする。もしこの比率を越えるものであれば、当該メールを捨てる。
これらのテストを通過した全てのメールはファイリングする。
:0
^From mailinglist-request@some.where
{
:0:
* ^(From:.*(paula|bill)|Subject:.*skiing)
mailinglist
:0 Bh
* 20^1 ^>
* -10^1 ^[^>]
/dev/null
:0:
mailinglist
}
更なる実例は procmailex(5) を参照されたい。
警告
重みの順番による検索スピードを高速化させるために、 procmail の 内 部
egrep エンジンは常に最左の 最短のマッチを探す。ただし、変数 MATCH への
割り当てを【訳注: \/によって】行っている最中は、最左の 最長のマッチを探
す。例えば、それ自身による最左の 最短のマッチに用いる正規表現は:
.* は常に同じ点でゼロ長さの文字列にマッチする。
.+ は常に(勿論、改行を除く)任意の1文字にマッチする。
関連項目
procmail(1), procmailrc(5), procmailex(5), sh(1), csh(1), egrep(1),
grep(1),
バグ
もし、長さ条件において、指定した x がオーバフローを起こした場合、 proc-
mail は数学ライブラリの関数 pow(3) のなすがままとなる。
‘工学’フォーマットの浮動小数点数値 (例: 12e5) は認められない。
その他
‘正の極大値’ (2147483647) に到達すると、直ちにそれ以降の 重み付けされた
条件は単純に読み飛ばされる。
‘負の極大値’ (-2147483647) に到達すると、直ちにそれ以降の条件は ‘マッチ
しないもの’ として見倣され、レシピは早々に終了する。
注意
もし、正規表現重み付け公式 0
Philip A. Guenther
BuGless 2003/06/16 PROCMAILSC(5)
PROCMAILSC(5) PROCMAILSC(5)
NAME
procmailsc - procmail weighted scoring technique
SYNOPSIS
[*] w^x condition
DESCRIPTION
In addition to the traditional true or false conditions you can specify
on a recipe, you can use a weighted scoring technique to decide if a
certain recipe matches or not. When weighted scoring is used in a
recipe, then the final score for that recipe must be positive for it to
match.
A certain condition can contribute to the score if you allocate it a
‘weight’ (w) and an ‘exponent’ (x). You do this by preceding the con-
dition (on the same line) with:
w^x
Whereas both w and x are real numbers between -2147483647.0 and
2147483647.0 inclusive.
Weighted regular expression conditions
The first time the regular expression is found, it will add w to the
score. The second time it is found, w*x will be added. The third time
it is found, w*x*x will be added. The fourth time w*x*x*x will be
added. And so forth.
This can be described by the following concise formula:
n
n k-1 x - 1
w * Sum x = w * -------
k=1 x - 1
It represents the total added score for this condition if n matches are
found.
Note that the following case distinctions can be made:
x=0 Only the first match will contribute w to the score. Any sub-
sequent matches are ignored.
x=1 Every match will contribute the same w to the score. The score
grows linearly with the number of matches found.
0 L
will generate an additional score of:
x
/ M \
w * | --- |
\ L /
And:
* w^x < L
will generate an additional score of:
x
/ L \
w * | --- |
\ M /
In both cases, if L=M, this will add w to the score. In the former
case however, larger mails will be favoured, in the latter case,
smaller mails will be favoured. Although x can be varied to fine-tune
the steepness of the function, typical usage sets x=1.
MISCELLANEOUS
You can query the final score of all the conditions on a recipe from
the environment variable $=. This variable is set every time just
after procmail has parsed all conditions on a recipe (even if the
recipe is not being executed).
EXAMPLES
The following recipe will ditch all mails having more than 150 lines in
the body. The first condition contains an empty regular expression
which, because it always matches, is used to give our score a negative
offset. The second condition then matches every line in the mail, and
consumes up the previous negative offset we gave (one point per line).
In the end, the score will only be positive if the mail contained more
than 150 lines.
:0 Bh
* -150^0
* 1^1 ^.*$
/dev/null
Suppose you have a priority folder which you always read first. The
next recipe picks out the priority mail and files them in this special
folder. The first condition is a regular one, i.e., it doesn’t con-
tribute to the score, but simply has to be satisfied. The other condi-
tions describe things like: john and claire usually have something
important to say, meetings are usually important, replies are favoured
a bit, mails about Elvis (this is merely an example :-) are favoured
(the more he is mentioned, the more the mail is favoured, but the maxi-
mum extra score due to Elvis will be 4000, no matter how often he is
mentioned), lots of quoted lines are disliked, smileys are appreciated
(the score for those will reach a maximum of 3500), those three people
usually don’t send interesting mails, the mails should preferably be
small (e.g., 2000 bytes long mails will score -100, 4000 bytes long
mails do -800). As you see, if some of the uninteresting people send
mail, then the mail still has a chance of landing in the priority
folder, e.g., if it is about a meeting, or if it contains at least two
smileys.
:0 HB
* !^Precedence:.*(junk|bulk)
* 2000^0 ^From:.*(john@home|claire@work)
* 2000^0 ^Subject:.*meeting
* 300^0 ^Subject:.*Re:
* 1000^.75 elvis|presley
* -100^1 ^>
* 350^.9 :-\)
* -500^0 ^From:.*(boss|jane|henry)@work
* -100^3 > 2000
priority_folder
If you are subscribed to a mailinglist, and just would like to read the
quality mails, then the following recipes could do the trick. First we
make sure that the mail is coming from the mailinglist. Then we check
if it is from certain persons of whom we value the opinion, or about a
subject we absolutely want to know everything about. If it is, file
it. Otherwise, check if the ratio of quoted lines to original lines is
at most 1:2. If it exceeds that, ditch the mail. Everything that sur-
vived the previous test, is filed.
:0
^From mailinglist-request@some.where
{
:0:
* ^(From:.*(paula|bill)|Subject:.*skiing)
mailinglist
:0 Bh
* 20^1 ^>
* -10^1 ^[^>]
/dev/null
:0:
mailinglist
}
For further examples you should look in the procmailex(5) man page.
CAVEATS
Because this speeds up the search by an order of magnitude, the proc-
mail internal egrep will always search for the leftmost shortest match,
unless it is determining what to assign to MATCH, in which case it
searches the leftmost longest match. E.g. for the leftmost shortest
match, by itself, the regular expression:
.* will always match a zero length string at the same spot.
.+ will always match one character (except newlines of course).
SEE ALSO
procmail(1), procmailrc(5), procmailex(5), sh(1), csh(1), egrep(1),
grep(1),
BUGS
If, in a length condition, you specify an x that causes an overflow,
procmail is at the mercy of the pow(3) function in your mathematical
library.
Floating point numbers in ‘engineering’ format (e.g., 12e5) are not ac-
cepted.
MISCELLANEOUS
As soon as ‘plus infinity’ (2147483647) is reached, any subsequent
weighted conditions will simply be skipped.
As soon as ‘minus infinity’ (-2147483647) is reached, the condition
will be considered as ‘no match’ and the recipe will terminate early.
NOTES
If in a regular expression weighted formula 0
Philip A. Guenther
BuGless 2001/08/04 PROCMAILSC(5)