Skip to content

tdtds/mobiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

=begin
= Mobiler: 汎用メールフィルタ

== What is Mobiler?
 Mobilerは、E-mail転送のための汎用フィルタです。メールサーバに届いたメールの内容を、置換、削除、追加し、指定されたサイズに分割してから別のアドレスへ転送します。主な用途として想定しているのは、携帯電話への転送です。携帯電話のメールはサイズに制限があり、かつ一般に料金設定が高いので、通常のメールをじかに受けとるよりも、置換等を使って圧縮し、かつ適切なサイズに分割してから転送した方が良い場合が多いです。Mobilerはこのような場面で使えそうなフィルタを多数用意してあり、それらを組み合わせて自由な加工を行うことが可能になっています。

 Mobilerは以下のような特長を持っています。

* Ruby((-http://www.ruby-lang.org/-))で書かれています。実行にはRubyインタープリタが必要です。
* 複数のフィルタを組み合わせて加工できます。また、新しいフィルタを書いて追加することが簡単に行えます。
* フィルタの組合せを設定ファイルに保存して使えます。
* 分割サイズおよび最大分割数の指定ができます。
* CGIで設定を行えます。
* 複数の利用者が自分の設定を行えます。
* メールの振り分け機能は持っていません。procmail等を併用してください。
* メールの転送方法には、コマンド、SMTPいずれかを選べます。

 Mobilerは主に以下の環境で動作確認を行っています。

* Kondara MNU/Linux 2000、Ruby 1.6.4、qmail 1.03
* TurboLinux 6.0、Ruby 1.6.3、sendmail 8.9.3
* FreeBSD 4.3-RELEASE、Ruby 1.6.4、sendmail 8.x.x

== Mobilerのインストール
 配布ファイルを適当なディレクトリに展開します。まぁ、どこでもいいです。ディレクトリcgiの下にあるファイルは設定用CGIのファイル群です。WWWサーバが動いているなら、CGIが実行できるディレクトリにこれらのファイルをコピーします。もしあなたのWWWサーバがシンボリックリンクを許しているなら、例えば以下のようにリンクをしてしまうのが楽でしょう(CGI用のディレクトリが/var/www/cgi-binの場合)。

  % ln -s `$PWD`/cgi /var/www/cgi-bin/mobiler

 続いてmobiler.rbを書き換えます。mobiler.rbの最初の行には、Rubyインタプリタへのパスが書かれています。もし/usr/local/bin/ruby以外の場所にRubyがあるなら、書き換える必要があります。

 最後に、mobiler.rbに実行権限が付いていることを確認してください。

== Mobilerの設定
=== mobiler.confの編集
 mobiler.conf.sampleファイルをmobiler.confにリネームし、中身を環境に合わせて書き換えます。それぞれの設定項目は以下のような意味です。

:$how
   どのような方法でメールを転送するかを指定します。'command'はプログラムを起動して、'smtp'はSMTPサーバに接続してメールを送ります。なお'file'はデバッグ用で、カレントディレクトリにresultで始まるファイルを書き出します。設定ファイルが正しいかどうかを確認する時に、ここを'file'にして、手動でMobilerを起動すると良いかも知れません。

:$mail_from
   転送時、実際にメールを送信するホンモノのアドレスを''で囲んで書いてください。

:$delivery_command
   $howに'command'を指定した場合に実行するコマンドを書きます。オプションを含めて記述します。メール本文はMobilerにより標準入力から送り込まれるので、そのような動きをしないコマンドは指定できません。また、転送先のメールアドレスは、ここで指定したコマンドのパラメタとして追加されます。

   サンプルファイルには、qmailを使った例が記述されています。sendmailの指定の仕方は知りません(笑)。

:$smtp_host、$smtp_port
   $howに'smtp'を指定した場合のSMTPサーバの情報です。$smtp_hostにはサーバ名を、$smtp_portにはポート番号(通常25)を指定します。

:$logfile
  Mobilerがメールの転送に失敗したときに、エラー情報を吐き出すログファイルを指定します。ここにnilを指定(''なし)すると、標準エラー出力にメッセージが出るようになります。

=== フィルタ設定ファイルの記述
 CGIを使ってフィルタ設定を行う場合、このパートは読み飛ばしてかまいません。ここは、自分でエディタを使ってちくちくと設定ファイルを書く人のための説明です。

 フィルタの組合せや実行順、パラメタの記述、メールの分割指定などを、必要なだけ設定ファイルにまとめて記述できます。フィルタ設定ファイルは、confディレクトリの下にサフィックス「.conf」のついたファイルとして置きます。目的別、ユーザ別にディレクトリを掘ってもかまいません。設定ファイルはRubyスクリプトになっており、以下の3つの変数を定義することで行います。

:filter_list
  その設定で使用する、フィルタのリストとそのパラメタを指定します。この変数は配列の配列になっていて、内側の配列には最初の要素にフィルタ名、2番目の要素にパラメタをカンマで区切った文字列を指定します。例として、パラメタを2つ持つReplaceFilterと、パラメタのないBasicFilterを順番に実行する場合を以下にあげます。

   filter_list = [
      ['ReplaceFilter', %q|'インターネット','INET'|],
      ['BasicFilter',nil],
   ]

  パラメタの記述は少し特殊です。それぞれのパラメタ(「インターネット」「INET」)を「''」でくくり、さらにそれを「%q|〜|」でくくることで単一の文字列としています(「|」がパラメタ値中に使われていて使えない場合は、適当な文字で代替して下さい)。また、パラメタを指定しない場合は「nil」を指定します。

  Mobiler標準のフィルタはディレクトリfilterの下にあります。フィルタ名にはこのファイル名から「.rb」を取ったものを指定します。それぞれのフィルタがどのような処理を行うのかは、それぞれのファイルに書いてあります。

:split_size、split_limit
   メールの分割サイズと、最大分割数を数値で指定します。分割サイズはバイト数です。Mobilerは、受けとったメールを指定されたフィルタすべてに順番に通し、それからsplit_sizeで指示されたサイズに分割します。split_limitを越えて分割された場合には、それ以降を捨ててしまいます。分割しないという設定はないので、そのような場合にはsplit_sizeを十分に大きくしてください。

   以下に、8Kバイト単位に10個までに分割する場合の指定方法を示します。

   split_size = 8000
   split_size = 10

=== CGIの設定
 Mobilerのフィルタ設定は上で説明したように設定ファイルを自分で記述しても良いですが、CGIを使って対話的に設定する方がはるかに簡単です。

 CGIを実行する前に、mobiler.rbと同様に、Rubyのパスが/usr/local/bin/ruby以外の場合にはCGIスクリプトの書き換えが必要です。cgiディレクトリにあるファイルのうち、サフィックス「.cgi」のファイルをすべて書き換えてください。また、それらのファイルにWWWサーバから実行できる権限がついていることを確認してください。

 もう一つ、環境に合わせて修正しなければならないファイルがあります。cgi/mobiler-cgi.conf.sampleファイルを、cgi/mobiler-cgi.confに名前を変えて、その中の定数を書き換えます。ひとつ目は「MOBILER_PATH」という定数で、実際にMobilerをインストールしたパス(mobiler.rbのあるディレクトリ)に合わせて書き換えます。さらに「CSS」という定数は、CGIが生成するHTMLのスタイルシートを指定します。標準で配布元のS.P.C.が提供するスタイルシートのURLが入っていますが、Referer漏洩等を気にする場合は、添付のmobiler.cssを適当な場所にコピーし、そのURLを指定するように書き換えてください。

 また、設定ファイルの書き込みがWWWサーバから行われるので、confディレクトリの下をWWWサーバの権限で書き込めるようにしておく必要があります。

   例: # chgrp www conf
       # chmod g+w conf

 WWWブラウザからconflist.cgiを開くと(例: http://yoursite/cgi-bin/mobiler/conflist.cgi)、現在confディレクトリに存在している設定ファイルの一覧が出ます。設定ファイルを選ぶと、フィルタの一覧とパラメタ、分割指定などが変更できるようになっています。新しい設定を作る場合は設定ファイル一覧のページで新規作成で適当な名前を入力してください。

 MobilerのCGIは、WWWサーバによるユーザ認証に対応しています。もしCGIがユーザ認証を経て実行された場合、リストアップされる設定ファイルは、confディレクトリの下ではなく、「conf/ユーザ名」の下にあるものになります。ユーザ認証を行うようにする方法はWWWサーバによって異なるのでくわしくは述べませんが、Apacheの場合は.htpasswdファイルを作り、cgiの下に.htaccessを作ってアクセス制限を行う必要があります(あとはWebででも調べて下さい)。なお、ユーザ認証対応をする場合には、confの下にあらかじめユーザごとのディレクトリを作成し、WWWサーバの権限で書き込めるようにしておく必要があります。

== メール転送の設定
 いくら設定ファイルを書いても、メールは転送されません。メールサーバにメールが届いたときにMobilerが実行されるように設定をして初めて、メールが転送されます。この設定はメールサーバごとにことなります。sendmailの場合は$HOME/.forwardでしょうし、qmailの場合は$HOME/.qmailでしょう。また、procmailを使っている場合は$HOME/.procmailrcに書きます。複数のフィルタ設定を使いたい場合には、procmailのような条件分岐ができるソフトウェアを使うのがオススメです。

 ここではprocmailの場合について説明します。他の環境の場合は、それぞれに合わせてMobilerを実行してください。例として「foo@bar.org」から届いたメールを、フィルタ設定ファイル「baz.conf」を通してから「hoge@hoge.com」に転送する、というシチュエーションを考えます。.procmailrcに以下のように書くことで、この指定を行えます(Mobilerのインストール先を「/usr/local/mobiler」と仮定します)。

    # from foo@bar.org
    :0
    * From:.*foo@bar.org
    | /usr/local/mobiler/mobiler.rb baz hoge@hoge.com

 mobiler.rbには2つないしそれ以上のパラメタを与えます。一つ目はフィルタ設定ファイルです。「.conf」は付けません。また、CGIでユーザ認証を使っている場合には、「ユーザ名/baz」のように最初にユーザ名+スラッシュが必要です。2つ目以降のパラメタには、転送先のメールアドレスを羅列します。複数のアドレスに転送できるわけです。

 また、mobiler.rbにはオプションが指定できます。現在指定できるオプションは「-d」で、引数に秒数を指定します。-dオプションが指定された場合、mobiler.rbは分割されたメールをその秒数間隔で送信します。これは、正しい順序でメールが届かなかった時に、受信したメールをSubjectでソートできないような端末でも順番通りに読めるようにする設定です。

 以上で転送設定が終わりました。条件に合致するメールを送信し、きちんと実行されていることを確認しましょう。

== セキュリティ
 Mobilerにおいて、管理者以外の手によって書き換えられる可能性があるフィルタ設定ファイル(confディレクトリ下)は、実行可能なRubyスクリプトそのままであり、第三者によって悪意のあるコードが含められた場合、システムに悪影響を及ぼす可能性があります。このためMobilerは、これら設定ファイルの読み込み時には高いアクセス制限をかけ、危険な操作ができないようになっています(たぶん)。

 しかし、同様なRubyスクリプトであるmobiler.confやfilter/*.rbにはこの制限をかけていませんので、これらのファイルが第三者に書き換えられないようにきちんとアクセス権を設定する必要があります。管理者以外からは書き込めないようにして下さい(読めるようにはして下さい)。

== フィルタの書き方
 Mobilerはフィルタ部分のプログラムをfilterディレクトリの下に分離してあります。フィルタの条件に合うプログラムを書いてここに置くことで、標準ではサポートしていない独自のフィルタを追加することができます。

 フィルタはクラスFilterを継承して作ります。Filterクラスはmobiler.rbの中で定義されています。フィルタクラス名は最後が「Filter」で終わっている必要があり、そのファイル名は「フィルタ名.rb」でなければなりません。再定義できるメソッドは以下のとおりです。

:フィルタクラス::description (必須)
   フィルタクラスの特異メソッドとして、descriptionが必要です。このクラスは3つの要素からなる配列オブジェクトを返します。1つ目の要素はフィルタクラス名そのものです。2つ目の要素はフィルタの名前で、CGIから選択するときの名称になります。3つ目はフィルタの機能についての詳しい説明です。CGIの中で、ヘルプとして表示されます。パラメタ指定の方法などの説明もここに書いてください。

:initialize( *opt ) (オプション)
   おなじみ初期化メソッドです。初期化処理や、パラメタを受けとる必要があるときに定義してください。フィルタのインスタンスは、設定ファイルで指定されたパラメタを指定されて生成されます。パラメタはいくつくるかわかりません。メソッドの先頭で親クラスを呼ぶ(suoer)ことで、パラメタは@optionsという配列オブジェクトとしてアクセスできるようになります。
   パラメタのチェックはここで行ってください。不正なパラメタを検知して例外を発生させることで、CGIを使っているユーザにそれを知らせることができます。

:header_filter( header ) (オプション)
   メールヘッダのフィルタを定義します。Mobilerは、受けとったメールをヘッダとボディに分割し、指定されたすべてのフィルタについて、まずヘッダを処理させます。もしヘッダを操作するフィルタを書きたければこのメソッドを定義しなければなりません。パラメタにはヘッダがそのまま渡ってきます。自分でパースして、適当な変更を加えてください。文字コードはEUCですが、MIMEデコードは行われていません。

:body_filter( body ) (オプション)
   ヘッダの処理が終わったら、こんどはボディ(本文)をフィルタに通します。ボディを変更したいフィルタを書く場合にはこのメソッドを定義しなければなりません。ボディの文字コードはEUCです。

== 再配布、再利用、フィードバック
 Mobilerの著作権はただただし(sho@spc.gr.jp)が保有し、GPLの元で公開しています。利用者はGPLの定める下でMobilerを改変、再配布することができます。

 ただし、配布ファイル中cgi/erb下にあるファイルはすべて、咳さんによるERbというライブラリです。これらのファイルについては別途http://www2a.biglobe.ne.jp/~seki/ruby/をごらん下さい。

 Mobilerはhttp://www.spc.gr.jp/mobiler/でサポートを行っています。ご意見・ご要望はこちらへどうぞ。パッチ歓迎です。

=end

Releases

No releases published

Packages

No packages published

Languages