#!/usr/bin/ruby
def make_header(lines)
from_header = lines.detect { |line| line =~ /^From: / }
date_header = lines.detect { |line| line =~ /^Date: / }
if /<(.*)>/.match(from_header)
sender = $1
else
sender = /From: (.*)/.match(from_header)[1]
end
dummy, weekday, day, month, year, time = /^Date: (...), ([0-9]*) (...) (....) (........)/.match(date_header).to_a
if day.length == 1 then day = " " + day end
"From " + sender + " " + weekday + " " + month + " " + day + " " + time + " " + year
end
def dump_multipart(basename, boundary)
part = 1
while Dir.entries(".").member?(basename + part.to_s + ".MIME")
lines = open(basename + part.to_s + ".MIME").readlines
puts "--" + boundary
puts escape(lines)
if Dir.entries(".").member?(basename + part.to_s)
puts escape(open(basename + part.to_s).readlines)
end
if Dir.entries(".").member?(basename + part.to_s + ".1")
dump_multipart(basename + part.to_s + ".", detect_boundary(lines))
end
part += 1
end
end
def detect_boundary(lines)
boundary_header = lines.detect { |line| line =~ /boundary/ }
return $1 if /"(.*)"/.match(boundary_header)
end
def escape(lines)
result = []
lines.each do |line|
if line =~ /^>*From / then line = ">" + line end
result.push line
end
return result
end
files = Dir.entries(".").find_all { |file| file =~ /^[0-9]+\.$/ }
for filename in files
lines = open(filename).readlines
puts make_header(lines)
puts escape(lines)
puts
end
files = Dir.entries(".").find_all { |file| file =~ /^[0-9]+\.HEADER$/ }
for filename in files
lines = open(filename).readlines
puts make_header(lines)
puts escape(lines)
boundary = detect_boundary(lines)
if boundary
dump_multipart(/([0-9]+\.)/.match(filename)[1], boundary)
else
puts
end
end