diff options
Diffstat (limited to 'lib/tnef.rb')
-rw-r--r-- | lib/tnef.rb | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/tnef.rb b/lib/tnef.rb new file mode 100644 index 000000000..ff88b0005 --- /dev/null +++ b/lib/tnef.rb @@ -0,0 +1,40 @@ +require 'tmpdir' + +class TNEF + + # Extracts all attachments from the given TNEF file as a TMail::Mail object + # The TNEF file also contains the message body, but in general this is the + # same as the message body in the message proper. + def self.as_tmail(content) + main = TMail::Mail.new + main.set_content_type 'multipart', 'mixed', { 'boundary' => TMail.new_boundary } + Dir.mktmpdir do |dir| + IO.popen("/usr/bin/tnef -K -C #{dir}", "w") do |f| + f.write(content) + f.close + if $?.signaled? + raise IOError, "tnef exited with signal #{$?.termsig}" + end + if $?.exited? && $?.exitstatus != 0 + raise IOError, "tnef exited with status #{$?.exitstatus}" + end + end + found = 0 + Dir.new(dir).sort.each do |file| # sort for deterministic behaviour + if file != "." && file != ".." + file_content = File.open("#{dir}/#{file}", "r").read + attachment = TMail::Mail.new + attachment['content-location'] = file + attachment.body = file_content + main.parts << attachment + found += 1 + end + end + if found == 0 + raise IOError, "tnef produced no attachments" + end + end + main + end + +end |