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