我在 Ruby on Rails 应用程序中使用 ActionMailer 来阅读电子邮件(ruby 1.9.3,rails 3.2.13)。我有一封附有 winmail.dat 文件(ms-tnef)的电子邮件,我正在使用 tnef gem 来提取其内容。
问题是当我从邮件中读取附件时,它被损坏并且 tnef 无法从中提取文件。
$ tnef winmail.dat
ERROR: invalid checksum, input file may be corrupted
使用任何邮件应用程序提取 winmail.dat 附件,提取的 winmail.dat 可与 tnef 正常工作,我得到了它的内容。
比较这两个文件,我注意到: - 原始文件更大(76k 对 72k) - 它们在换行符上有所不同:原始文件具有 windows 格式(0D 0A),rails 保存的文件具有 linux 格式(0A)
我写了这个测试:
it 'should extract winmail.dat from email and extract its contents' do
file_path = "#{::Rails.root}/spec/files/winmail-dat-001.eml"
message = Mail::Message.new(File.read(file_path))
anexo = message.attachments[0]
files = []
Tnef.unpack(anexo) do |file|
files << File.basename(file)
end
puts files.inspect
files.size.should == 2
end
这些消息失败了:
WARNING: invalid checksum, input file may be corrupted
Invalid RTF CRC, input file may be corrupted
WARNING: invalid checksum, input file may be corrupted
Assertion failed: ((attr->lvl_type == LVL_MESSAGE) || (attr->lvl_type == LVL_ATTACHMENT)), function attr_read, file attr.c, line 240.
Errno::EPIPE: Broken pipe
anexo = message.attachments[0]
=> #<Mail::Part:2159872060, Multipart: false, Headers: <Content-Type: application/ms-tnef; name="winmail.dat">, <Content-Transfer-Encoding: quoted-printable>, <Content-Disposition: attachment; filename="winmail.dat">>
我试图将它作为二进制保存到磁盘,然后再次读取,但我得到了相同的结果
it 'should extract winmail.dat from email and extract its contents' do
file_path = "#{::Rails.root}/spec/files/winmail-dat-001.eml"
message = Mail::Message.new(File.read(file_path))
anexo = message.attachments[0]
tmpfile_name = "#{::Rails.root}/tmp/#{anexo.filename}"
File.open(tmpfile_name, 'w+b', 0644) { |f| f.write anexo.body.decoded }
anexo = File.open(tmpfile_name)
files = []
Tnef.unpack(anexo) do |file|
files << File.basename(file)
end
puts files.inspect
files.size.should == 2
end
我应该如何阅读附件?