From: Daisuke Sato Date: 1998-04-30T10:35:53+09:00 Subject: [ruby-list:7792] こんなスクリプト作ってみました ----Next_Part(Thu_Apr_30_10:25:54_1998_559)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit 佐藤@東邦大です。 溜ったメールを処理するちょっとしたものを作ってみました。 が、brush upをしたいと思い、こちらに投げさせていただきます。 このスクリプトを起動すると、指定したメールフォルダで指定した日数以上を経過 したメールをアーカイブし、削除します。 (ここでのメールは、mh形式を意識しています) アーカイブファイルは 「Folder名-処理を開始した時間(秒まで).tar.gz」 となります。 また、各アーカイブには、00indexというファイルが含まれ、その中には、アーカ イブに含まれた各メールの番号、From、Subjectが入ります。 # 以前はindex作成の部分をimlsにやらせたもんで倍近く時間がかかりました # 今回、スクリプト自身にやらせたのでほぼ一瞬でできるようになりました アーカイブ用ディレクトリは*先に作成しておいて*ください。 作業そのものがけっこうクリティカルなため、けっこう例外処理を含めていますが、 不完全なこと甚しいです。 実際に使うという方は、これでいいと思えるまでは変数nodelを1にして、削除しな いようにしておきましょう。 * スピードアップのため、冗長になっている部分の削除や変更 * 安全性向上のため、例外で処理すべき部分の追加、正当性の確認 が目下の目標となっております。 ぶしつけですが、よろしくお願いいたします。 === やさいはけんこうにいちばーん!たくさんたべんとおおきくなれんよー! (シルバー王女@クレヨン王国) ばーい 佐藤 大輔/densuke@ga2.so-net.ne.jp (CQD00116@niftyserve.or.jp) I don't read those mail(s): - with the header "Application/MS-*" - which cannot read due to "Moji bake" PS. indexはEUCのまんまのほうがやっぱりいいかもしんない、どーでもいーけど (ホーレソレ@野菜の精風に) ----Next_Part(Thu_Apr_30_10:25:54_1998_559)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit #!/usr/bin/ruby # === カスタマイズされうる変数 mailDir = "~/Mail" # メールディレクトリ(後で展開されます) archDir = "~/mail-archive" # アーカイブディレクトリ(同) tar = "/bin/tar" nodel = 0 # 1にすると削除しません folders = [ # ["フォルダ名", (日数)] のペア 以下はサンプル ["ruby", 7], ["Linux-users", 7], ["Pilot-ML", 7], ["enkai-ML", 7], ["mew", 7], ["ppxp", 7], ["tlug-server", 7], ["xemacs", 2] ] # === ここまで require "mailread" # メールの処理をしてくれます require "parsedate" # 日付を処理してくれます require "kconv" include ParseDate numRe = /^[0-9]+$/ retRe = /\n/ mailDir = File.expand_path(mailDir) archDir = File.expand_path(archDir) now = Time.now i = 0 folders.each{ |folder| n = 0 i += 1 print "--- #{folder[0]} (#{i}/#{folders.size}) #{folder[1]}日以前---\n" begin dir = Dir.open(mailDir + "/" + folder[0]) rescue $stderr.print "ディレクトリ #{folder[0]}のオープンに失敗しました\n(#{$!})\n" next end files = dir.collect { |f| if f =~ numRe then f else nil end }.sort { |a, b| a.to_i <=> b.to_i }.compact dir.close diff = folder[1] * 24 * 60 * 60 list = [] index = [] files.each{ |file| mail = Mail.new(mailDir + "/" + folder[0] + "/" + file) y, m, d = parsedate(mail.header["Date"]) fdate = Time.mktime(y, m, d) if (now - fdate) > diff then n += 1 list << file begin from = Kconv.tojis(Kconv.toeuc(mail.header['From'].gsub(retRe, " "))[0..20]) rescue from = " " * 20 end begin subject = Kconv.tojis(Kconv.toeuc(mail.header['Subject'].gsub(retRe, " "))[0..40]) rescue subject = " " * 40 end index << sprintf("%5d %-20s | %-40s", file, from, subject) end } if n > 0 then print "#{n} ファイルありました。\n" arch = "#{archDir}/#{folder[0]}-#{now.strftime('%Y%m%d%H%M%S')}.tar.gz" begin Dir.chdir("#{mailDir}/#{folder[0]}") rescue $stderr.print "chdirに失敗しました(#{$!})\n" exit 1 end print "インデックス生成中..." $stdout.flush ifile = open("00index", "w") index.each { |s| ifile.print "#{s}\n" } ifile.close print "アーカイブ中..." $stdout.flush begin fork { exec "#{tar} czf #{arch} 00index #{list.join(' ')}" } rescue $stderr.print "子プロセス実行時にエラーが発生しました\n(#{$!})\n" end Process.wait if $? > 0 then $stderr.print "失敗しました\n" exit 1 end if nodel == 0 then print "削除中..." $stdout.flush list.push("00index") begin File.unlink(*list) rescue $stderr.print "ファイル #{file} の削除に失敗しました\n(#{$!})\n" exit 1 end print "完了\n" end else print "削除すべきファイルはありません\n" end } ----Next_Part(Thu_Apr_30_10:25:54_1998_559)----