Created
October 19, 2010 13:17
-
-
Save rkumar/634166 to your computer and use it in GitHub Desktop.
mbox mail reader
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # The Mail class represents an internet mail message (as per RFC822, RFC2822) | |
| # with headers and a body. | |
| class Mail | |
| # Create a new Mail where +f+ is either a stream which responds to gets(), | |
| # or a path to a file. If +f+ is a path it will be opened. | |
| # | |
| # The whole message is read so it can be made available through the #header, | |
| # #[] and #body methods. | |
| # | |
| # The "From " line is ignored if the mail is in mbox format. | |
| def initialize(f) | |
| unless defined? f.gets | |
| f = open(f, "r") | |
| opened = true | |
| end | |
| @header = {} | |
| @body = [] | |
| begin | |
| while line = f.gets() | |
| line.chop! | |
| # Added encode by RK since crashing with UTF-8 error | |
| line = line.encode("ASCII-8BIT", :invalid => :replace, :undef => :replace, :replace => "?") | |
| next if /^From /=~line # skip From-line | |
| break if /^$/=~line # end of header | |
| if /^(\S+?):\s*(.*)/=~line | |
| (attr = $1).capitalize! | |
| @header[attr] = $2 | |
| elsif attr | |
| line.sub!(/^\s*/, '') | |
| @header[attr] += "\n" + line | |
| end | |
| end | |
| return unless line | |
| while line = f.gets() | |
| # Added encode by RK since crashing with UTF-8 error | |
| line = line.encode("ASCII-8BIT", :invalid => :replace, :undef => :replace, :replace => "?") | |
| #line = line.encode('ASCII-8BIT') # added RK | |
| break if /^From /=~line | |
| @body.push(line) | |
| end | |
| ensure | |
| f.close if opened | |
| end | |
| end | |
| # Return the headers as a Hash. | |
| def header | |
| return @header | |
| end | |
| # Return the message body as an Array of lines | |
| def body | |
| return @body | |
| end | |
| # Return the header corresponding to +field+. | |
| # | |
| # Matching is case-insensitive. | |
| def [](field) | |
| @header[field.capitalize] | |
| end | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment