ActionMailer 2.3.5破坏了我的zip附件

时间:2011-02-23 06:11:46

标签: ruby-on-rails binary zip actionmailer

我正在尝试使用带有ActionMailer 2.3.5的rails的zip附件发送电子邮件。

服务器上的zip文件是正确的(使用解压缩实用程序正确解压缩),但是收件人的zip文件已损坏。此外,添加附件会导致从电子邮件中删除邮件正文。

这种方法没什么了不起的:

attachment :content_type => "application/zip",
      :body => File.read(zip.path),
      :filename => File.basename(zip.path)

File.read周围显然出现了问题。当我在此处传递字符串而不是文件内容时,附件会正确显示。与二进制数据有关吗?

WTF?

5 个答案:

答案 0 :(得分:3)

问题是File.read将您的文件视为文本文件。 (我想你是在Windows上尝试这个)你必须指定模式强制它以二进制模式打开你的文件:

attachment :content_type => "application/zip",
  :body => File.read(zip.path, mode: 'rb'),
  :filename => File.basename(zip.path)

或者在Rails中> 3:

attachment[File.basename(zip.path)] = File.read(zip.path, mode: 'rb')

答案 1 :(得分:1)

如果您想要包含附件并保留身体(多部分邮件),您必须执行以下操作:

  def email(message)
    setup_mail(message)

    part       :content_type => "text/html", 
               :body => render_message("email", @body)

    attachment :content_type => 'application/zip', 
               :body => File.read(message[:file].path), 
               :filename => File.basename(zip.path)
  end

“电子邮件”是您的正文模板。

答案 2 :(得分:0)

尝试指定附件的编码:

attachment :content_type => "application/zip",
      :body => File.read(zip.path),
      :filename => File.basename(zip.path),
      :transfer_encoding => 'base64'

答案 3 :(得分:0)

可能您需要以二进制读取模式打开您的zip文件:

:body => File.open(zip.path, 'rb') {|f| f.read}

答案 4 :(得分:0)

我在项目中遇到了同样的问题。我混合了“mu太短”和“fivaiez”的解决方案。现在它有效。非常感谢大家的评论。以下是我的代码。

def sent(sent_at = Time.now)
  subject    'test attachment mail'
  recipients 'mail-list@company.com'
  from       'please_no_reply@company.com'
  sent_on    sent_at
  content_type "text/html"
  attachment :content_type => 'application/zip',
             :body => File.read("data/sample.zip"),
             :filename => 'sample.zip',
             :transfer_encoding => "base64"    
end