1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431
|
.de Id
.ds Rv \\$3
.ds Dt \\$4
..
.\"if n .pl +(135i-\n(.pu)
.Id $Id: procmailex.5,v 1.1 2003/06/16 17:06:43 motoki Exp $
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\"
.\" Japanese Version Copyright (c) 2003 Akihiro MOTOKI
.\" all rights reserved.
.\" Translated Mon Jun 23 22:53:33 JST 2003
.\" by Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
.\"
.TH PROCMAILEX 5 \*(Dt BuGless
.rn SH Sh
.de SH
.br
.ne 11
.Sh "\\$1"
..
.rn SS Ss
.de SS
.br
.ne 10
.Ss "\\$1"
..
.rn RS Rs
.de RS
.na
.nf
.Rs
..
.rn RE Re
.de RE
.Re
.fi
.ad
..
.de Sx
.PP
.ne \\$1
.RS
..
.de Ex
.RE
.PP
..
.na
.SH 名前
procmailex \- procmail 設定ファイルの例
.SH 書式
\fB$HOME/.procmailrc の設定例\fP
.ad
.SH 説明
設定ファイル (rcfile) の書式の説明は \fBprocmailrc\fP(5) を参照のこと。
.PP
重みつきスコアリング手法については \fBprocmailsc\fP(5) に詳しい説明がある。
.PP
この manpage は、いろいろなレシピの例を示したものである。 rcfile 全体の例については、 \fBprocmail\fP(1) の \fB備考\fP
の節や、procmail のソース配布に含まれる rcfile のサンプル (procmail*/examples/?procmailrc)
を参照してほしい。
.SH 例
scuba\-dive メーリングリストからのメールをすべて選び出して scubafile と いうメールフォルダに入れる (ロックファイルとして
scubafile.lock を使用する)。
.Sx 3
:0: * ^TOscuba scubafile
.Ex
peter からのメールで、Subject に compilers が入っているものを すべて william に転送する (かつメールのコピーを
petcompil に保存する)。
.Sx 10
:0
* ^From.*peter
* ^Subject:.*compilers
{
:0 c
! william@somewhere.edu
:0
petcompil
}
.Ex
上記と同じことを実現する別の方法:
.Sx 7
:0 c * ^From.*peter * ^Subject:.*compilers ! william@somewhere.edu
:0 A
petcompil
.Ex
同じことを実現できるが、上記の方法より少し動作が遅い方法:
.Sx 9
:0 c * ^From.*peter * ^Subject:.*compilers ! william@somewhere.edu
:0 * ^From.*peter * ^Subject:.*compilers petcompil
.Ex
procmail を使うのがほとんど初めてで、ちょっとだけ試してみたい場合は、 何らかの \fIセーフティネット\fP を設けておくと助かることが多い。
以下の 2 つのレシピを、他のどのレシピより前に入れておくと、 到着したメールのうち常に最新の 32 通を保存することができる。
この機能を働かせるためには、これら 2 つのレシピを追加する前に $MAILDIR に `backup'
という名前のディレクトリを作っておかなければならない。
.Sx 5
:0 c backup
:0 ic | cd backup && rm \-f dummy `ls \-t msg.* | sed \-e 1,32d`
.Ex
使っているメールシステムが、各メールの先頭の `From ' 行を生成しなかったり、 間違った `From '
行を生成したりする場合は、procmail を \-f\- オプションをつけ て呼び出すことでこの問題を修正する (すなわち、正しい `From '
行をつける) ことができる。 この問題を解決する別の方法としては、以下のレシピを rcfile の中で一番最初の
レシピとして入れる方法もある。こうすると、全てのメールのヘッダは formail に よりフィルタリングされる。 formail は、メールの先頭にある
`From ' 行を 取り除いた上で、さらに `From ' 行を自動生成する。
.Sx 2
:0 fhw | formail \-I "From " \-a "From "
.Ex
管理者 (postmaster) 以外から来た全てのメールのヘッダを、(統計をとったり、 メールのデバッグのために)
自分だけのヘッダコレクションに追加するには、 次のように設定する。書きこみ時のロックファイルとして `headc.lock' を
使用する。パイプ処理が完了する前にロックファイルが削除されることがないよ うに、`w' オプションを指定しなければいけない。指定しなかった場合、
パイプが処理対象のメールを受け付けるとすぐに ロックファイルは削除されてしまう。
.Sx 3
:0 hwc: * !^FROM_MAILER | uncompress headc.Z; cat >>headc; compress
headc
.Ex
上記のレシピで compress の代わりに、もっと圧縮率が良い gzip を使用するには 以下のようにすればよい。
.Sx 3
:0 hwc: * !^FROM_MAILER | gzip >>headc.gz
.Ex
1000 バイト未満のメールをすべて自宅のアドレスに転送する (このレシピの場合、ロックファイルは必要ない)。
.Sx 3
:0 * < 1000 ! myname@home
.Ex
surfing メーリングリストのまとめ送りのメールを個々のメッセージに分割して、 メールフォルダ surfing に格納する。ロックファイルとして
surfing.lock を使用する。
.Sx 3
:0: * ^Subject:.*surfing.*Digest | formail +1 \-ds >>surfing
.Ex
postmaster や mailer\-daemon から来た全てのメール(エラーで戻ってきたメールなど) を postm
ファイルに格納する。ロックファイルとして postm.lock を使用する。
.Sx 3
:0: * ^FROM_MAILER postm
.Ex
簡単な自動返信用のレシピ。このレシピは、デーモンからのメール (戻ってきた メールやメーリングリストからのメールなど)
や自分自身からの自動返信のメールには 自動返信しないことを保証している。もしこのような注意を怠ったならば、 (メール ループなど)
大変なことが起こり得る。 このレシピを用いて、受信したすべてのメールに対して自動応答を行うためには、 言うまでもないが、 rcfile
の他の全てのレシピより前にこれを置く必要がある。 実際には、講読しているメーリングリストからのメールを処理するレシピの \fI後ろ\fP
にこのレシピを置くことを推奨する。一般的には、 メーリングリストに対して自動返信を行うのはよい考えではない。 (確かに、正規表現
!^FROM_DAEMON によってそのようなメールはすでに捕まえ られているはずだが、メーリングリストが一般的な慣習に従っていない場合は、
これだけでは \fI不十分\fP だからである。)
.Sx 6
:0 h c
* !^FROM_DAEMON
* !^X\-Loop: your@own.mail.address
| (formail \-r \-I"Precedence: junk" \e
\-A"X\-Loop: your@own.mail.address" ; \e
echo "Mail received.") | $SENDMAIL \-t
.Ex
以下はもっと複雑な自動返信のレシピの例で、有名な \fBvacation\fP(1) プログラムと同じ機能を実現するものである。 このレシピは
(メールループを防ぐなどの) 直前のレシピと同じ方針で作られている。 さらに、このレシピでは送信者の名前を抽出して vacation
データベースを作っており、 名前が新しいものだったときには vacation.cache ファイルにその名前が追加 される
(vacation.cache ファイルは formail により管理されており、 常に最近の送信者名が格納され、ファイルのサイズの上限が約 8192
バイトに なることが formail により保証される)。 新しい送信者名だった場合は、自動応答メッセージが送信される。
.PP
見て分かるように、以下のレシピでは条件の「間」にコメントが 入っている。このようなコメントの入れ方は認められている。
しかし、条件と同じ行にコメントを入れては「いけない」。
.Sx 18
SHELL=/bin/sh # for other shells, this might need adjustment
:0 Whc: vacation.lock
# Perform a quick check to see if the mail was addressed to us
* $^To:.*\e<$\eLOGNAME\e>
# Don't reply to daemons and mailinglists
* !^FROM_DAEMON
# Mail loops are evil
* !^X\-Loop: your@own.mail.address
| formail \-rD 8192 vacation.cache
:0 ehc # if the name was not in the cache
| (formail \-rI"Precedence: junk" \e
\-A"X\-Loop: your@own.mail.address" ; \e
echo "I received your mail,"; \e
echo "but I won't be back until Monday."; \e
echo "\-\- "; cat $HOME/.signature \e
) | $SENDMAIL \-oi \-t
.Ex
TeX に関係する全メッセージを、texmail というディレクトリに、一通毎に別の、 他とは重複しない名前のファイルに保存する
(ここで指定するディレクトリは あらかじめ存在しなければならない)。 この場合、ロックファイルを使用する必要がないので、 レシピでもそうなっている。
.Sx 3
:0 * (^TO|^Subject:.*)TeX[^t] texmail
.Ex
上と同じだが、メールを番号が振られたファイル (MH 形式のフォルダ) に格納する点が異なる。
.Sx 3
:0 * (^TO|^Subject:.*)TeX[^t] texmail/.
.Ex
メールを同時に複数のディレクトリ・フォルダに振り分けることもできる。 以下のレシピは、メールを 2 つの MH 形式のフォルダと 1 つのディレクトリ・
フォルダに振り分ける。実際にはファイルは 1 つ作成されるだけで、追加で ハードリンクが 2 つ作成される。
.Sx 3
:0 * (^TO|^Subject:.*)TeX[^t] texmail/. wordprocessing dtp/.
.Ex
会議 (meeting) に関する全メッセージを月毎に異なるディレクトリに 保存する。例えば、1994 年 1 月だったとすると、フォルダ名は
`94\-01/meeting' という名前となり、ローカルロックファイルは `94\-01/meeting.lock' になる。
.Sx 3
:0: * meeting `date +%y\-%m`/meeting
.Ex
上と同じだが、`94\-01' ディレクトリが存在しなかった場合、 自動的に作成される。
.Sx 9
MONTHFOLDER=`date +%y\-%m`
:0 Wic * ? test ! \-d $MONTHFOLDER | mkdir $MONTHFOLDER
:0: * meeting ${MONTHFOLDER}/meeting
.Ex
上と同じだが、少しだけ違う方法:
.Sx 6
MONTHFOLDER=`date +%y\-%m` DUMMY=`test \-d $MONTHFOLDER || mkdir $MONTHFOLDER`
:0: * meeting ${MONTHFOLDER}/meeting
.Ex
複数のメーリングリストを講読していて、そのメーリングリストのいくつかに クロスポストする人がいる場合、同じメッセージを何回か受け取ることがよくある
(各メーリングリストからは一通だが)。以下の簡単なレシピを使うと、重複した メールを除去することができる。このレシピでは、 formail
を通じて最近受信した メールの Message\-ID を格納する 8KB のキャッシュ・ファイルを作っている。 Message\-ID
は新着メール毎に一意であることが保証されているので、Message\-ID を使うのは重複するメールを除くのにまさにぴったりの方法である。このレシピを
rcfile の一番最初に置くだけで、重複するメールはこのレシピを通過できなくなる。
.Sx 2
:0 Wh: msgid.lock | formail \-D 8192 msgid.cache
.Ex
注意すべきこととして、これより後のレシピで配信に問題があると procmail は
そのメールをキューにもう一度入れようとする。そうすると、次回のキュー処理の 際にこのメールは重複しているとみなされ、なくなってしまう。
自分のスクリプト作成技術にあまり自信がない場合は、代わりに以下のレシピを 使うことができる。このレシピは、重複するメールをどこか捨ててしまうのではなく、
別のフォルダに入れる。もちろん、定期的にこのフォルダを空にするのは、 自分でやらないといけない。
.Sx 5
:0 Whc: msgid.lock | formail \-D 8192 msgid.cache
:0 a: duplicates
.Ex
procmail は MH 形式のフォルダに直接メッセージを配信することができるが、 本物の MH が管理している未読番号 (unseen
sequence) の更新は行わない。 procmail にも未読番号の更新を行わせたい場合は、以下のようなレシピを使うとよい。 この例では、本文に
spam という言葉を含む全てのメールを spamfold という MH フォルダに入れている。ローカルロックファイルが必要な点に注意すること。
なぜなら、MH のプログラム群は番号ファイル (sequences file) のロックを 行わないからである。したがって、番号ファイルを変更する MH
のプログラムが 非同期で複数実行されると、内容がおかしくなったり、いつの間にか変更が失われる
可能性がある。残念ながら、ロックファイルを使ってもこの問題を完全に解決する ことはできない。`show'、`mark' や他の MH
プログラムの実行中に rcvstore が起動されることがあり得るからである。この問題が MH の将来のバージョンで
修正されることを期待しているが、それまでは、番号が失なわれたりおかしく なったりする危険と、未読番号を使う利点を、天秤にかけた上で使わなけらば
ならないだろう。
.Sx 3
:0 :spamfold/$LOCKEXT * B ?? spam | rcvstore +spamfold
.Ex
emacs のメールフォルダ (RMAIL や VM といった emacs 上で動作するメール・ パッケージで管理されているメールフォルダ)
に直接配信する場合、 emacs と 同じロックファイルを使用すべきである。 emacs のメーラーはこの点で少し おかしなところがあり、すでに
emacs の内部バッファに読み込まれている メールフォルダに第三者がメールを配信すると、非常に混乱してしまう。 以下のレシピは $HOME の値が
/home/john の場合の例である。
.Sx 5
MAILDIR=Mail
:0:/usr/local/lib/emacs/lock/!home!john!Mail!mailbox * ^Subject:.*whatever
mailbox
.Ex
別の方法としては、procmail 専用のメールボックスを設け、procmail はそこに メールを配信するようにして、定期的に \fBmovemail\fP
を使ってメールボックスを空にし、内容を emacs メーラーのファイルにコピーする こともできる。 movemail
はメールボックス単位のローカルロックファイル mailbox.lock を使用する。 実のところ、procmail
と一緒に使う場合、この方法を使う方が望ましい。
.PP
メールから特定のヘッダを抽出して環境変数に設定するには、 以下のいずれかの方法も使用することができる。
.Sx 5
SUBJECT=`formail \-xSubject:` # 通常のフィールド FROM=`formail \-rt \-xTo:` # 特殊な例
:0 h # 他の方法 KEYWORDS=| formail \-xKeywords:
.Ex
procmailrc ファイル内で一時ファイルを使っていて、procmail 終了直前に
一時ファイルが確実に削除されるようにするには、以下のようにすればよい。
.Sx 2
TEMPORARY=$HOME/tmp/pmail.$$ TRAP="/bin/rm \-f $TEMPORARY"
.Ex
キーワード TRAP は procmail の終了コードを変更するために使うこともできる。 つまり、通常の終了コードの代わりに終了コード `1' を
procmail が返すように したい場合、以下のようにすればよい:
.Sx 3
EXITCODE=""
TRAP="exit 1;" # 最後のセミコロンは大事である。 exit は独立した
# コマンドではなくシェルのコマンドだからである。
.Ex
終了コードに TRAP から起動されたプログラムの結果を反映させる必要がない 場合は、以下のように書くだけでもよい。
.Sx 1
EXITCODE=1
.Ex
以下のレシピは、受信したメールのうち postscript ファイルと思われるメールを 全部印刷する。
.Sx 3
:0 Bb * ^^%! | lpr
.Ex
次のレシピは同じ動作をするが、もう少し選択条件が厳しくなっている。 print\-server から来た postscript ファイルだけを印刷する。
最初の条件は、ヘッダ内に指定パタンが見つかった場合のみマッチする。 二番目の条件は、メール本文の先頭でのみマッチする。
.Sx 4
:0 b * ^From[ :].*print\-server * B ?? ^^%! | lpr
.Ex
上と同じだが、少しだけ違う方法:
.Sx 7
:0
* ^From[ :].*print\-server
{
:0 B b
* ^^%!
| lpr
}
.Ex
これも同様:
.Sx 4
:0 HB b * ^^(.+$)*From[ :].*print\-server * ^^(.+$)*^%! | lpr
.Ex
メールアカウントを 2つ持っているとしよう。どちらも常時使用しているが、 とても離れた場所にあるとする (つまり、いずれか一方のアカウントに届いた
メールしか読むことができないとする)。アカウント 1 に届いたメールを アカウント 2 に転送し、反対向きも行いたいという状況を考える。
まず思いつくのは、両方のサイトで .forward ファイルを使う方法だが、 もちろんうまく動かない。メールのループが起こってしまうからだ。
このメールのループは、両方のサイトの $HOME/.procmailrc ファイルの先頭に 以下のレシピを入れておくことで避けることができる。
両方のサイトで同じ X\-Loop: フィールドを追加するようにしておけば、 メールはどちらのアカウントからでも安全に
もう一方のアカウントに転送することができるようになる。
.Sx 4
:0 c
* !^X\-Loop: yourname@your.main.mail.address
| formail \-A "X\-Loop: yourname@your.main.mail.address" | \e
$SENDMAIL \-oi yourname@the.other.account
.Ex
誰かが件名に `retrieve' というキーワードを入れたメールを送ってくると、 以下のレシピは自動的に info_file
の内容を送信者に送り返す。 メールを送信するレシピではいつもそうであるが、メールのループが起こらない ように気を付けること。
.Sx 6
:0 * !^From +YOUR_USERNAME * !^Subject:.*Re: * !^FROM_DAEMON *
^Subject:.*retrieve | (formail \-r ; cat info_file) | $SENDMAIL \-oi \-t
.Ex
今度は、メールでアクセス可能な非常に簡単なファイルサーバの例である。 もっと高度な機能が必要な場合には、 \fBSmartList\fP
を調べてみることをお薦めする (SmartList は procmail の配布場所と同じ場所で入手できる)。
以下のリストにあるように、このファイルサーバは一つのリクエストに対し 最大でも一つのファイルしか送り返さない。また、受信したメールの本文は無視され、
Subject: 行は「Subject: send file the_file_you_want」 (空白には意味がある)
という形式になっていなければならない。 ファイルネームがドット (.) で始まるファイルは送り返さないし、
ファイルサーバのディレクトリ・ツリーの外部にあるファイルを 取り出すこともできないようになっている
(この例に手を入れる場合は、この最後の制限項目を不注意で 緩めることがないように気をつけること)。
.Sx 18
:0
* ^Subject: send file [0\-9a\-z]
* !^X\-Loop: yourname@your.main.mail.address
* !^Subject:.*Re:
* !^FROM_DAEMON
* !^Subject: send file .*[/.]\e.
{
MAILDIR=$HOME/fileserver # ファイルサーバのディレクトリに移動
:0 fhw # 返信用ヘッダ作成とファイル名抽出
* ^Subject: send file \e/[^ ]*
| formail \-rA "X\-Loop: yourname@your.main.mail.address"
FILE="$MATCH" # 要求のあったファイル名
:0 ah
| cat \- ./$FILE 2>&1 | $SENDMAIL \-oi \-t
}
.Ex
以下の例は、特定の MIME 形式でエンコードされて届いた plain\-text のメールを、よりコンパクトな 8 ビット形式に前もって変換する。
こうすることで、多くのプログラムで簡単に使用したり表示したり できるようになる。 \fBmimencode\fP(1) プログラムは Nathaniel
Borenstein の metamail パッケージに含まれている。
.Sx 17
:0
* ^Content\-Type: *text/plain
{
:0 fbw
* ^Content\-Transfer\-Encoding: *quoted\-printable
| mimencode \-u \-q
:0 Afhw
| formail \-I "Content\-Transfer\-Encoding: 8bit"
:0 fbw
* ^Content\-Transfer\-Encoding: *base64
| mimencode \-u \-b
:0 Afhw
| formail \-I "Content\-Transfer\-Encoding: 8bit"
}
.Ex
以下の例はあまり見かけないものだが、こんな機能もこともできるという 紹介である。HOME ディレクトリに ".urgent"
という名前のファイルがあり、 そのファイルに (一人の) 人の名前が書かれていて、その人からメールが来た場合、 通常のメールフォルダに入れる代わりに
$MAILDIR/urgent に格納したいとする。 このレシピでそれができる。 (気を付けるべき点として、$HOME/.urgent
のファイルサイズは $LINEBUF より 小さくすべきである。必要なら LINEBUF の値を増やすこと。)
.Sx 5
URGMATCH=`cat $HOME/.urgent`
:0: * $^From.*${URGMATCH} urgent
.Ex
procmail の全く別の使い方として、特定の (外に出ていく) テキストやメールに
条件に応じてフィルタを適用するといった方法がある。代表的な例としては、 外に出ていく全てのメールを通すフィルタで、 必要な場合のみ MIME
エンコードされるようにするものがある。 この場合には、パイプの中段として procmail を起動することになる。
.Sx 1
cat newtext | procmail ./mimeconvert | mail chris@where.ever
.Ex
\fBmimeconvert\fP rcfile には、以下のようなルールが入ることだろう (=0x80= や =0xff= には 実際の 8
ビット文字を入れること):
.Sx 10
DEFAULT=| # いつものようにメールを配信するのではなく
# 標準出力にパイプする
:0 Bfbw
* [=0x80=\-=0xff=]
| mimencode \-q
:0 Afhw
| formail \-I 'MIME\-Version: 1.0' \e
\-I 'Content\-Type: text/plain; charset=ISO\-8859\-1' \e
\-I 'Content\-Transfer\-Encoding: quoted\-printable'
.Ex
.SH 関連項目
.na
.nh
\fBprocmail\fP(1), \fBprocmailrc\fP(5), \fBprocmailsc\fP(5), \fBsh\fP(1), \fBcsh\fP(1),
\fBmail\fP(1), \fBmailx\fP(1), \fBbinmail\fP(1), \fBuucp\fP(1), \fBaliases\fP(5),
\fBsendmail\fP(8), \fBegrep\fP(1), \fBgrep\fP(1), \fBbiff\fP(1), \fBcomsat\fP(8),
\fBmimencode\fP(1), \fBlockfile\fP(1), \fBformail\fP(1)
.hy
.ad
.SH 著者
Stephen R. van den Berg
.RS
<srb@cuci.nl>
.RE
Philip A. Guenther
.RS
<guenther@sendmail.com>
.RE
.\".if n .pl -(\n(.tu-1i)
.rm SH
.rn Sh SH
.rm SS
.rn Ss SS
.rm TP
.rn Tp TP
.rm RS
.rn Rs RS
.rm RE
.rn Re RE
|