module Griddler::EmailParser

Public Class Methods

extract_headers(raw_headers) click to toggle source
# File lib/griddler/email_parser.rb, line 42
def self.extract_headers(raw_headers)
  if raw_headers.is_a?(Hash)
    raw_headers
  else
    header_fields = Mail::Header.new(raw_headers).fields

    header_fields.inject({}) do |header_hash, header_field|
      header_hash[header_field.name.to_s] = header_field.value.to_s
      header_hash
    end
  end
end
extract_reply_body(body) click to toggle source
# File lib/griddler/email_parser.rb, line 27
def self.extract_reply_body(body)
  if body.blank?
    ""
  else
    remove_reply_portion(body)
      .split(/[\r]*\n/)
      .reject do |line|
        line =~ /^[[:space:]]+>/ ||
          line =~ /^[[:space:]]*Sent from my /
      end.
      join("\n").
      strip
  end
end
parse_address(full_address) click to toggle source
# File lib/griddler/email_parser.rb, line 14
def self.parse_address(full_address)
  email_address = extract_email_address(full_address)
  name = extract_name(full_address)
  token, host = split_address(email_address)
  {
    token: token,
    host: host,
    email: email_address,
    full: full_address,
    name: name,
  }
end

Private Class Methods

extract_email_address(full_address) click to toggle source
# File lib/griddler/email_parser.rb, line 62
def self.extract_email_address(full_address)
  full_address.split('<').last.delete('>').strip
end
extract_name(full_address) click to toggle source
# File lib/griddler/email_parser.rb, line 66
def self.extract_name(full_address)
  full_address = full_address.strip
  name = full_address.split('<').first.strip
  if name.present? && name != full_address
    name
  end
end
regex_split_points() click to toggle source
# File lib/griddler/email_parser.rb, line 78
def self.regex_split_points
  [
    reply_delimeter_regex,
    /^[[:space:]]*[-]+[[:space:]]*Original Message[[:space:]]*[-]+[[:space:]]*$/i,
    /^[[:space:]]*--[[:space:]]*$/,
    /^[[:space:]]*\>?[[:space:]]*On.*\r?\n?.*wrote:\r?\n?$/,
    /^On.*<\r?\n?.*>.*\r?\n?wrote:\r?\n?$/,
    /On.*wrote:/,
    /\*?From:.*$/i,
    /^[[:space:]]*\d{4}[-\/]\d{1,2}[-\/]\d{1,2}[[:space:]].*[[:space:]]<.*>?$/i,
    /(_)*\n[[:space:]]*De :.*\n[[:space:]]*Envoyé :.*\n[[:space:]]*À :.*\n[[:space:]]*Objet :.*\n$/i, # French Outlook
    /^[[:space:]]*\>?[[:space:]]*Le.*<\n?.*>.*\n?a[[:space:]]?\n?écrit :$/, # French
    /^[[:space:]]*\>?[[:space:]]*El.*<\n?.*>.*\n?escribió:$/ # Spanish
  ]
end
remove_reply_portion(body) click to toggle source
# File lib/griddler/email_parser.rb, line 94
def self.remove_reply_portion(body)
  regex_split_points.inject(body) do |result, split_point|
    result.split(split_point).first || ""
  end
end
reply_delimeter_regex() click to toggle source
# File lib/griddler/email_parser.rb, line 57
def self.reply_delimeter_regex
  delimiter = Array(Griddler.configuration.reply_delimiter).join('|')
  %r{#{delimiter}}
end
split_address(email_address) click to toggle source
# File lib/griddler/email_parser.rb, line 74
def self.split_address(email_address)
  email_address.try :split, '@'
end