ruby-msg 1.5.1 → 1.5.3

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 94aa91f6a46340387923350f0eb5e758fd88ea6fe9042e2eeb3aa4e5830df910
4
+ data.tar.gz: d357f9db0d6af403d62f7707d82b70c6422ba18253335dce0f1c5b3a2ebefa9f
5
+ SHA512:
6
+ metadata.gz: 4b1f903559402d79634d44e2fe692ec4de5c106c059d6d402833cef0d51d5e12ffe5c1dcf57d0bd98461582b3129e2f3fc9d480f08ff11cb91b6388ec672f49d
7
+ data.tar.gz: a2ecce5b15c31678e1069d6482a75f73e168a16b71a2982f9d5c24b78ca8abf20015b8021584b02fd5294b07f9e1d87da12ce58166c05f014921f875b10eccc1
data/COPYING ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2007-2014 Charles Lowe
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
20
+
data/ChangeLog ADDED
@@ -0,0 +1,111 @@
1
+ == 1.5.3 / 2024-03-28
2
+
3
+ - Remove OrderedHash (github #12, mvz).
4
+ - Change project homepage to github and add .rdoc extension to README.
5
+ - Update wiki links in README to point to github not googlecode.
6
+ - Fix broken Attachment#save (github #14).
7
+
8
+ == 1.5.2 / 2014-08-20
9
+
10
+ - Move mime.rb file to avoid conflicts with mime_types gem (github #7,
11
+ blerins).
12
+ - Minor fix to mapitool for ruby >= 1.9.
13
+ - Alway require mapi/convert (indirect fix for missed step in README,
14
+ github #6).
15
+ - Various minor cleanups.
16
+
17
+ == 1.5.1 / 2012-07-03
18
+
19
+ - Fix handling of different body types (issue #14). Was breaking on
20
+ files without RTF content since 8933c26e, and also failing on files
21
+ where PR_BODY_HTML was a string rather than a stream.
22
+ - Move classes from RTF into Mapi::RTF (github #4).
23
+
24
+ == 1.5.0 / 2011-05-18
25
+
26
+ - Fixes for ruby 1.9.
27
+ - Move Mime into the Mapi module namespace (crowbot).
28
+ - Use ascii regex flag to avoid unicode probs (crowbot).
29
+
30
+ == 1.4.0 / 2008-10-12
31
+
32
+ - Initial simple msg test case.
33
+ - Update TODO, stripping out all the redundant ole stuff.
34
+ - Fix property set guids to use the new Ole::Types::Clsid type.
35
+ - Add block form of Msg.open
36
+ - Fix file requires for running tests individually.
37
+ - Update pst RangesIO subclasses for changes in ruby-ole.
38
+ - Merge initial pst reading code (converted from libpst).
39
+ - Pretty big pst refactoring, adding initial outlook 2003 pst support.
40
+ - Flesh out move to mapi to clean up the way pst hijacks the msg
41
+ classes currently.
42
+ - Add a ChangeLog :).
43
+ - Update README, by converting Home.wiki with wiki2rdoc converter.
44
+ - Separate out generic mapi object code from msg code, and separate out
45
+ conversion code.
46
+ - Add decent set of Mapi and Msg unit tests, approaching ~55% code coverage,
47
+ not including pst.
48
+ - Add TMail note conversion alternative, to eventually allow removal of
49
+ custom Mime class.
50
+ - Expose experimental pst support through renamed mapitool program.
51
+
52
+ == 1.3.1 / 2007-08-21
53
+
54
+ - Add fix for issue #2, and #4.
55
+ - Move ole code to ruby-ole project, and depend on it.
56
+
57
+ == 1.2.17 / 2007-05-13
58
+
59
+ (This was last release before splitting out ruby-ole. subsequent bug fix
60
+ point releases 1-3 were made directly on the gem, not reflected in the
61
+ repository, though the fixes were also forward-ported.)
62
+
63
+ - Update Ole::Storage backend, finalising api for split to separate
64
+ library.
65
+
66
+ == 1.2.16 / 2007-04-28
67
+
68
+ - Some minor fixes to msg parser.
69
+ - Extending RTF and body conversion support.
70
+ - Initial look at possible wmf conversion for embedded images.
71
+ - Add initial cli converter tool
72
+ - Add rdoc to ole/storage, and msg/properties
73
+ - Add streaming IO support to Ole::Storage, and use it in Msg::Properties
74
+ - Updates to test cases
75
+ - Add README, and update TODO
76
+ - Convert rtf support tools in c to small ruby class.
77
+ - Merge preliminary write support for Ole::Storage, as well as preliminary
78
+ filesystem api.
79
+
80
+ == 1.2.13 / 2007-01-22
81
+
82
+ - Nested msg support
83
+
84
+ == 1.2.10 / 2007-01-21
85
+
86
+ - Add initial vcard support.
87
+ - Implement a named properties map, for vcard conversion.
88
+ - Add orderedhash to Mime for keeping header order
89
+ - Fix line endings in lib/mime
90
+ - First released version
91
+
92
+ == <= 1.2.9 / 2007-01-11..2007-01-19
93
+
94
+ (Haven't bothered to note exact versions and dates - nothing here was released.
95
+ can look at history of lib/msg.rb to see exact VERSION at each commit.)
96
+
97
+ - Merged most of the named property work.
98
+ - Added some test files.
99
+ - Update svn:ignore, to exclude test messages and ole files which I can't
100
+ release. Need to get some clean files for use in test cases.
101
+ Also excluding source to the mapitags files for the moment.
102
+ A lot of it is not redistributable
103
+ - Added a converter to extract embedded html in rtf. Downloaded somewhere,
104
+ source unknown.
105
+ - Minor fix to ole/storage.rb, after new OleDir#type behaviour
106
+ - Imported support.rb, replacing previously required std.rb
107
+ - Added initial support for parsing times in Msg::Properties.
108
+ - Imported some rtf decompression code and minor updates.
109
+ - Cleaned up the ole class a bit
110
+ - Fixed OleDir#data method using sb_blocks map (see POLE).
111
+
@@ -118,11 +118,10 @@ support conversion to mime objects.
118
118
 
119
119
  For more information, see
120
120
 
121
- * TODO
121
+ * TODO[/aquasync/ruby-msg/wiki/TODO]
122
122
 
123
- * MsgDetails[http://code.google.com/p/ruby-msg/wiki/MsgDetails]
123
+ * MsgDetails[/aquasync/ruby-msg/wiki/MsgDetails]
124
124
 
125
- * PstDetails[http://code.google.com/p/ruby-msg/wiki/PstDetails]
126
-
127
- * OleDetails[http://code.google.com/p/ruby-ole/wiki/OleDetails]
125
+ * PstDetails[/aquasync/ruby-msg/wiki/PstDetails]
128
126
 
127
+ * OleDetails[/aquasync/ruby-msg/wiki/OleDetails]
data/Rakefile CHANGED
@@ -1,77 +1,52 @@
1
- require 'rake/rdoctask'
1
+ require 'rubygems'
2
2
  require 'rake/testtask'
3
- require 'rake/packagetask'
4
- require 'rake/gempackagetask'
5
3
 
6
4
  require 'rbconfig'
7
5
  require 'fileutils'
8
6
 
9
- $:.unshift 'lib'
10
-
11
- require 'mapi/msg'
12
-
13
- PKG_NAME = 'ruby-msg'
14
- PKG_VERSION = Mapi::VERSION
7
+ spec = eval File.read('ruby-msg.gemspec')
15
8
 
16
9
  task :default => [:test]
17
10
 
18
- Rake::TestTask.new(:test) do |t|
11
+ Rake::TestTask.new do |t|
19
12
  t.test_files = FileList["test/test_*.rb"] - ['test/test_pst.rb']
20
13
  t.warning = false
21
14
  t.verbose = true
22
15
  end
23
16
 
24
17
  begin
25
- require 'rcov/rcovtask'
26
- # NOTE: this will not do anything until you add some tests
27
- desc "Create a cross-referenced code coverage report"
28
- Rcov::RcovTask.new do |t|
29
- t.test_files = FileList['test/test*.rb']
30
- t.ruby_opts << "-Ilib" # in order to use this rcov
31
- t.rcov_opts << "--xrefs" # comment to disable cross-references
32
- t.rcov_opts << "--exclude /usr/local/lib/site_ruby"
18
+ Rake::TestTask.new(:coverage) do |t|
19
+ t.test_files = FileList["test/test_*.rb"] - ['test/test_pst.rb']
20
+ t.warning = false
33
21
  t.verbose = true
22
+ t.ruby_opts = ['-rsimplecov -e "SimpleCov.start; load(ARGV.shift)"']
34
23
  end
35
24
  rescue LoadError
36
- # Rcov not available
37
- end
38
-
39
- Rake::RDocTask.new do |t|
40
- t.rdoc_dir = 'doc'
41
- t.title = "#{PKG_NAME} documentation"
42
- t.options += %w[--main README --line-numbers --inline-source --tab-width 2]
43
- t.rdoc_files.include 'lib/**/*.rb'
44
- t.rdoc_files.include 'README'
25
+ # SimpleCov not available
45
26
  end
46
27
 
47
- spec = Gem::Specification.new do |s|
48
- s.name = PKG_NAME
49
- s.version = PKG_VERSION
50
- s.summary = %q{Ruby Msg library.}
51
- s.description = %q{A library for reading and converting Outlook msg and pst files (mapi message stores).}
52
- s.authors = ["Charles Lowe"]
53
- s.email = %q{aquasync@gmail.com}
54
- s.homepage = %q{http://code.google.com/p/ruby-msg}
55
- s.rubyforge_project = %q{ruby-msg}
56
-
57
- s.executables = ['mapitool']
58
- s.files = FileList['data/*.yaml', 'Rakefile', 'README', 'FIXES']
59
- s.files += FileList['lib/**/*.rb', 'test/test_*.rb', 'bin/*']
60
-
61
- s.has_rdoc = true
62
- s.extra_rdoc_files = ['README']
63
- s.rdoc_options += ['--main', 'README',
64
- '--title', "#{PKG_NAME} documentation",
65
- '--tab-width', '2']
66
-
67
- s.add_dependency 'ruby-ole', '>=1.2.8'
68
- s.add_dependency 'vpim', '>=0.360'
28
+ begin
29
+ require 'rdoc/task'
30
+ RDoc::Task.new do |t|
31
+ t.rdoc_dir = 'doc'
32
+ t.rdoc_files.include 'lib/**/*.rb'
33
+ t.rdoc_files.include 'README', 'ChangeLog'
34
+ t.title = "#{PKG_NAME} documentation"
35
+ t.options += %w[--line-numbers --inline-source --tab-width 2]
36
+ t.main = 'README'
37
+ end
38
+ rescue LoadError
39
+ # RDoc not available or too old (<2.4.2)
69
40
  end
70
41
 
71
- Rake::GemPackageTask.new(spec) do |p|
72
- p.gem_spec = spec
73
- p.need_tar = false #true
74
- p.need_zip = false
75
- p.package_dir = 'build'
42
+ begin
43
+ require 'rubygems/package_task'
44
+ Gem::PackageTask.new(spec) do |t|
45
+ t.need_tar = true
46
+ t.need_zip = false
47
+ t.package_dir = 'build'
48
+ end
49
+ rescue LoadError
50
+ # RubyGems too old (<1.3.2)
76
51
  end
77
52
 
data/bin/mapitool CHANGED
@@ -6,7 +6,6 @@ require 'optparse'
6
6
  require 'rubygems'
7
7
  require 'mapi/msg'
8
8
  require 'mapi/pst'
9
- require 'mapi/convert'
10
9
  require 'time'
11
10
 
12
11
  class Mapitool
@@ -107,7 +106,7 @@ class Mapitool
107
106
  # is the only one that can be robuslty un-quoted. evolution doesn't use this!
108
107
  f.puts "From mapitool@localhost #{Time.now.rfc2822}"
109
108
  #munge_headers mime, opts
110
- data.each do |line|
109
+ data.lines.each do |line|
111
110
  if line =~ /^>*From /o
112
111
  f.print '>' + line
113
112
  else
data/lib/mapi/base.rb ADDED
@@ -0,0 +1,104 @@
1
+ module Mapi
2
+ #
3
+ # Mapi::Item is the base class used for all mapi objects, and is purely a
4
+ # property set container
5
+ #
6
+ class Item
7
+ attr_reader :properties
8
+ alias props properties
9
+
10
+ # +properties+ should be a PropertySet instance.
11
+ def initialize properties
12
+ @properties = properties
13
+ end
14
+ end
15
+
16
+ # a general attachment class. is subclassed by Msg and Pst attachment classes
17
+ class Attachment < Item
18
+ def filename
19
+ props.attach_long_filename || props.attach_filename
20
+ end
21
+
22
+ def data
23
+ @embedded_msg || @embedded_ole || props.attach_data
24
+ end
25
+
26
+ # with new stream work, its possible to not have the whole thing in memory at one time,
27
+ # just to save an attachment
28
+ #
29
+ # a = msg.attachments.first
30
+ # a.save open(File.basename(a.filename || 'attachment'), 'wb')
31
+ def save io
32
+ raise "can only save binary data blobs, not ole dirs" if @embedded_ole
33
+ data.rewind
34
+ io << data.read(8192) until data.eof?
35
+ end
36
+
37
+ def inspect
38
+ "#<#{self.class.to_s[/\w+$/]}" +
39
+ (filename ? " filename=#{filename.inspect}" : '') +
40
+ (@embedded_ole ? " embedded_type=#{@embedded_ole.embedded_type.inspect}" : '') + ">"
41
+ end
42
+ end
43
+
44
+ class Recipient < Item
45
+ # some kind of best effort guess for converting to standard mime style format.
46
+ # there are some rules for encoding non 7bit stuff in mail headers. should obey
47
+ # that here, as these strings could be unicode
48
+ # email_address will be an EX:/ address (X.400?), unless external recipient. the
49
+ # other two we try first.
50
+ # consider using entry id for this too.
51
+ def name
52
+ name = props.transmittable_display_name || props.display_name
53
+ # dequote
54
+ name[/^'(.*)'/, 1] or name rescue nil
55
+ end
56
+
57
+ def email
58
+ props.smtp_address || props.org_email_addr || props.email_address
59
+ end
60
+
61
+ RECIPIENT_TYPES = { 0 => :orig, 1 => :to, 2 => :cc, 3 => :bcc }
62
+ def type
63
+ RECIPIENT_TYPES[props.recipient_type]
64
+ end
65
+
66
+ def to_s
67
+ if name = self.name and !name.empty? and email && name != email
68
+ %{"#{name}" <#{email}>}
69
+ else
70
+ email || name
71
+ end
72
+ end
73
+
74
+ def inspect
75
+ "#<#{self.class.to_s[/\w+$/]}:#{self.to_s.inspect}>"
76
+ end
77
+ end
78
+
79
+ # i refer to it as a message (as does mapi), although perhaps Item is better, as its a more general
80
+ # concept than a message, as used in Pst files. though maybe i'll switch to using
81
+ # Mapi::Object as the base class there.
82
+ #
83
+ # IMessage essentially, but there's also stuff like IMAPIFolder etc. so, for this to form
84
+ # basis for PST Item, it'd need to be more general.
85
+ class Message < Item
86
+ # these 2 collections should be provided by our subclasses
87
+ def attachments
88
+ raise NotImplementedError
89
+ end
90
+
91
+ def recipients
92
+ raise NotImplementedError
93
+ end
94
+
95
+ def inspect
96
+ str = %w[message_class from to subject].map do |key|
97
+ " #{key}=#{props.send(key).inspect}"
98
+ end.compact.join
99
+ str << " recipients=#{recipients.inspect}"
100
+ str << " attachments=#{attachments.inspect}"
101
+ "#<#{self.class.to_s[/\w+$/]}#{str}>"
102
+ end
103
+ end
104
+ end
@@ -1,5 +1,5 @@
1
1
  require 'base64'
2
- require 'mime'
2
+ require 'mapi/mime'
3
3
  require 'time'
4
4
 
5
5
  # there is still some Msg specific stuff in here.
@@ -214,7 +214,7 @@ module Mapi
214
214
  next if mime.headers.keys.map(&:downcase).include? key.downcase
215
215
  mime.headers[key] += vals
216
216
  end
217
- # just a stupid hack to make the content-type header last, when using OrderedHash
217
+ # just a stupid hack to make the content-type header last
218
218
  mime.headers['Content-Type'] = mime.headers.delete 'Content-Type'
219
219
 
220
220
  mime
@@ -3,7 +3,7 @@ require 'tmail'
3
3
 
4
4
  # these will be removed later
5
5
  require 'time'
6
- require 'mime'
6
+ require 'mapi/mime'
7
7
 
8
8
  # there is some Msg specific stuff in here.
9
9
 
@@ -226,7 +226,7 @@ module Mapi
226
226
  #next if mime.headers.keys.map(&:downcase).include? key.downcase
227
227
  mail[key] = vals.first
228
228
  end
229
- # just a stupid hack to make the content-type header last, when using OrderedHash
229
+ # just a stupid hack to make the content-type header last
230
230
  #mime.headers['Content-Type'] = mime.headers.delete 'Content-Type'
231
231
 
232
232
  mail
@@ -13,7 +13,6 @@
13
13
  # = TODO
14
14
  #
15
15
  # * Better streaming support, rather than an all-in-string approach.
16
- # * Add +OrderedHash+ optionally, to not lose ordering in headers.
17
16
  # * A fair bit remains to be done for this class, its fairly immature. But generally I'd like
18
17
  # to see it be more generally useful.
19
18
  # * All sorts of correctness issues, encoding particular.
@@ -23,13 +22,6 @@
23
22
  #
24
23
  module Mapi
25
24
  class Mime
26
- Hash = begin
27
- require 'orderedhash'
28
- OrderedHash
29
- rescue LoadError
30
- Hash
31
- end
32
-
33
25
  attr_reader :headers, :body, :parts, :content_type, :preamble, :epilogue
34
26
 
35
27
  # Create a Mime object using +str+ as an initial serialization, which must contain headers
@@ -0,0 +1,3 @@
1
+ module Mapi
2
+ VERSION = '1.5.3'
3
+ end
data/lib/mapi.rb CHANGED
@@ -1,109 +1,5 @@
1
+ require 'mapi/version'
2
+ require 'mapi/base'
1
3
  require 'mapi/types'
2
4
  require 'mapi/property_set'
3
-
4
- module Mapi
5
- VERSION = '1.5.1'
6
-
7
- #
8
- # Mapi::Item is the base class used for all mapi objects, and is purely a
9
- # property set container
10
- #
11
- class Item
12
- attr_reader :properties
13
- alias props properties
14
-
15
- # +properties+ should be a PropertySet instance.
16
- def initialize properties
17
- @properties = properties
18
- end
19
- end
20
-
21
- # a general attachment class. is subclassed by Msg and Pst attachment classes
22
- class Attachment < Item
23
- def filename
24
- props.attach_long_filename || props.attach_filename
25
- end
26
-
27
- def data
28
- @embedded_msg || @embedded_ole || props.attach_data
29
- end
30
-
31
- # with new stream work, its possible to not have the whole thing in memory at one time,
32
- # just to save an attachment
33
- #
34
- # a = msg.attachments.first
35
- # a.save open(File.basename(a.filename || 'attachment'), 'wb')
36
- def save io
37
- raise "can only save binary data blobs, not ole dirs" if @embedded_ole
38
- data.each_read { |chunk| io << chunk }
39
- end
40
-
41
- def inspect
42
- "#<#{self.class.to_s[/\w+$/]}" +
43
- (filename ? " filename=#{filename.inspect}" : '') +
44
- (@embedded_ole ? " embedded_type=#{@embedded_ole.embedded_type.inspect}" : '') + ">"
45
- end
46
- end
47
-
48
- class Recipient < Item
49
- # some kind of best effort guess for converting to standard mime style format.
50
- # there are some rules for encoding non 7bit stuff in mail headers. should obey
51
- # that here, as these strings could be unicode
52
- # email_address will be an EX:/ address (X.400?), unless external recipient. the
53
- # other two we try first.
54
- # consider using entry id for this too.
55
- def name
56
- name = props.transmittable_display_name || props.display_name
57
- # dequote
58
- name[/^'(.*)'/, 1] or name rescue nil
59
- end
60
-
61
- def email
62
- props.smtp_address || props.org_email_addr || props.email_address
63
- end
64
-
65
- RECIPIENT_TYPES = { 0 => :orig, 1 => :to, 2 => :cc, 3 => :bcc }
66
- def type
67
- RECIPIENT_TYPES[props.recipient_type]
68
- end
69
-
70
- def to_s
71
- if name = self.name and !name.empty? and email && name != email
72
- %{"#{name}" <#{email}>}
73
- else
74
- email || name
75
- end
76
- end
77
-
78
- def inspect
79
- "#<#{self.class.to_s[/\w+$/]}:#{self.to_s.inspect}>"
80
- end
81
- end
82
-
83
- # i refer to it as a message (as does mapi), although perhaps Item is better, as its a more general
84
- # concept than a message, as used in Pst files. though maybe i'll switch to using
85
- # Mapi::Object as the base class there.
86
- #
87
- # IMessage essentially, but there's also stuff like IMAPIFolder etc. so, for this to form
88
- # basis for PST Item, it'd need to be more general.
89
- class Message < Item
90
- # these 2 collections should be provided by our subclasses
91
- def attachments
92
- raise NotImplementedError
93
- end
94
-
95
- def recipients
96
- raise NotImplementedError
97
- end
98
-
99
- def inspect
100
- str = %w[message_class from to subject].map do |key|
101
- " #{key}=#{props.send(key).inspect}"
102
- end.compact.join
103
- str << " recipients=#{recipients.inspect}"
104
- str << " attachments=#{attachments.inspect}"
105
- "#<#{self.class.to_s[/\w+$/]}#{str}>"
106
- end
107
- end
108
- end
109
-
5
+ require 'mapi/convert'
data/ruby-msg.gemspec ADDED
@@ -0,0 +1,35 @@
1
+ $:.unshift File.dirname(__FILE__) + '/lib'
2
+ require 'mapi/version'
3
+
4
+ PKG_NAME = 'ruby-msg'
5
+ PKG_VERSION = Mapi::VERSION
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = PKG_NAME
9
+ s.version = PKG_VERSION
10
+ s.summary = %q{Ruby Msg library.}
11
+ s.description = %q{A library for reading and converting Outlook msg and pst files (mapi message stores).}
12
+ s.authors = ['Charles Lowe']
13
+ s.email = %q{aquasync@gmail.com}
14
+ s.homepage = %q{https://github.com/aquasync/ruby-msg}
15
+ s.rubyforge_project = %q{ruby-msg}
16
+
17
+ s.executables = ['mapitool']
18
+ s.files = ['README.rdoc', 'COPYING', 'Rakefile', 'ChangeLog', 'ruby-msg.gemspec']
19
+ s.files += Dir.glob('data/*.yaml')
20
+ s.files += Dir.glob('lib/**/*.rb')
21
+ s.files += Dir.glob('test/test_*.rb')
22
+ s.files += Dir.glob('bin/*')
23
+
24
+ s.has_rdoc = true
25
+ s.extra_rdoc_files = ['README.rdoc', 'ChangeLog']
26
+ s.rdoc_options += [
27
+ '--main', 'README.rdoc',
28
+ '--title', "#{PKG_NAME} documentation",
29
+ '--tab-width', '2'
30
+ ]
31
+
32
+ s.add_dependency 'ruby-ole', '>=1.2.8'
33
+ s.add_dependency 'vpim', '>=0.360'
34
+ end
35
+
data/test/test_mime.rb CHANGED
@@ -1,10 +1,9 @@
1
1
  #! /usr/bin/ruby -w
2
2
 
3
- TEST_DIR = File.dirname __FILE__
4
- $: << "#{TEST_DIR}/../lib"
3
+ $: << File.dirname(__FILE__) + '/../lib'
5
4
 
6
5
  require 'test/unit'
7
- require 'mime'
6
+ require 'mapi/mime'
8
7
 
9
8
  class TestMime < Test::Unit::TestCase
10
9
  # test out the way it partitions a message into parts
metadata CHANGED
@@ -1,126 +1,107 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ruby-msg
3
- version: !ruby/object:Gem::Version
4
- hash: 1
5
- prerelease: false
6
- segments:
7
- - 1
8
- - 5
9
- - 1
10
- version: 1.5.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.5.3
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Charles Lowe
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2012-07-03 00:00:00 +10:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2024-03-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: ruby-ole
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
27
17
  - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 15
30
- segments:
31
- - 1
32
- - 2
33
- - 8
18
+ - !ruby/object:Gem::Version
34
19
  version: 1.2.8
35
20
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: vpim
39
21
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
43
24
  - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 731
46
- segments:
47
- - 0
48
- - 360
49
- version: "0.360"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.8
27
+ - !ruby/object:Gem::Dependency
28
+ name: vpim
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0.360'
50
34
  type: :runtime
51
- version_requirements: *id002
52
- description: A library for reading and converting Outlook msg and pst files (mapi message stores).
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0.360'
41
+ description: A library for reading and converting Outlook msg and pst files (mapi
42
+ message stores).
53
43
  email: aquasync@gmail.com
54
- executables:
44
+ executables:
55
45
  - mapitool
56
46
  extensions: []
57
-
58
- extra_rdoc_files:
59
- - README
60
- files:
61
- - data/mapitags.yaml
62
- - data/types.yaml
63
- - data/named_map.yaml
47
+ extra_rdoc_files:
48
+ - README.rdoc
49
+ - ChangeLog
50
+ files:
51
+ - COPYING
52
+ - ChangeLog
53
+ - README.rdoc
64
54
  - Rakefile
65
- - README
66
- - FIXES
67
55
  - bin/mapitool
56
+ - data/mapitags.yaml
57
+ - data/named_map.yaml
58
+ - data/types.yaml
68
59
  - lib/mapi.rb
69
- - lib/mime.rb
70
- - lib/orderedhash.rb
71
- - lib/mapi/rtf.rb
72
- - lib/mapi/property_set.rb
60
+ - lib/mapi/base.rb
61
+ - lib/mapi/convert.rb
73
62
  - lib/mapi/convert/contact.rb
74
63
  - lib/mapi/convert/note-mime.rb
75
64
  - lib/mapi/convert/note-tmail.rb
65
+ - lib/mapi/mime.rb
66
+ - lib/mapi/msg.rb
67
+ - lib/mapi/property_set.rb
76
68
  - lib/mapi/pst.rb
77
- - lib/mapi/convert.rb
69
+ - lib/mapi/rtf.rb
78
70
  - lib/mapi/types.rb
79
- - lib/mapi/msg.rb
80
- - test/test_property_set.rb
71
+ - lib/mapi/version.rb
72
+ - ruby-msg.gemspec
73
+ - test/test_convert_contact.rb
81
74
  - test/test_convert_note.rb
82
75
  - test/test_mime.rb
83
- - test/test_convert_contact.rb
84
- - test/test_types.rb
85
76
  - test/test_msg.rb
86
- has_rdoc: true
87
- homepage: http://code.google.com/p/ruby-msg
77
+ - test/test_property_set.rb
78
+ - test/test_types.rb
79
+ homepage: https://github.com/aquasync/ruby-msg
88
80
  licenses: []
89
-
81
+ metadata: {}
90
82
  post_install_message:
91
- rdoc_options:
92
- - --main
93
- - README
94
- - --title
83
+ rdoc_options:
84
+ - "--main"
85
+ - README.rdoc
86
+ - "--title"
95
87
  - ruby-msg documentation
96
- - --tab-width
97
- - "2"
98
- require_paths:
88
+ - "--tab-width"
89
+ - '2'
90
+ require_paths:
99
91
  - lib
100
- required_ruby_version: !ruby/object:Gem::Requirement
101
- none: false
102
- requirements:
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
103
94
  - - ">="
104
- - !ruby/object:Gem::Version
105
- hash: 3
106
- segments:
107
- - 0
108
- version: "0"
109
- required_rubygems_version: !ruby/object:Gem::Requirement
110
- none: false
111
- requirements:
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
112
99
  - - ">="
113
- - !ruby/object:Gem::Version
114
- hash: 3
115
- segments:
116
- - 0
117
- version: "0"
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
118
102
  requirements: []
119
-
120
- rubyforge_project: ruby-msg
121
- rubygems_version: 1.3.7
103
+ rubygems_version: 3.1.2
122
104
  signing_key:
123
- specification_version: 3
105
+ specification_version: 4
124
106
  summary: Ruby Msg library.
125
107
  test_files: []
126
-
data/FIXES DELETED
@@ -1,56 +0,0 @@
1
- FIXES
2
-
3
- recent fixes based on importing results into evolution
4
-
5
- 1. was running into some issue with base64 encoded message/rfc822 attachments displaying
6
- as empty. encoding them as plain solved the issue (odd).
7
-
8
- 2. problem with a large percentage of emails, not displaying as mime. turned out to be
9
- all received from blackberry. further, turned out there was 2 content-type headers,
10
- "Content-Type", which I add, and "Content-type". normally my override works, but I
11
- need to handle it case insensitvely it would appear. more tricky, whats the story
12
- with these. fixing that will probably fix that whole class of issues there.
13
- evolution was renaming my second content type as X-Invalid-Content-Type or something.
14
-
15
- 3. another interesting one. had content-transfer-encoding set in the transport message
16
- headers. it was set to base64. i didn't override that, so evolution "decoded" my
17
- plaintext message into complete garbage.
18
- fix - delete content-transfer-encoding.
19
-
20
- 4. added content-location and content-id output in the mime handling of attachments
21
- to get some inline html/image mails to work properly.
22
- further, the containing mime content-type must be multipart/related, not multipart/mixed,
23
- at least for evolution, in order for the images to appear inline.
24
- could still improve in this area. if someone drags and drops in an image, it may
25
- be inline in the rtf version, but exchanges generates crappy html such that the image
26
- doesn't display inline. maybe i should correct the html output in these cases as i'm
27
- throwing away the rtf version.
28
-
29
- 5. note you may need wingdings installed. i had a lot of L and J appear in messages from
30
- outlook users. turns out its smilies in wingdings. i think its only if word is used
31
- as email editor and has autotext messing things up.
32
-
33
- 6. still unsure about how to do my "\r" handling.
34
-
35
- 7. need to join addresses with , instead of ; i think. evolution only shows the
36
- first one otherwise it appears, but all when they are , separated.
37
-
38
- 8. need to solve ole storage issues with the very large file using extra bat
39
- stuff.
40
-
41
- 9. retest a bit on evolution and thunderbird, and release. tested on a corups
42
- of >1000 msg files, so should be starting to get pretty good quality.
43
-
44
- 10. longer term, things fall into a few basic categories:
45
-
46
- - non mail conversions (look further into vcard, ical et al support for other
47
- types of msg)
48
- - further tests and robustness for what i handle now. ie, look into corner
49
- cases covered so far, and work on the mime code. fix random charset encoding
50
- issues, in the various weird mime ways, do header wrapping etc etc.
51
- check fidelity of conversions, and capture some more properties as headers,
52
- such as importance which i don't do yet.
53
- - fix that named property bug. tidy up warnings, exceptions.
54
- - extend conversion to make better html.
55
- this is longer term. as i don't use the rtf, i need to make my html better.
56
- emulating some rtf things. harder, not important atm.
data/lib/orderedhash.rb DELETED
@@ -1,218 +0,0 @@
1
- # = OrderedHash
2
- #
3
- # == Version
4
- # 1.2006.07.13 (change of the first number means Big Change)
5
- #
6
- # == Description
7
- # Hash which preserves order of added items (like PHP array).
8
- #
9
- # == Usage
10
- #
11
- # (see examples directory under the ruby gems root directory)
12
- #
13
- # require 'rubygems'
14
- # require 'ordered_hash'
15
- #
16
- # hsh = OrderedHash.new
17
- # hsh['z'] = 1
18
- # hsh['a'] = 2
19
- # hsh['c'] = 3
20
- # p hsh.keys # ['z','a','c']
21
- #
22
- # == Source
23
- # http://simplypowerful.1984.cz/goodlibs/1.2006.07.13
24
- #
25
- # == Author
26
- # jan molic (/mig/at_sign/1984/dot/cz/)
27
- #
28
- # == Thanks to
29
- # Andrew Johnson for his suggestions and fixes of Hash[], merge, to_a, inspect and shift
30
- # Desmond Dsouza for == fixes
31
- #
32
- # == Licence
33
- # You can redistribute it and/or modify it under the same terms of Ruby's license;
34
- # either the dual license version in 2003, or any later version.
35
- #
36
-
37
- class OrderedHash < Hash
38
-
39
- attr_accessor :order
40
-
41
- class << self
42
-
43
- def [] *args
44
- hsh = OrderedHash.new
45
- if Hash === args[0]
46
- hsh.replace args[0]
47
- elsif (args.size % 2) != 0
48
- raise ArgumentError, "odd number of elements for Hash"
49
- else
50
- hsh[args.shift] = args.shift while args.size > 0
51
- end
52
- hsh
53
- end
54
-
55
- end
56
-
57
- def initialize(*a, &b)
58
- super
59
- @order = []
60
- end
61
-
62
- def store_only a,b
63
- store a,b
64
- end
65
-
66
- alias orig_store store
67
-
68
- def store a,b
69
- @order.push a unless has_key? a
70
- super a,b
71
- end
72
-
73
- alias []= store
74
-
75
- def == hsh2
76
- return hsh2==self if !hsh2.is_a?(OrderedHash)
77
- return false if @order != hsh2.order
78
- super hsh2
79
- end
80
-
81
- def clear
82
- @order = []
83
- super
84
- end
85
-
86
- def delete key
87
- @order.delete key
88
- super
89
- end
90
-
91
- def each_key
92
- @order.each { |k| yield k }
93
- self
94
- end
95
-
96
- def each_value
97
- @order.each { |k| yield self[k] }
98
- self
99
- end
100
-
101
- def each
102
- @order.each { |k| yield k,self[k] }
103
- self
104
- end
105
-
106
- alias each_pair each
107
-
108
- def delete_if
109
- @order.clone.each { |k|
110
- delete k if yield
111
- }
112
- self
113
- end
114
-
115
- def values
116
- ary = []
117
- @order.each { |k| ary.push self[k] }
118
- ary
119
- end
120
-
121
- def keys
122
- @order
123
- end
124
-
125
- def invert
126
- hsh2 = Hash.new
127
- @order.each { |k| hsh2[self[k]] = k }
128
- hsh2
129
- end
130
-
131
- def reject &block
132
- self.dup.delete_if( &block )
133
- end
134
-
135
- def reject! &block
136
- hsh2 = reject( &block )
137
- self == hsh2 ? nil : hsh2
138
- end
139
-
140
- def replace hsh2
141
- @order = hsh2.keys
142
- super hsh2
143
- end
144
-
145
- def shift
146
- key = @order.first
147
- key ? [key,delete(key)] : super
148
- end
149
-
150
- def unshift k,v
151
- unless self.include? k
152
- @order.unshift k
153
- orig_store(k,v)
154
- true
155
- else
156
- false
157
- end
158
- end
159
-
160
- def push k,v
161
- unless self.include? k
162
- @order.push k
163
- orig_store(k,v)
164
- true
165
- else
166
- false
167
- end
168
- end
169
-
170
- def pop
171
- key = @order.last
172
- key ? [key,delete(key)] : nil
173
- end
174
-
175
- def first
176
- self[@order.first]
177
- end
178
-
179
- def last
180
- self[@order.last]
181
- end
182
-
183
- def to_a
184
- ary = []
185
- each { |k,v| ary << [k,v] }
186
- ary
187
- end
188
-
189
- def to_s
190
- self.to_a.to_s
191
- end
192
-
193
- def inspect
194
- ary = []
195
- each {|k,v| ary << k.inspect + "=>" + v.inspect}
196
- '{' + ary.join(", ") + '}'
197
- end
198
-
199
- def update hsh2
200
- hsh2.each { |k,v| self[k] = v }
201
- self
202
- end
203
-
204
- alias :merge! update
205
-
206
- def merge hsh2
207
- self.dup update(hsh2)
208
- end
209
-
210
- def select
211
- ary = []
212
- each { |k,v| ary << [k,v] if yield k,v }
213
- ary
214
- end
215
-
216
- end
217
-
218
- #=end