*IRC/SMTPゲートウェイ [#w3c4b9e7]
RIGHT:2008-02-12
RIGHT:2008-10-20
RIGHT:川俣吉広

IRCとメールとの間でメッセージをやりとりするための機能を
実験的に実してみました。
IRCとメールとの間でメッセージをやりとりする機能の実験的な実。
**アーキテクチャ [#i8b051b4]
アーキテクチャの概略を下図に示します。~
下図の[IRC/SMTP Gateway]および[injector]の部分が今回作成した部分です。
アーキテクチャの概略を下図に示します。
        SMTP   +-------------+      SMTP                         +--------+
 Mail <--------|< - - - - - -|<---------------[migw.pl]<-------->| IRC    |
 User          | mail server |                    ^              | Server |
      -------->|- - - - - - >|-->[.forward]       |socket        +--------+
               +-------------+        |           |
                                      +------>[minjector.pl]
上図の migw.pl および minjector.pl の部分が今回作成した部分です。

IRC/SMTP Gatewayは、IRCクライアントとして目的のチャンネルにJOINしており、
migw.pl は、IRCクライアントとして目的のチャンネルにJOINしており、
IRC内での発言を受信します。
受信された発言は、メーリングリストに転送するためメールとしてSMTPサーバに渡されます。
受信された発言はメールに変換され、SMTPサーバに渡されます。

一方、メーリングリストにメールが投稿された場合は、メーリングリストの信先の
アカウントの一つから injectorというプログラムに引き渡されます。
injectorの起動とデータの引き渡しは、.forwardや.procmailrcでの設定により行っています。
一方、メールからIRCへの転送は、メールサーバでの
.forward あるいは .procmailrc などの設定により
メールのヘッダおよび本文が minjector.pl というプログラムに引き渡されます。

injectorは、標準力からメールのヘッダと本文を読み込み
一定の形式に変換した後 IRC/SMTP Gatewayに渡し、このメッセージが
IRCネットワークに投稿されます。
              Mailing                               IRC
              List                                 Channel
                |<---[ML driver]                     |<-->[IRC user 1]
                |        ^                           |
 [ML user 1]<-->|        |                           |<-->[IRC user 2]
                |--->[SMTP Server]<----[IRC/SMTP]<-->|
 [ML user 2]<-->|                      [Gateway ]    |----[IRC user n]
                |                          ^
 [ML user n]<-->|                          |
                |                          |
 [ML user X]<-->|                          |
      |                                    |
      |                                    |
      +-->[.forward or]-->[injector]-------+
          [.procmailrc]
**利用方法 [#o32a25eb]
***IRCユーザ側 [#d45ad74b]
IRCネットワーク上では、ゲートウェイは一人のユーザのように見え、
そのチャンネルでの発言はすべてメーリングリストに投稿されるため、
とくに設定等は要ありません。
***メールユーザ側 [#a64c35b8]
メールを用いて交信を行う場合はメーリングリストに加する
要があります。

今回の実験では、メーリングリストシステムにPPML((http://www.kk.iij4u.or.jp/~ando/ppml/ppml.html))
を使用しています。

PPMLの使用法を簡単に説明します。

:メーリングリストに参加したい|
以下のようなメールを送信します。
 To: ppserv@dameningen.kicks-ass.net
本文
 subscribe ircebug
しばらくすると、以下のような確認を求めるメールが自動返送されてきます。
 Subject: Request to Confirm
 From: PPML-Server <ppserv@dameningen.kicks-ass.net>
 To: kaw@on.rim.or.jp
本文
 Subscribe request for "ircebug" mail-list from your address received.
 If you can approve this request, Send back a line below.
         confirm 1202794262-00000001741 ircebug
minjector.plは、標準力からメールのヘッダと本文を読み込み
一定の形式に変換した後、Unixドメインソケットを経由して migw.pl に
引き渡され、最後に IRCネットワークのJOINしているチャンネルで
発言されます。
**設定及び起動手順 [#ie5adb66]
IRC/SMTPゲートウェイの設置と運用は、通常ユーザの権限で可能です。~
以下の例では、設置と運用を行うユーザのホームディレクトリ直下にmigwというディレクトリを
作成し、その中にスクリプトや設定ファイルを置く場合を想定して説明を行っています。
***設定ファイルの編集 [#yb77e279]
-このページに添付されているsample.confをに、設定の編集を行います。
 # 各種パラメータ設定
 #
 $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;
 
 Thanks.
 -- ircebug-request@dameningen.kicks-ass.net
このメールの「confirm 1202794262-00000001741 ircebug」の部分を
ppserv@dameningen.kicks-ass.net宛に返送すると、
このメールの発信メールアドレスがメーリングリストにメンバーとして追加されます。
:メーリングリストから脱退したい|
以下のようなメールを送信します。
 To: ppserv@dameningen.kicks-ass.net
本文
 unsubscribe ircebug
:メーリングリストに記事を投稿したい|
ircebug@dameningen.kicks-ass.net宛に
メッセージを送信します。~
メッセージは、MLリストに送されます。同時に
IRCのチャンネルにも転送されます。
現在、IRCに転送されるメッセージは、本文中最初の4行までです。
:メーリングリストの送を一時的に停止したい|
以下のようなメールを送信します。
 To: ppserv@dameningen.kicks-ass.net
本文
 off ircebug
:メーリングリストの送を再開したい|
以下のようなメールを送信します。
 To: ppserv@dameningen.kicks-ass.net
本文
 on ircebug
:過去に送されたメールを再取得したい|
以下のようなメールを送信します。
 To: ppserv@dameningen.kicks-ass.net
本文
 get ircebug 1-10
最後の数字は、取得したいメールの記事番号です。~
以下の書式が使用できます。
 get ircebug 10        ... 記事番号10のメールを取得
 get ircebug 1-10      ... 1から10まで
 get ircebug 1,2,7     ... 1と2と7
 get ircebug 1,2,5-10  ... 1と2と5から10まで
offコマンドで一時的に送を停止していた間に
送されたメールもgetコマンドで取得できます。
 $SMTP_SERVER  = 'localhost';
 $SMTP_FROM    = 'migw@example.com';
 $SMTP_TO      = 'talk-irc@example.org';
 
 $SOCKPATH     = $ENV{HOME} . "/migw/sample.sock";
 
 $DEBUG        = 1;
設定書式は、Perlの文法に従います。~
設定目の一部を以下に説明します;
:$IRC_MAXLINES|一通のメール本文からIRCへ送信される最大行数。メッセージ本文でこの行数をえた部分はIRCチャンネルへは送信されない。
:$IRC_ITIMEOUT|IRCからメールへ送信する場合のタイムアウト。IRCで発言のない期間がこの秒数をえると、その時点までで送信されていなかったIRCの発言が一通のメールとしてSMTPサーバに送信される。
:$IRC_CTIMEOUT|IRCからメールへ送信する場合のタイムアウト。IRCで$IRC_ITIMEOUTによるタイムアウトが発生していない状況で、発言がこの$IRC_CTIMEOUTで設定した秒数をえると、その時点までで送信されていなかったIRCの発言が一通のメールとしてSMTPサーバに送信される。
:$SOCKPATH|minjector.plとmigw.plが通信するためのUnixドメインソケットのパス

その他は、自明な目だと思いますので省略します。
***メール関係の設定 [#tca1f5b9]
-minjector.plがメールを受け取るメールアカウント(設定ファイルでの$SMTP_FROM)を作成します。
-実際にminjector.plがメールを受け取るように、メールサーバの設定を行います。
--~/.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.conf
Perlスクリプトや設定ファイルの置場は、実際のものに読み換えて下さい。
***プログラムの起動 [#db525786]
設置を行ったユーザアカウントでログインし、コマンドラインから以下のように実行します。
 perl $HOME/migw/migw.pl $HOME/migw/sample.conf
セッテイファイルで$DEBUGが1の場合、動作にしたがってメッセージが出力されますので、
実際にIRCで発言したり、$SMTP_TOで設定したアドレスにメールを送信したりして動作を確認します。
**Tips [#s9ca28e2]
:複数のメールアドレスとIRCの間で交信を行いたい。|複数のメールアドレスと交信したい場合は、MLを作成し、このMLのアドレスを$SMTP_TOに設定します。そして、設定ファイルの$SMTP_FROMのアドレスをこのMLに追加します。~
MLといっても、一般的なメーリングリストドライバを導せず、/etc/mail/aliases等を用いた簡易なものを使用することも可能です。
:splitしているIRCサーバの間を接続するために使いたい。|
**ToDo [#v1a9f1ec]
-IRCの接続が切れた時に再接続を行う機能


Front page   New Page list Search Recent changes   Help   RSS of recent changes