aboutsummaryrefslogtreecommitdiffstats
path: root/lib/tnef.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tnef.rb')
-rw-r--r--lib/tnef.rb40
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