IRCとメールとの間でメッセージをやりとりする機能の試験的な実装。
アーキテクチャの概略を下図に示します。
上図の migw.pl および minjector.pl の部分が今回作成した部分です。
migw.pl は、IRCクライアントとして目的のチャンネルにJOINしており、 IRC内での発言を受信します。 受信された発言はメールに変換され、SMTPサーバに渡されます。
一方、メールからIRCへの転送は、メールサーバでの .forward あるいは .procmailrc などの設定により メールのヘッダおよび本文が minjector.pl というプログラムに引き渡されます。
minjector.plは、標準入力からメールのヘッダと本文を読み込み 一定の形式に変換した後、Unixドメインソケットを経由して migw.pl に 引き渡され、最後に IRCネットワークのJOINしているチャンネルで 発言されます。
IRC/SMTPゲートウェイの設置と運用は、通常ユーザの権限で可能です。
以下の例では、設置と運用を行うユーザのホームディレクトリ直下にmigwというディレクトリを
作成し、その中にスクリプトや設定ファイルを置く場合を想定して説明を行っています。
というモジュールを使用しますので、 これらのモジュールがない場合は、CPANあるいはOS毎に 用意されているパッケージシステムなどからインストールします。
# 各種パラメータ設定 # $IRC_NICK = 'migw'; $IRC_SERVER = 'irc.example.net'; $IRC_PORT = 6667; $IRC_NAME = 'IRC/SMTP gateway'; $IRC_CH = '#foo'; $IRC_MAXLINES = 20; $IRC_ITIMEOUT = 120; $IRC_CTIMEOUT = 150; $IRC_HANDLEFILE = $ENV{HOME} . "/migw/sample-handlenames.pl"; $SMTP_SERVER = 'localhost'; $SMTP_FROM = 'migw@example.com'; $SMTP_TO = 'talk-irc@mx.example.org'; $SOCKPATH = $ENV{HOME} . "/migw/sample.sock"; $DEBUG = 1;
設定書式は、Perlの文法に従います。
設定項目の一部を以下に説明します;
<migw> kaw@on: こんにちは。のようになります。このkaw@onをハンドル名と呼ぶことにします。
その他は、自明な項目だと思いますので省略します。
/.forwardに記述する場合
| perl $HOME/migw/minjector.pl $HOME/migw/sample.conf || exit 75
/.procmailrcに記述する場合
:0 * ^To: talk-irc@example\.org |perl $HOME/migw/minjector.pl $HOME/migw/sample.confPerlスクリプトや設定ファイルの置場は、実際のものに読み換えて下さい。
設定ファイル中で$IRC_HANDLEFILEを定義した場合は、そのファイルを用意します。
設定ファイルは、Perlの文法に従います。内容はsample-handlenames.plのようになります。
%stat_handlenames = ( 'mail@example.com' => 'HandleName', 'mawk@foobar.ne.jp' => 'mika' ); 1;
このように、%stat_handlenames に、メールアドレスとハンドル名の対を 連想配列の要素として定義します。
設置を行ったユーザアカウントでログインし、コマンドラインから以下のように実行します。
perl $HOME/migw/migw.pl $HOME/migw/sample.conf
設定ファイルで$DEBUGが1の場合、動作にしたがってメッセージが出力されますので、 実際にIRCで発言したり、$SMTP_TOで設定したアドレスにメールを送信したりして動作を確認します。
*静的変換表 ... $IRC_HANDLEFILE中で定義した変換表
*動的変換表 ... メールユーザがコマンドメールを送信することにより設定できる変換表。
静的変換表の内容を変更するには$IRC_HANDLEFILEの内容を変更した後、migw.plプロセスにUSR1シグナルを送信し、変更を反映させます。
動的変換表を更新するには、ハンドル名を変換したいメールアドレスから以下の形式の本文を含むメールを送信します。
ゲートウェイのIRCニックネーム<-iam ハンドル名sample.confの設定値を例にとれば、具体的には以下のようになります。
migw<-iam kaw@homeこれで、ハンドル名がkaw@homeに設定されます。ハンドル名を付けず、
migw<-iamと送信した場合は、設定されていたハンドル名がリセットされます。
ゲートウェイのIRCニックネーム<-relay offこれによりメール->IRC, IRC->メールのいずれの方向の中継動作も停止します。
ゲートウェイのIRCニックネーム<-relay on
複数のメールアドレスと交信したい場合は、MLを作成し、このMLのアドレスを$SMTP_TOに設定します。そして、設定ファイルの$SMTP_FROMのアドレスをこのMLに追加します。
動作のイメージとしては、以下のようになります。
MLといっても、一般的なメーリングリストドライバを導入せず、/etc/mail/aliases等を用いた簡易なものを使用することも可能です。
これは、前項のTip、複数のメールアドレスとIRCの間で交信を行いたいの応用になります。例えば、IRCサーバ fooと barを接続する場合は、以下のようになります。