POP3/APOP によるメイルチェッカー IPv6 対応

現在位置のナビ

トップコンピュータの国フリーソフト → POP3/APOP によるメイルチェッカー

説明

POP3/APOP プロトコルで リモートPOPサーバ上のメイルの有無をチェックするプログラム biffpop ver.1.5 & BiffPop Ver.J0.4.6 です。

C 言語版の方は、2003年6月27日にIPv6アプリコンテスト2003事務局 の方からコンテスト参加のお誘いをいただいたので出品しました。

詳細

wmpop3 に不満があったので、自分で改造してしまいました。 変更点は以下の通りです。

機能強化1 複数のPOP サーバにアクセスする。

一つの設定ファイルに複数のPOPサーバを記述できるようにしました。 設定ファイルは、biffpoprc を参考にして 記述してください。 デフォルトでは、$HOME/.biffpoprc を設定ファイルとして読みこみます。

機能強化2 サブジェクト表示機能

メイルヘッダの From: Subject: を表示できるようにしました。 C 版には MIME のデコード機能は無いので、

% biffpop -s | nkf -m

と nkf で MIME のデコードをすることをお勧めします。

Java 版は iso-2022jp だけ MIME のデコードをします。

届くメイルを観察すると、変なコーディングの Subject: を見掛けます。 MIME のルール通りにエンコーディングを指示できないものや、 JIS コードを送るのに q エンコーディングを選択しているものなどです。

特に SPAM にそのような傾向が強いですね。 これは個人的な想像ですが、 日本の SPAMMER はエンコードに不慣れな US の SPAMMER から メイル送信ツールをもらっているのではないでしょうか。

機能強化3 例外処理強化

エラーに強くなりました。 biglobe の POP サーバが LAST コマンドに応答しないので、 その対策もいれてあります。

機能強化4 APOP対応

haru@erl.ee.musashi-tech.ac.jp さんの APOP 拡張も組み込んであります。 遅くなりましたが、APOP の試験をしました。問題なさそうです。

Linux をインストールしたままで POP サーバに使っている場合は、 注意してください。 Linux に付属の POP デーモンは機能的には APOP をサポートしているのに、 APOP 用のパスワードが設定されていないことが多いです。 biffpop は APOP が使えるかどうかをデーモンの応答から自動判別しますので、 パスワードが設定されていない POP デーモンとも APOP で接続しようとします。 そのような時は、 コンフィグレーションファイルで inhibitAPOP の値を 1 に設定してください。

機能強化5 分離した本体とGUI

お待たせしました。GUI が付きました。Tcl/Tk で78行です。 Tcl/Tk の入門書を買って数時間で作った GUI なので、 たいしたものではありません。

機能強化6 IPv6 対応

C 版だけ IPv6 に対応しました。 メイルチェッカとしては世界初かも知れません(笑)。 最初に IPv6 で接続を試みて、失敗したら v4 で接続します。 IPv6 対応のコードは、Linux 依存かも知れません。

機能強化7 Kill List

私宛にウィルスメイルをほぼ毎日送って来る人がいて、 本人、 プロバイダの postmaster、 サポートの全部に連絡をとったのに、全然改善されません。 仕方がないので、メイルヘッダが正規表現にマッチしたら、 メイルを削除するオプションを作りました。 Java版は検索はできますが、削除機能はありません。

コンフィグレーションファイルで、 サーバーの設定部分に以下の記述を追加してください。

killPattern 正規表現

正規表現がメイルヘッダのどれかの1行とマッチしたら、 そのメイルを削除すべきと判断します。 -s オプション付きで表示したときは、マッチしたメイルの通し番号の直後に K の文字が表示されるだけで、削除は行いません。 -k オプション指定で起動したときは、 マッチしたメイルの From: Subject: Message-Id: を表示した後に、 削除するかどうか聞いて来ます。 ここで削除を選択すると、メイルはサーバーから削除され、 From: Subject: Message-Id: がログファイル $HOME/.biffpopkillog に記録されます。 正規表現は、サーバーごとに別の指定ができます。 一つのサーバーに複数の指定もできますし、全く指定しなくてもかまいません。 複数指定した場合、メイルヘッダの各行について全部の正規表現と比較し、 一つでもマッチしたら削除の対象とします。 指定しない場合は、そのサーバーのメイルは削除しません。

マッチングはサーバーから送られた直後のデーターに対し、 MIME デコードを行う前に実行されます。 したがって、"Subject:.*未承諾広告" のようなパターンを指定しても無駄です。 "未承諾広告"に相当する base64 パターンを指定するのは、有効です。

コンフィグレーションファイルの 読み込みルーチンで手抜きをしているので、 正規表現の途中にスペースやタブを含むことができません。 全体をクォートで囲ってもだめです。

C言語版の機能は、 GNU 正規表現ライブラリとコンソールの RAW モードを使用しています。 このへんは、OS 依存で関数が異なるので、 自分のマシンで動作しない場合は環境に合わせて書き換えるか、 Makefile 中の KILLLIST 定義を外してください。

正規表現は、C言語版では GNU ライブラリの、 Java 版ではクラスライブラリの制限を受けます。 GNU ライブラリの方は固定文字列を渡すとマッチしないので、 メタキャラクタを最低一つ含むようにしてください。 grep と同じ感覚で使うと失敗します。 Java 版は、パターンがメイルヘッダのどれか一行と、 先頭から末尾まで一致する必要があります。 部分文字列とマッチさせることはできません。

機能強化8 SSL 対応

C 版だけ SSL に対応しました。 コンフィグレーションファイルで

useSSL 1

と指定すると SSL で接続します。

Java 版も SSL を試験しているのですが、 "The Java Developers Almanac 1.4" の e499 を真似してコーディングすると、 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: End user tried to act as a CA というエラーが出てしまいます。 原因がわかる方がいらっしゃいましたら、ご連絡ください。

BUG1 デーモンモードの動作

デーモンモードの動作で、問題になりそうなところがあります。 デーモンモードでは、 前回のチェックと比較してメイルの数 に増減があるとメッセージを表示します。 どこかのサーバーでメイルの増加があると、ベルを鳴らします。 このロジックだとサーバーにメイルが3通たまっていたとして、 チェックとチェックの間にメイルを2通読んで、新たに2通届くと、 3通で変わらないためメールの増減は無いものと判断されてしまいます。 これを検出するためには、前回のメイルとヘッダを比較しなければなりません。 比較作業は面倒なので、その機能は作っていません。

追加 Java 版もあります

Java にも移植してみました。 これでプラットフォーム非依存で動作します。 ただし、制限もあります。 Java インタープリタの制約により IPv6 は使えません。 SSL は動作していません。 まだまだ完成度が低いので、こちらはバージョン J0.4.6 です。

注意 他人があなたになりすましてメイルを送信する危険性

biffpop は、定期的に POP プロトコルでメイル情報を取得します。 メイルサーバーが POP before SMTP で送信者の認証を行っていて、 biffpop が動作するマシンで他人のプロセスが動作できる場合、 他人があなたになりすまして偽のメイルを送信する危険があります。 あなたの使用するマシンとメイルサーバーとの間に NAT によるアドレス変換がある場合、 状況はさらに複雑になります。

C版のコンパイルオプション

C版をコンパイルするときの注意点について書きます。

現在の Makefile には、以下の三つのマクロ定義が書かれています。

  • -DIPv6
  • -DKILLLIST
  • -DUSE_SSL

-DIPv6 は IPv6 で接続するコードを含むかどうかの指定です。 普通の Linux では指定してかまいませんが、 Linux 以外の unix では IPv6 関係のコードに互換性が無いかもしれません。 互換性が無かった場合は、自分で書き直すか-DIPv6 を外してください。

-DKILLLIST は、 正規表現にマッチしたヘッダーを持つメイルを削除する機能を指定します。 削除実行時には、biffpop が対話的に削除の許可を求めてきます。 このときターミナルを RAW モードにしてキー入力をチェックしています。 RAW モードは unix の種類によってコードが異なるので、 コンパイルに通らなかったら -DKILLLIST を外してください。 こちらも Linux ならば問題なくコンパイルできるでしょう。

-DUSE_SSL は、SSL でサーバと接続できるようにします。 この機能は openssl のライブラリを必要とします。 自分の接続するPOPサーバーがみな SSL に対応していない場合は、 -DUSE_SSL を外してもかまいません。 リンク時の -lssl オプションも -DUSE_SSL オプションと関連しています。 外すときは両方共外してください。

コンフィグレーションファイルの書きかた

コンフィグレーションファイルは、 以下のブロックを1組以上書きます。

start アカウント名
様々な指定
end

アカウント名は、メイルスプールにつけるニックネームです。 biffpop が動作したときに、複数のスプールを区別するために命名します。

様々な指定は POP でサーバーと接続するための複数行にわたる指示です。 以下、様々な指定の部分に書く個々の指示について説明します。

popserver ホスト名

必須の指示です。ホスト名はPOPサーバーのホスト名を書きます。

username ユーザーアカウント

必須の指示です。ユーザーアカウントはスプールを持っているユーザーがサーバーとPOP接続するときの名前を書きます。

password パスワード

必須の指示です。パスワードはスプールを持っているユーザーがサーバーとPOP接続するためのパスワードを書きます。

port ポート番号

オプションの指示です。ポート番号はサーバー側のPOP接続ポートの番号を書きます。 省略するとデフォルト値で接続します。 通常接続時のデフォルトポート番号は110、SSL接続時のデフォルトポート番号は995 になります。

portv6 IPv6ポート番号

オプションの指示です。IPv6ポート番号はサーバー側の IPv6 でのPOP接続ポートの番号を書きます。 省略するとデフォルト値で接続します。 通常接続時のデフォルトポート番号は110、SSL接続時のデフォルトポート番号は995 になります。 Java 版ではこの指定は無視されます。

mailcheckdelay メイルチェック間隔

オプションの指示です。メイルチェック間隔は biffpop をデーモンモードで起動したときや Java 版でサーバーをチェックする間隔を秒数で指定します。 Tcl/Tk を GUI にした場合は、チェック間隔が全サーバーで強制的に5分に設定されます。

viewallmessages フラグ

オプションの指示です。フラグは0を指定すると、 サーバー上で未読のメイル数と全メイル数の両方を取得します。 1を指定すると、全メイル数だけを取得します。 サーバーによっては、 未読メイル数を報告する機能を持っていない場合があります。 そのようなサーバーの場合は、1を指定してください。 未指定時のデフォルトは 0 です。

inhibitAPOP フラグ

オプションの指示です。フラグは0を指定すると、 可能ならば APOP で接続します。 1 を指定すると、APOP プロトコルが使えそうなときでも使用しません。 未指定時のデフォルトは 0 です。

useSSL フラグ

オプションの指示です。フラグは0を指定すると、 SSL を使用しないでサーバーと接続します。 1 を指定すると、SSL でサーバーと接続します。 未指定時のデフォルトは 0 です。

killPattern 正規表現

オプションの指示です。 正規表現には、 受信拒否したいメイルのヘッダパターンを指定してください。 一つのサーバーに対して、この指定を複数書けます。

プログラム

2004年8月公開のCソースコードに条件コンパイルの定義ミスがありました。 SSLライブラリや KILLLIST機能を抜いてコンパイルしたい場合は、 新しいソースコードを使用してください。

2005年11月サーバ側がソケットを突然クローズしたときに無限ループになってしまうバグをとりました。

対応OSファイルサイズバージョン日付
unixCソース biffpop.tgz28,118 Byte1.52005年11月11日
javajavaソース -19,297 ByteJ0.4.62005年11月11日


back button もどる