libis-format 1.3.8 → 1.3.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 926fc551e289a3866aa7e79ba4b835eae9ab1cae31febc247746c59a8e6bed4c
4
- data.tar.gz: 22ab9cab0fe38e3232fbf67805ae91432ffda56b1864eaab707efa2a8d5bde86
3
+ metadata.gz: ec695a5009a2c131983af21f4c773037731907280eb229982eeacc8f7c72bf6b
4
+ data.tar.gz: 48139c18c6b66ddc9b25941dcbecee30294c3d7124d889dd74fae34b2a176c74
5
5
  SHA512:
6
- metadata.gz: bb57e0586eb783302b0b5cec06bdfec3a55f4901ed214555e602d7658a4f4908c142096145bbb0cd3573a7a56fb049a13cd9ceba85b1958efb0d70400f578a07
7
- data.tar.gz: f30fa360afcc72db8c42713aa5b2d21a46616d8bdbe75566f29bb088cdfc3b9d11e83d1c77d22d9a9a10d00d5a383fcdddaa45386bfc187813a6aafa11cbb51b
6
+ metadata.gz: b9f232072ceed43e950d51869478c18e03cb79e157749a34e7580330a9e379f3008bd8f963461ea81261bdaf95b65d779b1d3c0efd1da86ef2d1fc729316cb43
7
+ data.tar.gz: cb40a76524a3854692b81baace242bf96a22c92bcde21192dffdaf6bd5afc187c7b4c7190866e0f0b9c17462d4392acec8b12e07fc6acaaf76192b171c37cb05
@@ -3,10 +3,8 @@
3
3
 
4
4
  require_relative 'mail_to_pdf'
5
5
 
6
- require 'mapi/msg'
7
- require 'rfc_2047'
8
-
9
- Mapi::Log.level = Logger::Severity::INFO
6
+ require 'msg_extractor'
7
+ require 'word_wrap'
10
8
 
11
9
  module Libis
12
10
  module Format
@@ -15,45 +13,54 @@ module Libis
15
13
  protected
16
14
 
17
15
  def open_email(source)
16
+ msg = nil
17
+
18
18
  # Open the message
19
- Mapi::Msg.open(source)
19
+ msg = MsgExtractor.open(source)
20
+
21
+ unless msg.is_a?(MsgExtractor::Message)
22
+ raise "File #{File.basename(source)} is not an Outlook message but a #{msg.class.name}"
23
+ end
24
+
25
+ msg
26
+ rescue StandardError => e
27
+ raise "Failed to open message: #{e.message}"
20
28
  end
21
29
 
22
- def close_email(msg)
23
- msg.close
30
+ def close_email(_msg)
24
31
  true
25
32
  end
26
33
 
27
34
  def get_body_html(msg)
28
35
  # Get the body of the message in HTML
29
- body = msg.properties.body_html
36
+ body = msg.html_body
30
37
 
31
38
  # Embed plain body in HTML as a fallback
32
- body ||= HTML_WRAPPER_TEMPLATE % msg.properties.body
39
+ body ||= HTML_WRAPPER_TEMPLATE % WordWrap.ww(msg.body, 120, false)
33
40
 
34
41
  # Worst case, just create empty body
35
42
  body ||= HTML_WRAPPER_TEMPLATE % ''
36
43
 
37
- # Check and fix the character encoding
38
- begin
39
- # Try to encode into UTF-8
40
- body.encode!('UTF-8', universal_newline: true)
41
- rescue Encoding::InvalidByteSequenceError, Encoding::UndefinedConversionError
42
- begin
43
- # If it fails, the text may be in Windows' Latin1 (ISO-8859-1)
44
- body.force_encoding('ISO-8859-1').encode!('UTF-8', universal_newline: true)
45
- rescue Encoding::InvalidByteSequenceError, Encoding::UndefinedConversionError => e
46
- # If that fails too, log a warning and replace the invalid/unknown with a ? character.
47
- @warnings << "#{e.class}: #{e.message}"
48
- body.encode!('UTF-8', universal_newline: true, invalid: :replace, undef: :replace)
49
- end
50
- end
44
+ # # Check and fix the character encoding
45
+ # begin
46
+ # # Try to encode into UTF-8
47
+ # body.encode!('UTF-8', universal_newline: true)
48
+ # rescue Encoding::InvalidByteSequenceError, Encoding::UndefinedConversionError
49
+ # begin
50
+ # # If it fails, the text may be in Windows' Latin1 (ISO-8859-1)
51
+ # body.force_encoding('ISO-8859-1').encode!('UTF-8', universal_newline: true)
52
+ # rescue Encoding::InvalidByteSequenceError, Encoding::UndefinedConversionError => e
53
+ # # If that fails too, log a warning and replace the invalid/unknown with a ? character.
54
+ # @warnings << "#{e.class}: #{e.message}"
55
+ # body.encode!('UTF-8', universal_newline: true, invalid: :replace, undef: :replace)
56
+ # end
57
+ # end
51
58
 
52
59
  body
53
60
  end
54
61
 
55
62
  def get_subject(msg)
56
- find_hdr(msg.headers, 'Subject') || 'No Subject'
63
+ msg.subject || ''
57
64
  end
58
65
 
59
66
  def get_headers(msg)
@@ -61,17 +68,12 @@ module Libis
61
68
  html = ''
62
69
 
63
70
  %w[From To Cc Subject Date].each do |key|
64
- value = find_hdr(msg.headers, key)
71
+ value = find_hdr(msg, key)
65
72
  next unless value
66
73
 
67
- if key.casecmp('Date').zero?
68
- begin
69
- value = DateTime.parse(value).to_time.localtime
70
- headers[key.downcase.to_sym] = value.iso8601
71
- html += hdr_html(key, value.rfc2822)
72
- rescue StandardError => e
73
- logger.warn "Failed to parse date header '#{value}': #{e.message}"
74
- end
74
+ if key.casecmp('Date').zero? && value.is_a?(Time)
75
+ headers[key.downcase.to_sym] = value.iso8601
76
+ html += hdr_html(key, value.rfc2822)
75
77
  else
76
78
  headers[key.downcase.to_sym] = value
77
79
  html += hdr_html(key, value)
@@ -83,69 +85,67 @@ module Libis
83
85
 
84
86
  def get_inline_attachment_data(attachments, cid)
85
87
  attachments.each do |attachment|
86
- next unless attachment.properties.attach_content_id == cid
88
+ next unless attachment.content_id == cid
87
89
 
88
- attachment.data.rewind
89
90
  return {
90
- mime_type: attachment.properties.attach_mime_tag,
91
- base64: Base64.encode64(attachment.data.read).gsub(/[\r\n]/, '')
91
+ mime_type: attachment.mime_type,
92
+ base64: Base64.encode64(attachment.data).gsub(/[\r\n]/, '')
92
93
  }
93
94
  end
94
95
  nil
95
96
  end
96
97
 
97
- def get_file_attachments(attachments, used_files)
98
+ def get_file_attachments(attachments, _used_files)
98
99
  attachments.select do |attachment|
99
- !attachment.properties.attachment_hidden &&
100
- attachment.filename &&
101
- !attachment.filename.empty? &&
102
- !used_files.include?(attachment.filename)
100
+ !attachment.content_id && !attachment.embedded_message? && attachment.filename
103
101
  end
104
102
  end
105
103
 
106
104
  def get_mail_attachments(attachments)
107
- attachments.select do |attachment|
108
- !attachment.properties.attachment_hidden &&
109
- attachment.instance_variable_get(:@embedded_msg)
110
- end
105
+ attachments.select(&:embedded_message?)
111
106
  end
112
107
 
113
108
  def get_attachment_info(attachment)
114
- if (sub_msg = attachment.instance_variable_get(:@embedded_msg))
109
+ if attachment.embedded_message?
115
110
 
116
111
  {
117
- embedded_msg: sub_msg,
118
- filename: attachment.properties[:display_name] || sub_msg.subject || ''
112
+ embedded_msg: attachment.data,
113
+ filename: attachment.message&.subject || 'email'
119
114
  }
120
115
 
121
116
  elsif attachment.filename
122
- io = StringIO.new
123
- attachment.save(io)
124
- io.rewind
125
117
 
126
118
  {
127
- data: io.string,
119
+ data: attachment.data,
128
120
  filename: attachment.filename
129
121
  }
130
122
 
131
123
  else
132
124
  {
133
- filename: attachment.properties[:display_name] || 'unknown'
125
+ filename: attachment.mime_type || 'unknown'
134
126
  }
135
127
  end
136
128
  end
137
129
 
138
130
  private
139
131
 
140
- def find_hdr(list, key)
141
- keys = list.keys
142
- if (k = keys.find { |x| x.to_s =~ /^#{key}$/i })
143
- v = list[k]
144
- v = v.first if v.is_a? Array
145
- v = Rfc2047.decode(v).strip if v.is_a? String
146
- return v
132
+ def find_hdr(msg, key)
133
+ value = if key.casecmp('From').zero?
134
+ msg.sender
135
+ else
136
+ msg.send(key.downcase.to_sym)
137
+ end
138
+
139
+ if value.is_a?(Array)
140
+ value.compact.empty? ? nil : value.compact.map(&:to_s).join(', ')
141
+
142
+ elsif value.is_a?(Time)
143
+ value.localtime
144
+
145
+ else
146
+ value.to_s
147
+
147
148
  end
148
- nil
149
149
  end
150
150
  end
151
151
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Libis
4
4
  module Format
5
- VERSION = '1.3.8'
5
+ VERSION = '1.3.8.1'
6
6
  end
7
7
  end
data/libis-format.gemspec CHANGED
@@ -27,10 +27,11 @@ Gem::Specification.new do |spec|
27
27
 
28
28
  spec.add_runtime_dependency 'chromaprint', '~> 0.0.2'
29
29
  spec.add_runtime_dependency 'deep_dive', '~> 0.3'
30
- spec.add_runtime_dependency 'libis-mapi', '~> 0.3'
30
+ # spec.add_runtime_dependency 'libis-mapi', '~> 0.3'
31
31
  spec.add_runtime_dependency 'libis-tools', '~> 1.1'
32
32
  spec.add_runtime_dependency 'mail', '~> 2.9'
33
33
  spec.add_runtime_dependency 'mini_magick', '~> 5.0.1'
34
+ spec.add_runtime_dependency 'msg_extractor', '~> 0.1'
34
35
  spec.add_runtime_dependency 'naturally', '~> 2.2'
35
36
  spec.add_runtime_dependency 'new_rfc_2047', '~> 1.0'
36
37
  spec.add_runtime_dependency 'os', '~> 1.1'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libis-format
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.8
4
+ version: 1.3.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kris Dekeyser
@@ -38,61 +38,61 @@ dependencies:
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0.3'
40
40
  - !ruby/object:Gem::Dependency
41
- name: libis-mapi
41
+ name: libis-tools
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '0.3'
46
+ version: '1.1'
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0.3'
53
+ version: '1.1'
54
54
  - !ruby/object:Gem::Dependency
55
- name: libis-tools
55
+ name: mail
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.1'
60
+ version: '2.9'
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '1.1'
67
+ version: '2.9'
68
68
  - !ruby/object:Gem::Dependency
69
- name: mail
69
+ name: mini_magick
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '2.9'
74
+ version: 5.0.1
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '2.9'
81
+ version: 5.0.1
82
82
  - !ruby/object:Gem::Dependency
83
- name: mini_magick
83
+ name: msg_extractor
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: 5.0.1
88
+ version: '0.1'
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: 5.0.1
95
+ version: '0.1'
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: naturally
98
98
  requirement: !ruby/object:Gem::Requirement