Module: Griddler::EmailParser

Defined in:
lib/griddler/email_parser.rb

Class Method Summary collapse

Class Method Details

.extract_email_address(full_address) ⇒ Object



62
63
64
# File 'lib/griddler/email_parser.rb', line 62

def self.extract_email_address(full_address)
  full_address.split('<').last.delete('>').strip
end

.extract_headers(raw_headers) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
# 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_name(full_address) ⇒ Object



66
67
68
69
70
71
72
# 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

.extract_reply_body(body) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 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) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
# 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

.regex_split_pointsObject



78
79
80
81
82
83
84
85
86
87
88
89
# 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.*<\n?.*>.*\n?wrote:$/,
    /On.*wrote:/,
    /\*?From:.*$/i,
    /^[[:space:]]*\d{4}[-\/]\d{1,2}[-\/]\d{1,2}[[:space:]].*[[:space:]]<.*>?$/i
  ]
end

.remove_reply_portion(body) ⇒ Object



91
92
93
94
95
# File 'lib/griddler/email_parser.rb', line 91

def self.remove_reply_portion(body)
  regex_split_points.inject(body) do |result, split_point|
    result.split(split_point).first || ""
  end
end

.reply_delimeter_regexObject



57
58
59
60
# 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) ⇒ Object



74
75
76
# File 'lib/griddler/email_parser.rb', line 74

def self.split_address(email_address)
  email_address.try :split, '@'
end