これは maildrop利用者の助けとなればと思い作成した文書である。 maildropは文法が一般に普及してるプログラミング言語であるC言語や Java、 Perl に近く、一般のプログラマーにとって理解しやすいと考えられる。 また、maildropは他のMDA(メール配送エージェント)と違い近代的な Maildir ファイル名命名規則を使っておりファイル名の衝突によるメールの消失が 非常に起きにくくなっている。 さらに、maildropのソースコードは洗練されていて非常に読みやすく、 それだけでプログラムにあるバグの量は少ないように思われる。 しかし、これだけの利点を持ちながらmaildropは日本で普及しているとは言いがたい。 そして、これには日本語のドキュメントの不足が原因であると思い、 この文章を認めた次第である。
maildropによる振り分けルールの例を示す。
まず、maildropを使うようにする設定について述べる。 maildropはSendmail, Postfix, qmailのローカル配送エージェントから呼び出すように する必要があり、次のような設定を.forward(Sendmail,Postfix)あるいは.qmail(qmail) に書く必要がある。 /usr/local/bin/maildropにmaildropがある場合は次のように記述する。
SenamailやPostfixの場合: ~/.forwardに次のように記述する。 -- "|/usr/local/bin/maildrop" -- qmailの場合: ~/.qmailに次のように記述する。 (chmod go-rwxする必要がある) -- |/usr/local/bin/maildrop --
次に、以下の振り分けルール例の前に~/.mailfilterに定義しておくべきルールを示す。
maildropはDEFAULTやMATCHなど予約されている変数の他は
自由に変数を定義することができる。
以下ではMAILDIR変数を自分のホームディレクトリ下のMaildirディレクトリに設定し、
MAILDROP変数をホームディレクトリ下の.maildropディレクトリに指定している。
そして、MAILDROP変数はその下のログファイル指定時に利用している。
その下のlogfileというコマンドは引数としてファイル名をとって、
そのファイルにmaildrop実行時のログを吐かせることができる。
ちなみにshellやPerlと同じで#以下の文はコメントとして扱われる。
なお、.mailfilterのパーミッションはchmod 600 (あるいは、chmod go-rwx)
しておかないとmaildropが異常終了するので注意すること。
MAILDIR="$HOME/Maildir/" # MAILDIR変数として$HOME/Maildir/を設定
DEFAULT=$MAILDIR
MAILDROP="$HOME/.maildrop/" # MAILDROP変数として$HOME/.maildrop/を設定
logfile "${MAILDROP}maildrop.log" # ログの出力先を設定
maildropの振り分けルールは正規表現で記述できる。
例えば次のルールはToやCcにFreeBSD-users-jp@jp.FreeBSD.orgが含まれている
場合にマッチしてMaildir形式のディレクトリである
Maildir/.FreeBSD-users-JP/ディレクトリ下にメールを保存する。
なお、マッチングルールに付いている:hというのはヘッダーのみにマッチする
ということを示していて、toというのは引数のディレクトリ、あるいは
ファイルにメールを格納してマッチングを打ち切ることを示す。
ちなみにtoの代わりにccと書くとマッチングを打ち切らずに下のルールに付いて
も評価を行う。
# FreeBSD-users-jp
if (/^(To|Cc):.*FreeBSD-users-jp@jp.FreeBSD.org/:h)
{
to "$MAILDIR.FreeBSD-users-JP/"
}
メーリングリストによってはList-IdやSenderがヘッダに入っている場合があるが、
これの振り分けルールは次のようになる。
maildropのルールはshellのように"\"によって折り返したり、
PerlやC言語のプログラムのように||や&&で条件のorをとったりandをとったり
することができる。
下記のプログラムはList-Idにfreebsd-announce.freebsd.orgを含むものか
Senderにowner-announce-jp@jp.FreeBSD.orgを含むものにマッチし、
マッチしたものはMaildir/.FreeBSD-announce/以下に配送される。
# FreeBSD-announce
if (/^List-Id:.*freebsd-announce.freebsd.org/:h \
|| /^Sender: owner-announce-jp@jp.FreeBSD.org/:h)
{
to "$MAILDIR.FreeBSD-announce/"
}
同様にして送信者による振り分けも可能である。
下記の例はmailman-owner@freebsd.orgから来たメールを
Maildir/.FreeBSD.mailman/ディレクトリ下に配送する。
if (/^From: mailman-owner@freebsd.org/:h)
{
to "$MAILDIR.FreeBSD.mailman/"
}
ディレクトリ名やファイル名を書くところに『! メールアドレス』と書くことで
転送が行える。
下記の例はfoo@example.ne.jpにメールを転送し、
Maildir/にも配送するという例である。
これは、~/.forwardに『\ユーザー名,foo@example.ne.jp』と記述した場合と
同じ意味になる。
cc "! foo@example.ne.jp" to "$MAILDIR"
HOME: ホームディレクトリを示す DEFAULT: デフォルトの配送先を示す
DEFAULT="$HOME/Maildir/"
to "配送先" cc "配送先"これらの違いはtoの場合は指定された配送先に送り、そこから下に書いてある処理を 行わないのに対し、ccの場合は指定された配送先に送った後に下に書いてある 処理を続けるということだ。C言語やJavaのプログラムで例えると、 次のようにいえるかも知れない。
to: send("配送先");return;
cc: send("配送先"); /* 終了せず、続きを実行 */
この配送先はファイル、ディレクトリ(Maildir形式)、メールアドレスが選べる。
ファイル、ディレクトリの場合は配送先
としてファイル、ディレクトリの名前を書き、メールアドレスの場合は
配送先として"!メールアドレス"と
最初に!を付けて記述する。
cc "/var/mail/yanagisawa"
cc "${HOME}/Maildir/"
cc "! yanagisawa@example.com"
悪い例: if (...) { # if文と同じ行に{がある cc "example@example.org" to "example@example.gr.jp" } else { # elseと{や}が同じ行にある to "example@example.net" } 良い例: if (...) { cc "example@example.org" to "example@example.gr.jp" } else to "example@example.net"CプログラマはK&R風にif (...) {と同じ行にifと{とを書きたい所ではあるが、 これをやるとエラーになる。 ちなみに、C言語やJavaなどと同じで、if文のbodyが1行の場合は{}を省略する事ができる。
例: メールヘッダにループチェックのためのフィールドを追加する
MAIL_ADDRESS="example@example.co.jp"
LOOP_CHECK_FIELD="X-LOOP-CHECK: $MAIL_ADDRESS"
if (/^$LOOP_CHECK_FIELD/:h) # ループしていたら配送せず捨てる
to "/dev/null"
xfilter "reformail -A'$LOOP_CHECK_FIELD'"
bogofilterはC言語で書かれた高速に動作する Bayesian Spam Filter (ベイズ統計学を利用した迷惑メールフィルター)である。 そして、利用できるアルゴリズムの数は他のベイズ統計学を利用した フィルターと遜色が無い。 しかし、日本語の単語をトークンとして認識してくれないため わかち書きをして日本語の単語をトークンとして認識させる必要がある。
Bayesian Spam Filterを使う場合はどのソフトでも
まずspamと非spamの登録を行う。
登録の仕方は英文メールに対するbogofilterの使い方と
わかち書きを行うという箇所が異なっている。
そして、それは次のように行う。
Spamの登録: ((t)cshの場合) まず、Spam_dirの下にこれまで受け取ったspamを1メール1ファイルに分割して入れる。 - Spam_dirの下に移動 % cd Spam_dir - Spam_dirのファイルをわかち書き後、bogofilterに投入 % foreach i (*) > cat $i | nkf -Zme | kakasi -wakati | bogofilter -sv > end 以上でSpamの登録は完了である。 非spamの登録: ((t)cshの場合) まず、NonSpam_dirの下にこれまで受け取ったspamではないメールを1メール1ファイルに 分割して入れる。 - NonSpam_dirの下に移動 % cd NonSpam_dir - NonSpam_dirのファイルをわかち書き後、bogofilterに投入 % foreach i (*) > cat $i | nkf -Zme | kakasi -wakati | bogofilter -nv > end 以上で非spamの登録は完了である。
#!/bin/sh
BOGOFILTER="/usr/local/bin/bogofilter"
BOGOFILTER_OPTION="$*"
NKF="/usr/local/bin/nkf"
NKF_OPTION="-Zme"
WAKATI="/usr/local/bin/kakasi -wakati"
cat | ${NKF} ${NKF_OPTION} | ${WAKATI} \
| ${BOGOFILTER} ${BOGOFILTER_OPTION}
NKF="/usr/local/bin/nkf"
NKF_OPTION="-Z -mS -e"
FORMAIL="/usr/local/bin/reformail"
WAKATI="/usr/local/bin/kakasi -wakati"
BOGOFILTER="/usr/local/bin/bogofilter"
BOGOFILTER_OPTION="-e -p -u"
BOGOHEADER=`${NKF} ${NKF_OPTION} | ${WAKATI} \
| ${BOGOFILTER} ${BOGOFILTER_OPTION} \
| ${FORMAIL} -X '^X-Bogosity:'
xfilter "${FORMAIL} -i '${BOGOHEADER}'"
if (/^X-Bogosity: Yes/:h)
{
to "迷惑メール用メールボックス"
}
なお、chasenやmecabをわかち書きに使用したい場合や
本サイトで配布しているbigram.plを使用したい場合は
上記のWAKATIの箇所をそれぞれ次のように書き換えれば良い。
Chasenの場合: WAKATI="/usr/local/bin/chasen -F "%m " Mecabの場合: WAKATI="/usr/local/bin/mecab -O wakati" bigram.plの場合 WAKATI="/bigram.plを保存したpath/bigram.pl"ちなみにbogofilterのオプションである-eはエラーが起きなかった場合に 終了コードに0を返すというオプションで、-pは入力されたメールに bogofilterのヘッダをつけて出力するオプションであり、 -uは今回のメールを判定結果に基づきデータベースに登録するという オプションである。
xfilter "/<check_uri.plを置いた場所>/check_uri.pl"例えば、/usr/local/bin/check_uri.plに置いた場合は次のように設定する。
xfilter "/usr/local/bin/check_uri.pl"
if (/^X-URIRBL: Yes,/:h)
{
to "迷惑メール用メールボックス"
}
CLAMSCAN="clamdscan"
`${CLAMSCAN} - `
if ($RETURNCODE == 1)
to "ウィルス感染メール用メールボックス"
これは、ウィルスに感染していた場合にclamdscanが終了コード1で終了する事を
利用している。
なお、toで指定する宛先を/dev/nullとしておくと、メールを自動的に捨てる事ができる。
FORMAIL="/usr/local/bin/reformail"
SCANHEADER="X-Virus-Scan"
CLAMSCAN=clamdscan
GREP=grep
SED=sed
TMPFILE="$$_$TIME.tmp"
`$CLAMSCAN - > /tmp/$TMPFILE || true`
SCANSTATUS=`cat /tmp/$TMPFILE | ${GREP} 'stream' | \
${SED} "s/stream/$SCANHEADER/"`
`rm /tmp/$TMPFILE`
xfilter "${FORMAIL} -i '$SCANSTATUS'"
if (! /^${SCANHEADER}: OK/)
to "ウィルス感染メール用メールボックス"