メッセージ解析

これまで作成したプログラムはコマンドラインで手で起動していた。 そのような対話的利用のプログラムだけでなく, ネットワーク先からのアクセスによる起動や,人手によらない自動起動が 前提となるプログラムの構成を考えてみる。もっとも身近なものとして 送信された電子メイルをきっかけに起動するプログラムを考えてみよう。

電子的に取り扱う色々なファイルのうち,ネットワークごしに やりとりするもののほとんどは一定の書式を持つテキストファイルである。 電子メイルもその一つで人間の読める単純な形式で 送受信が行なわれている。この形式を解析し, その情報にふさわしい挙動をするようなプログラムを作ってみよう。

mbox形式ファイルの解析

電子メイルのファイルフォーマットは 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

なお,このプログラムは同じフィールド名が複数回現れる場合の 考慮はしていない。


本日の目次

yuuji@e.koeki-u.ac.jp