使用xls附件发送邮件而不生成文件

时间:2012-07-18 01:29:54

标签: ruby-on-rails file attachment xls

我使用'to_xls'宝石生成xls。所以我喜欢:

my_xls = User.all.to_xls

现在我想用ActionMailer发送它,我试过这样:

attachments[my_xls.original_filename] =  {
   :content=>my_xls.read, 
   :mime_type=>my_xls.content_type
}

但令我惊讶的是,my_xls不是文件而是字符串。我想我可以通过打开一个新文件并将字符串写入它来解决这个问题,但我使用的是Heroku而且它不喜欢写入文件(Permission denied)。最好的解决方案是生成类似文件的流数据(比如从HTML表单中获取文件)并发送它。

我需要类似rails send_data控制器方法的东西,它会向视图发送数据流而不生成新文件。

那么,我该怎么做?

2 个答案:

答案 0 :(得分:1)

接近这个,我可能已经弄错了mime类型,它在下面的代码中是通用的,但我在我的rails代码中用于动作邮件的格式如下:

attachment "application/octet-stream" do |a|
  a.body = my_xls.read
  a.filename = my_xls.original_filename
end

可能的类型可能是:

“application / excel”或“application / vnd.ms-excel”而不是“application / octet-stream”

我没有测试过这个...

此外,如果my_xls是一个字符串,你可能需要在通过网络发送之前将其转换为字节:

my_xls.bytes.to_a.pack( “C *”)

有一个SOF主题在这里讨论这个,但这是针对send_data,但可能仍然适用:

Difficulty with send_data in Ruby on Rails in conjunction with Spreadsheet plug-in

试着指出一个有希望帮助的方向!

答案 1 :(得分:1)

下面的代码块就像一个魅力。我试过这个,并且正在使用它。

def send_excel_report(file_name, emails, subject, email_content, file_path, bcc_emails = [])

    attachments["#{file_name}.xls"] = File.read(file_path)

    mail(to: emails, subject: subject, from: "my_email@gmail.com", bcc: bcc_emails) do |format|
      format.html { render :partial => "users/mail_body"}
    end
  end

仅供参考:我使用了电子表格gem来创建excel