これまで作成したプログラムはコマンドラインで手で起動していた。 そのような対話的利用のプログラムだけでなく, ネットワーク先からのアクセスによる起動や,人手によらない自動起動が 前提となるプログラムの構成を考えてみる。もっとも身近なものとして 送信された電子メイルをきっかけに起動するプログラムを考えてみよう。
電子的に取り扱う色々なファイルのうち,ネットワークごしに やりとりするもののほとんどは一定の書式を持つテキストファイルである。 電子メイルもその一つで人間の読める単純な形式で 送受信が行なわれている。この形式を解析し, その情報にふさわしい挙動をするようなプログラムを作ってみよう。
電子メイルのファイルフォーマットは RFC5322 によって 規定されている。これが格納されたファイルを通称mbox形式といい, おおまかなルールは以下のようになっている。
RFC5322 Internet Message Format - https://www.ietf.org/rfc/rfc5322.txt, 日本語訳は http://srgia.com/docs/rfc5322j.html 等参照。
簡単な例を示す。
From: KOEKI Taro <taro-k@e.koeki-u.ac.jp> Subject: This is an example To: IIMORI Hanako <hanako@f.koeki-u.ac.jp> Date: Sat May 9 11:43:26 JST 2014 こんにちは...(以下本文続く)
mbox形式のファイルを読み取り,ヘッダ部分の値を取り出すプログラムを 考える。各フィールド名(上の例の場合 From,Subject,To,Date)と その値をハッシュに格納する。ヘッダ解析のループは以下の方針で作成する。
これをRubyで記述した一例を示す。
header = Hash.new field="" while line = gets break if /^$/ =~ line # 行末ならヘッダ解析終了 if /^(\s)+(.*)/ =~ line then # 行頭空白なら header[field] += $1+"\n"+$2 # 前回のフィールド値に追加 elsif /^([^:]+):\s*(.*)/ =~ line # フィールド定義のパターン header[field=$1] = $2 # 初期値として代入 end end
なお,このプログラムは同じフィールド名が複数回現れる場合の 考慮はしていない。