=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 "Geino Mail\n"; end total = $2.unpack("c"); print kconv("総データ数 = "), total, $br; print $sep; else # isRead = $1.unpack("c"); # print "isRead.type = #{isRead.type}\n"; # print (if 1 == isRead[0] # "既読#$br" # elsif 0 == isRead[0] # "未読#$br" # end); # print $br, $sep; 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 # データ末尾に達した場合以外はエラー # print $!, "\n"; # print $!.type , "\n"; # print $!.to_s , "\n"; # if ("Over!" == $!.to_s) # print "Over..\n"; # end # print $!, "\n"; if ("Over!" != $!.to_s) raise; end if (true == $OPT_l) if (true != $OPT_t) print "\n"; end # リスト出力のみ return false; end # 本文出力 for i in @mailFile.keys.sort @mailFile[i] = dataConv(@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, "#$@ : #{$!.type} : #$!\n"; exit; end end end # メイン処理開始 getopts('htl'); if (true == $OPT_h) print kconv("usage:mlget Genio メールファイル読みだし\n"); print " :ruby mlg.rb [-h] [-t]\n"; print " :-h : print this message.\n"; print " :-t : output plain text.(default:HTML)\n"; print " :-l : output list only (default:list & mail\n"; exit; end if (true == $OPT_t) $br = "\n"; $sep = "#" * 72 + "\n\n"; else $br = "
\n"; $sep = "

\n"; end mcomm = Mcomm.new; inbox = InBox.new; while inbox.read(mcomm) end