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 +4 -4
- data/lib/libis/format/tool/msg_to_pdf.rb +62 -62
- data/lib/libis/format/version.rb +1 -1
- data/libis-format.gemspec +2 -1
- metadata +13 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ec695a5009a2c131983af21f4c773037731907280eb229982eeacc8f7c72bf6b
|
|
4
|
+
data.tar.gz: 48139c18c6b66ddc9b25941dcbecee30294c3d7124d889dd74fae34b2a176c74
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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 '
|
|
7
|
-
require '
|
|
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
|
-
|
|
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(
|
|
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.
|
|
36
|
+
body = msg.html_body
|
|
30
37
|
|
|
31
38
|
# Embed plain body in HTML as a fallback
|
|
32
|
-
body ||= HTML_WRAPPER_TEMPLATE % msg.
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
rescue Encoding::InvalidByteSequenceError, Encoding::UndefinedConversionError
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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
|
|
71
|
+
value = find_hdr(msg, key)
|
|
65
72
|
next unless value
|
|
66
73
|
|
|
67
|
-
if key.casecmp('Date').zero?
|
|
68
|
-
|
|
69
|
-
|
|
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.
|
|
88
|
+
next unless attachment.content_id == cid
|
|
87
89
|
|
|
88
|
-
attachment.data.rewind
|
|
89
90
|
return {
|
|
90
|
-
mime_type: attachment.
|
|
91
|
-
base64: Base64.encode64(attachment.data
|
|
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,
|
|
98
|
+
def get_file_attachments(attachments, _used_files)
|
|
98
99
|
attachments.select do |attachment|
|
|
99
|
-
!attachment.
|
|
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
|
|
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
|
|
109
|
+
if attachment.embedded_message?
|
|
115
110
|
|
|
116
111
|
{
|
|
117
|
-
embedded_msg:
|
|
118
|
-
filename: attachment.
|
|
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:
|
|
119
|
+
data: attachment.data,
|
|
128
120
|
filename: attachment.filename
|
|
129
121
|
}
|
|
130
122
|
|
|
131
123
|
else
|
|
132
124
|
{
|
|
133
|
-
filename: attachment.
|
|
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(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
data/lib/libis/format/version.rb
CHANGED
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-
|
|
41
|
+
name: libis-tools
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
44
|
- - "~>"
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '
|
|
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: '
|
|
53
|
+
version: '1.1'
|
|
54
54
|
- !ruby/object:Gem::Dependency
|
|
55
|
-
name:
|
|
55
|
+
name: mail
|
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
58
|
- - "~>"
|
|
59
59
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '
|
|
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: '
|
|
67
|
+
version: '2.9'
|
|
68
68
|
- !ruby/object:Gem::Dependency
|
|
69
|
-
name:
|
|
69
|
+
name: mini_magick
|
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
|
71
71
|
requirements:
|
|
72
72
|
- - "~>"
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
|
-
version:
|
|
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:
|
|
81
|
+
version: 5.0.1
|
|
82
82
|
- !ruby/object:Gem::Dependency
|
|
83
|
-
name:
|
|
83
|
+
name: msg_extractor
|
|
84
84
|
requirement: !ruby/object:Gem::Requirement
|
|
85
85
|
requirements:
|
|
86
86
|
- - "~>"
|
|
87
87
|
- !ruby/object:Gem::Version
|
|
88
|
-
version:
|
|
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:
|
|
95
|
+
version: '0.1'
|
|
96
96
|
- !ruby/object:Gem::Dependency
|
|
97
97
|
name: naturally
|
|
98
98
|
requirement: !ruby/object:Gem::Requirement
|