人間とウェブの未来

「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。

メール送受信システムを幸せにするべく受信サーバdovecotのmruby拡張を書き始めた

以前、メール送信(SMTP)サーバの振る舞いを制御するために、mrubyで機能拡張できるpmilterというMilterプロトコルベースのミドルウェアを作りました。

hb.matsumoto-r.jp

その流れで、メール受信(POPやIMAP)サーバの振る舞いも同様に制御することによって、トータルでメール送受信システムの流量制限だけでなく、アクセス制御や不正な認証の検知、DoSのようなアクセスや大量メールの送受信をうまくプログラマブルな設定を書くことによって解決していきたいと思いはじめ、昨日からpmilterだけでなくメール受信サーバの開発にも取り組みはじめました。

それらのメール系ミドルウェアを組み合わせることにより、既に使われているメールの定番ミドルウェア(Postfixやdovecot)はそのままに、平易に導入できて、性能を落とすことなく自由にRubyで拡張ができるようになる基盤を作りたいと考えています。

メールは使いたくないと言われる時代の中でも、やはり今でもメールでのやり取りというのはなかなか避けることができず、極端に言えばWeb以上に、メールが止まったりスパムや不正アクセスがあったり、IPレピュテーションの問題でメールが止まった時には、クレームに繋がったり、サービスの売上低下などに繋がったりと、未だに社会的に影響の大きいプロトコルだと言えるでしょう。

そこで、これからメール受信サーバを弄るならどのミドルウェアかなぁと思ってtwitterで色々聞いていると、dovecotでしょ、という話を沢山頂いたので、昨日と今日でdovecot-mruby-pluginのプロトタイプを作りました。プロトタイプといっても、先ずはビルドシステムとテスト環境を作るところに力をいれて、今後の開発をやりやすくして、概ねプロトタイプが動くような状態を目指しました。後は地道に引き続き機能開発をしていく予定です。

github.com

大体READMEの通りですが、以下のようにまずはMRUBYコマンドを作って引数のコードを実行できるようにしました。ドキュメントはほぼなかったので、dovecotの実装を読みながら書いています。

$ telnet 127.0.0.1 6070
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.

1 login test testPassword

1 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE MRUBY] Logged in

1 MRUBY 3*9    #=> 3*9は27という結果が返ってきている
1 27 (0.001 + 0.000 secs).

引き続き受信サーバの振る舞いをIMAP/POPのセッションレベルから多岐に渡ってmrubyで制御できるように実装していこうと思います。

最終的にはdovecot-mruby-pluginとpmilterを連携させて、その基盤の上にRubyでイケてる振る舞いを実装したメールシステムを作って、メールのシステムが幸せになる時代を見てみたいものです。