あるメールアカウントに届くメールを定期的に監視して、届いたメールに対して何かアクションしたい、というのはよくある要望ですね。Rubyでこれをやる必要が生じたので調べつつ、兼自分用メモです。

Rubyの場合、受信はNet::POP3クラスで一発です。リファレンスに丁寧なサンプルが載っているので困らないはず。

Rubyリファレンスマニュアル - net/pop
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=net%2Fpop

問題はその後。メールというのはそもそもテキストの固まりで、それを解析してヘッダー情報を取り出したり、本文を取り出したり、添付ファイルを分けたりしなければいけません。実はこれを全部自前でやろうとするともの凄く大変。なにせmultipartやらMIMEやら考えなきゃいけないことがたくさんあるし、色々なパターンのメールに全て対応していたらとても間に合いません(RFCを自分しっかり理解したい、というドMな要求があるなら別ですが...)。

ということでRubyの場合は


TMail
http://i.loveruby.net/ja/projects/tmail/

というメール解析ライブラリを使うと楽です。Debianの場合apt-getでlibtmail-rubyパッケージをインストールして終了。その他のOSの場合も上記からダウンロードしてきて

ruby setup.rb config
ruby setup.rb setup
(su) ruby setup.rb install

でインストールが完了します。こうすると、Mail.parseで一発で解析、変換してくれます。たとえば添付ファイルを取り出すならmail.parts[1].body, それをBase64.decode64でデコードすればそのままファイルに保存できます。こりゃ便利。

ということで、このTMailライブラリで全く不自由を感じないので、今後も愛用していきたいと思います。

おまけに。

上記TMailページの


インターネットメールの基礎
http://i.loveruby.net/ja/projects/tmail/doc/basics.html

というところを読むと面白いです。メールというシステムがいかにバッドノウハウの固まりかがわかります。TMailライブラリのソースコードは、なんと数千行(!)あるそうです。Rubyなのに。

まるでインターネットの負の仕様が積み重なってできているかのよう。上のページにも「メールは現在あるなかではほとんど最古参の古いシステムですから、特有の問題が死ぬほどあります。」とあります。

ふと思ったのが、今現代、もしも「インターネットを全て設計し直せる」としたら、少なくともアプリケーション層では様子は一変するだろうなぁ、ということです。自分はそっちの専門家ではないので何とも言えないのですが、少なくとも全てのプロトコルがXMLベースになるのは確実だと思いますね。ていうか、少なくともメールがXMLベースになってくれればどんなに楽でしょう。