RFC5322に準拠したメッセージが格納されているファイルは一般的には mbox形式のファイルという。これを解析するライブラリ mailread がRuby標準で添付されている。
mailreadにオープン済みのIOオブジェクトを渡すと、それを自動的に 読み、ヘッダと本文のハッシュに分解される。以下の手順で 実験してみる。
#!/usr/bin/env ruby
require 'mailread'
require 'nkf' # 漢字コード変換
if ARGV[0] == nil then
STDERR.puts "引数にファイル名を指定して下さい"
exit 1
end
msg = Mail.new(ARGV[0]) # 1ファイル1メッセージの場合
header = msg.header
body = msg.body
$KCODE = 'e' # p で漢字を正しく表示させるため
puts "------- ヘッダ -------"
p header
puts "------- 本文 -------"
p NKF.nkf('-e', body.join) # 日本語EUCに変換してから
ヘッダ部分はフィールド名とその値のハッシュで格納され、 本文部分は1行1要素の配列で格納されている。
mailreadはRFC5321メッセージの分解を行なってくれる。その先、 解析結果をどのように利用するかはプログラム次第である。
ただし、mailreadは同じヘッダが複数あった場合に最後のものしか 保存されない。実際に本格的な解析を行なう場合はフィールドの値を 文字列ではなく,配列化して複数のものを持てるようなものを作成し, それを利用する必要がある。