委員会概要 各種申請 サービス サポート リンク
マニュアル BBS FAQ 管理者各位 リサーチ

Procmail


 
1.Procmailの説明

Procmail(プロックメール)』は、メールサーバが受信したメールを特定のルールにより振り分けたり、フィルタリングしたりするソフトウェアです。

簡単なレシピ(一連の設定のこと)を記述しておくだけで、題名や差出人ごとに振り分け、転送、SPAM(迷惑)メールの削除等を行う事ができます。

目次へ戻る
 
 
2.設定ファイルの書き方

ホームディレクトリに「.procmailrc」というファイルを作り、目的別に以下のレシピを記述してください。2つ以上のレシピを書くこともできます。

注意:はじめに「.」が記述されているファイルは特別な意味があり、通常の「ls」では表示されません。そのため、これらのファイルを表示させたい場合は「ls -a」としてください。

  • 転送のためのレシピ

メッセージをコピーし、そのコピーを転送します。この場合、転送先と共用計算機(ruby)にメールが残ります。cをつけなければ共用計算機(ruby)にメールは残りません。

:0 c
* ! ^X-Loop: [自分のメールアドレス]
! [転送したいアドレス]

例:

:0 c
* ! ^X-Loop: yskhashi@club.kyutech.ac.jp
! yskhashi@example.com

 

題名やあて先により、転送するかどうかを決めることもできます。
その場合、:0 c の下に、

* ^To: [あて先アドレス]
* ^Subject: [題名]

例:

* ^To: yskhashi@club.kyutech.ac.jp
* ^Subject: kinkyu renraku

を追加してください。
 

あて先アドレスは、自分あてのメールを転送したいなら、

[ユーザー名]@club.kyutech.ac.jp

例:
yskhashi@club.kyutech.ac.jp

 

メーリングリストに届くメールを転送したいのなら、

[メーリングリスト名]@club.kyutech.ac.jp

例:
admin@club.kyutech.ac.jp

としてください。

 

  • SPAMメールの削除・振り分けレシピ

もし、SPAMメールが届いた場合、

メールのヘッダが X-SPAM: Spam.

Subjectが ***SPAM*** [元のSubject]

となって届きます。それを利用して削除や振り分けを行うレシピを紹介します。

注意:まれに、SPAMメールでもこれらの記述が無かったり、普通のメールがSPAMと誤認識されることがあります。

 

  • SPAMメールが来たらそのまま削除する

    SPAMが届いた場合、その場で削除します。この場合、メッセージは復元不可能となりますので、後述の別ディレクトリに格納する方法を使うことをお勧めします。

    :0
    * ^X-SPAM: Spam.*

    * ^Subject: \*\*\*SPAM\*\*\*.*
    /dev/null

    ※ 「\」は*を文字として認識させるために必要です。


     

  • 別ディレクトリに格納する
  • 別ディレクトリに格納する場合は以下のように記述して下さい。この場合、ファイル名は連番形式でつけられます。 /の後ろの「.」を忘れずに書いて下さい。

    :0
    * ^X-SPAM: Spam.*
    * ^Subject: \*\*\*SPAM\*\*\*.*
    spam/.

    メールディレクトリにspamというディレクトリを作ってパーミッションを変更します。

    % mkdir ~/Mail/spam
    % chmod 700 ~/Mail/spam

    この場合Mewで閲覧するには、起動後にgを押しspamと入力することでそのディレクトリ内のメールをみることができます。

目次へ戻る
 
 
3.動作を有効にする設定

ホームディレクトリに「.forward」というファイルを置き、

"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #[ユーザー名]"

と記述してください。

注意: " も必要です。[ユーザー名]のところには、 共用計算機(ruby)のアカウントを書いて下さい。

例:

"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #yskhashi"

以上の記述が終わりましたら、情報科学センター等の端末からメールを送信して正常に動作するか確認してください。

もし、正しくメールが送れなかった場合は、.forwardを一度消すか、.forward.oldなどに変更して.procmailrcのレシピをみなおして下さい。

その後、もう一度.forwardを作成してテストしてみて下さい。

注意:.forwardをおいたまま.procmailrcを編集した場合、メールが正しく配送されない可能性があります。

目次へ戻る
 
 
4.もっと詳しく知りたい人のために

レシピの書き方

ホームディレクトリに.procmailrc というファイルを置き、レシピを記述する事により設定を行います。これには、複数のレシピを記述することができ、一つのレシピは「:0」で始まり、「:0」かファイル終端(EOF)で終わります。
また、行頭に "#"を記述することで、コメントを記述することもできます。

レシピには大別して3つの事を記述します。
  • フラグ    :Procmailにメッセージを渡す方法を指定
  • 条件文    :処理を行うメッセージを特定
  • アクション  :条件に該当した場合に行う処理

これとは別に、基本ヘッダというものがありますが、こちらで設定していますので特に記述する必要はありません。

  • フラグ
  • フラグにはメッセージを処理する際のProcmailへのメッセージ(メール)の渡し方を記述します。フラグの記述には以下のものがあります。

    H 記述が省略された場合の動作。メッセージのヘッダだけを条件文に渡し、検査する。
    B メッセージの本文だけを条件文に渡し、検査する。
    A 同じブロックレベルに記述されたAや、aの用いられてないレシピが該当した場合にだけ検査する。
    a Aと同様だが、手前のレシピが正しく実行された場合にだけ検査する。
    E Aの逆。手前のレシピが実行されなかった場合にだけ検査する。
    e aの逆。手前のレシピが失敗した場合に検査する。
    h アクション部にヘッダだけを渡す。
    b アクション部にメッセージの本文だけを渡す。
    f パイプをフィルタとみなす。つまり、前処理ができる。
    c メッセージのコピーを残す。これがなければ、元のメール加工してしまうため、次の処理の為に必要である。また、転送する際にもコピーを残しておかなければ、メールは転送先にのみ残る。
    w 指定されたフィルタやプログラムが終了するまで待機し、処理に失敗した場合には検査を行わない。
    W wと同じだが、処理に失敗しても検査する。
    i あらゆる書きこみエラーを無視して検査する。
    hb なにも書かない場合の動作。アクション部にメッセージのヘッダと本体の両方を渡す。

    フラグに続いてロックファイルを指定すると、あるメッセージに対して複数の処理が同時に行われないようにします。指定の仕方はフラグの最後にスペースをつけて:[ロックファイル名]です。このロックファイル名は省略することができ、省略した場合は自動的につけられます。

    例:

    :0 HBDhc :lock.txt
    * ^HOGE
    | tar zcf hoge.tar.gz

    「lock.txt」があればそれをロックファイルとしてロックし、メールのヘッダ・本体を問わずある一行の行頭が「HOGE」で始まるメールを受信すると、メッセージをコピーしつつ、ヘッダ部分だけを圧縮する。

     

  • 条件文
  • 条件文はフラグに続く、行頭が「*」で始まる行を指します。条件は正規表現によって記述し、省略可能です。省略した場合は無条件でアクション部が実行されます。また、複数の条件文を記述することも可能で、その場合は全ての条件を満たしている時にのみアクションが実行されます。条件文の記述には以下のものがあります。

    ! 条件の否定。条件を満たさなかった時に実行する。
    $ 条件文に現れる環境変数をシェルの様に評価する。
    ? 指定したプログラムの終了コードを利用する。(0:成功、1:失敗)
    < 長さが後に記述されたバイト数(10進)以上であれば実行する。
    > 長さが後に記述されたバイト数(10進)以下であれば実行する。
    変数名 ?? 指定された値と変数を比較する。
    \ クォートする。\/と記述することで該当個所を変数MATCHに格納する。

    例:
    HOGE=HOGEHOGE
    GA=GAGAGA
    CHECK=yes
     
    :0 B : ロックファイルは省略。メッセージ本体だけを検査。
    * ! ^$HOGE 行頭に「$HOGE」という文字がない。(*のあとに$が書かれていないので)
    * $ ^$GA 行頭に「GAGAGA」と書かれている。
    * ? test -f $HOME/anti_hoge ホームディレクトリに「anti_hoge」というファイルがある。
    * < 5000 メッセージ本文が5000バイト以下。
    * > 4900 メッセージ本文が4900バイト以上。
    * $CHECK ?? yes  変数「CHACK」が「yes」のメッセージを探す。
    * ^ADDR *\/.* 「ADDR」に続く空白文字の後に記述された文字列を変数「MATCH」に格納。
    | echo "$MATCH" >> anti_hoge 変数「MATCH」を「anti_hoge」に書き足す。

     

  • アクション
  • 全ての条件を満たした場合に実行される内容を一行で記述する。

    ! 指定されたアドレスに転送。スペースで区切る事により列挙可能。
    | メッセージを他のプログラムに渡す。
    {..} メッセージにあたらしい条件文を付加したい時や、複数のアクションを実行したいときにカッコでくくる。
    ファイル名 メッセージをファイルに格納する。ロック指定を忘れずに。
    ディレクトリ名 メッセージにユニークなファイル名をつけてディレクトリに格納。
    ディレクトリ名/. メッセージをディレクトリに連番形式で格納。
    /dev/null メッセージを廃棄。復元不可。

    これらの記述をうまく利用すると、さまざまな動作をさせることが可能となります。

目次へ戻る
 

Topへ戻る


(C) 2004 九州工業大学 学生自治ネットワーク委員会
K.I.T. Student Administered Network Commission