class DkimVerify::Mail::Message

Public Class Methods

new(msg) click to toggle source
# File dkimverify.rb, line 26
def initialize(msg)
    @raw_message = msg
    @raw_headers = []
    @body = nil 
    @parsed = false
end

Public Instance Methods

body() click to toggle source
# File dkimverify.rb, line 38
def body
    self.parse! unless @parsed
    @body
end
headers() click to toggle source
# File dkimverify.rb, line 33
def headers
    self.parse! unless @parsed
    @headers
end
parse!() click to toggle source
# File dkimverify.rb, line 43
def parse!
    """Parse a message in RFC822 format.

    @param message: The message in RFC822 format. Either CRLF or LF is an accepted line separator.

    @return Returns a tuple of (headers, body) where headers is a list of (name, value) pairs.
    The body is a CRLF-separated string.

    """

    lines = @raw_message.split(/\r?\n/)
    i = 0
    while i < lines.size
        if lines[i].size == 0
            # End of headers, return what we have plus the body, excluding the blank line.
            i += 1
            break
        end
        if /[\x09\x20]/.match lines[i][0]
            @raw_headers[-1][1] += lines[i]+"\r\n"
        else
            m = /([\x21-\x7e]+?):/.match lines[i]
            if m
                @raw_headers << [m[1], lines[i][m.end(0)..-1]+"\r\n"]
            elsif lines[i].start_with?("From ")
                
            else
                raise MessageFormatError.new("Unexpected characters in RFC822 header: #{lines[i]}")
            end
        end
        i += 1
    end
    @body = lines[i..-1].join("\r\n") + "\r\n"
    @headers = HeaderHash[*@raw_headers.reverse.flatten(1)]
end