=begin 名称:Genio メール一覧スクリプト mlls.rb 内容:PCV ディレクトリ以下のメールのリストを作成する。    PCV ディレクトリにおいて実行すること。 "usage:mlls Genio メール一覧\n"; " :ruby mlls.rb [-h] [-t] [-b]\n"; " :-h : print this message.\n"; " :-t : output plain text.(default:HTML)\n"; " :-b : output list & mail (default:list only)\n"; =end require 'English.rb' require 'jcode.rb'; require 'getopts.rb'; require 'kconv'; include Kconv; # 境界外エラークラス定義 class OutOfBoundsException < Exception end # データオブジェクト定義 class Mcomm # インスタンス変数参照用ショートカット attr :data; attr :line; def initialize(target) @line = 0; @data = []; # print target, "\n"; begin file = open(target, "r"); rescue # エラーメッセージ表示 # エラーメッセージ表示 printf STDERR, "#$ERROR_POSITION : #{$ERROR_INFO.type} : #$ERROR_INFO\n"; exit; end # バイナリモードへ file.binmode; begin # ファイル内容を配列に格納 until file.eof? @data += file.gets("\r\n") end rescue # エラーメッセージ表示 # エラーメッセージ表示 printf STDERR, "#$ERROR_POSITION : #{$ERROR_INFO.type} : #$ERROR_INFO\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(workDir) # ファイル名ハッシュインスタンス変数の宣言 @mailFile = {}; # Dir.chdir(workDir); @workDir = workDir; end def dataConv(data) data = kconv(data); if (true != $OPT_t) data.gsub!("&", "&"); data.gsub!("<", "<"); data.gsub!(">", ">"); data.gsub!("\"", """); data.gsub!("\n", "
\n"); 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, @workDir + "/" + file[1]) begin fp = open(@workDir + "/" + file[1], "r"); mailData = ""; # ファイル全体読みだし mailData += $LAST_READ_LINE while fp.gets; @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; 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 += $PREMATCH; # メール保存 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 = (.+)$/) no = $3.to_i; # データ開始 if (0 == no) if (true != $OPT_t) print "Geino Mail\n"; end total = $2.unpack("c"); print kconv("ディレクトリ名 = "), kconv(@workDir), $br; print kconv("総データ数 = "), total, $br; print $sep; else end if (true == $OPT_t) print"No. = #{no}\n"; else print "No = #{no}
\n"; end body(mcomm, no); end # 異なるエリアだった mcomm.fwd; return true; # データ範囲外に出た rescue OutOfBoundsException # ディレクトリ戻し # Dir.chdir(".."); # データ末尾に達した場合以外はエラー if ("Over!" != $ERROR_INFO.to_s) raise; end if (true != $OPT_b) if (true != $OPT_t) print "\n"; end # リスト出力のみ return false; end # 本文出力 for i in @mailFile.keys.sort @mailFile[i] = dataConv(@mailFile[i]); if (true == $OPT_t) print"No. = #{i}\n\n"; else print "No = #{i}

\n"; end print @mailFile[i], $br; print $sep; end if (true != $OPT_t) print "\n"; end return false; rescue # エラーメッセージ表示 printf STDERR, "#$ERROR_POSITION : #{$ERROR_INFO.type} : #$ERROR_INFO\n"; exit; end end end # メイン処理開始 getopts('htb'); if (true == $OPT_h) print kconv("usage:mlls Genio メール一覧\n"); print " :ruby mlls.rb [-h] [-t] [-b]\n"; print " :-h : print this message.\n"; print " :-t : output plain text.(default:HTML)\n"; print " :-b : output list & mail (default:list only)\n"; exit; end if (true == $OPT_t) $br = "\n"; $sep = "#" * 72 + "\n\n"; else $br = "
\n"; $sep = "

\n"; end data = Dir.glob('*'); data.sort!; dir1 = []; i = 0; for j in data # ディレクトリで if test(?d, j) # メールファイルがある if test(?r, j + "/MCOMMBAK.$@$") mcomm = Mcomm.new(j + "/MCOMMBAK.$@$"); inbox = InBox.new(j); while inbox.read(mcomm) end end end end