=begin
名称:Genio メール読み出しスクリプト mlg.rb
内容:同一ディレクトリ上の MCOMMBAK.$@$ からの
メール情報の抜き出し及びメール読み込み
"usage:mlget Genio メールファイル読みだし\n";
" :ruby mlg.rb [-h] [-t]\n";
" :-h : print this message.\n";
" :-t : output plain text.(default:HTML)\n";
" :-l : output list only (default:list & mail\n";
=end
require 'jcode.rb';
require 'getopts.rb';
require 'kconv';
include Kconv;
# 境界外エラークラス定義
class OutOfBoundsException < Exception
end
# データオブジェクト定義
class Mcomm
# インスタンス変数参照用ショートカット
attr :data;
attr :line;
def initialize
@line = 0;
@data = [];
# ファイル存在チェック
target = if test(?e, "MCOMMBAK.$@$")
"MCOMMBAK.$@$";
elsif test(?e, "mcommbak.$@$")
"mcommbak.$@$";
end;
begin
file = open(target, "r");
rescue
# エラーメッセージ表示
print $!, "\n";
exit;
end
# バイナリモードへ
file.binmode;
begin
# ファイル内容を配列に格納
until file.eof?
@data += file.gets("\r\n")
end
rescue
# エラーメッセージ表示
print $!, "\n";
exit;
ensure
file.close;
end
end #init
# ポインタを進める
def fwd(cnt = 1)
if (@line + cnt < @data.length)
@line += cnt ;
else
raise OutOfBoundsException, "Over!";
end
end
# ポインタを戻す
def bwd(cnt = 1)
if (@line - cnt >= 0)
@line -= cnt ;
else
raise OutOfBoundsException.new("Under!");
end
end
# 現在行内容出力
def inf
return @data[@line];
end
# サイズ出力
def length
return @data.length;
end
# 現在行内容表示
def prt
printf STDERR, "@data[#@line] = ", @data[@line], "\n";
end
# 先頭に移動する
def top
@line = 0;
end
# 末尾に移動する
def btm
@line = @data.length - 1;
end
end
class InBox
def initialize
# ファイル名ハッシュインスタンス変数の宣言
@mailFile = {};
end
def dataConv(data)
data = kconv(data);
if (true != $OPT_t)
data.gsub!("&", "&");
data.gsub!("<", "<");
data.gsub!(">", ">");
data.gsub!("\"", """);
data.gsub!("\n", "
\n");
# data.gsub!(/($)/, "
#$1");
end
return data;
end
def inetBody(mcomm, no)
# インターネットメール
file = mcomm.inf.unpack('x10a3a*');
file[1].chop!;
print kconv("ファイル名 = "), file[1], $br;
# メール読み出し
if (true != $OPT_l)
if test(?e, file[1])
begin
fp = open(file[1], "r");
mailData = "";
# ファイル全体読みだし
mailData += $_ while fp.gets;
# mailData = kconv(mailData);
@mailFile[no] = mailData;
ensure
fp.close;
end
else
@mailFile[no] = "このファイルは存在しません。\n";
end
end
# 次の行へ
mcomm.fwd;
title = mcomm.inf;
print kconv("タイトル = "), kconv(title.chop), $br;
# 次の行へ
mcomm.fwd;
# from = mcomm.inf.unpack('x2a*');;
mcomm.inf =~ /\t(.+)\t/;
from = $1;
print kconv("発信者 = "), kconv(from), $br;
# 次の行へ
mcomm.fwd;
access = mcomm.inf.unpack('hx5a*');
print kconv("受信日 = "), access[1].chop, $br;
end
def nifBody(mcomm, no)
print kconv("ファイル名 = ニフティメール"), $br;
mcomm.fwd;
title = mcomm.inf;
print kconv("タイトル = "), kconv(title.chop), $br;
# 次の行へ
mcomm.fwd;
from = mcomm.inf.unpack('x2a*');;
print kconv("発信者 = "), kconv(from[0].chop.chop), $br;
mcomm.fwd;
doc = mcomm.inf[(mcomm.inf.rindex("\000") + 1)..(mcomm.inf.length - 1)];
mcomm.fwd;
until (mcomm.inf =~ /\r \004\000\000(\d\d\/\d\d\/\d\d \d\d:\d\d)/)
doc += mcomm.inf;
mcomm.fwd;
end
access = $1;
doc += $`;
# メール保存
if (true != $OPT_l)
@mailFile[no] = doc;
end
print kconv("受信日 = "), access, $br;
end
def body(mcomm, no)
# 次の行へ
mcomm.fwd;
if (/A:\\/ =~ mcomm.inf)
inetBody(mcomm, no);
else
nifBody(mcomm, no);
end
print $br, $sep;
end
def read(mcomm)
begin
if (mcomm.inf =~ /(.)\000(.)\000INBOXDATANO = (.+)$/)
# print "$1 = ", $1.unpack("c") , "$2 = ", $2.unpack("c"), "$3 = #$3\n";
no = $3.to_i;
# データ開始
if (0 == no)
if (true != $OPT_t)
print "