2

我正在使用'to_xls' gem 生成一个 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,它不喜欢写入文件(权限被拒绝)。最好的解决方案是生成类似文件的流数据(例如从 HTML 表单中获取文件)并发送它。

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

那么,我该怎么做呢?

4

2 回答 2

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,但可能仍然适用:

Ruby on Rails 中 send_data 与电子表格插件结合使用的困难

只是试图为您指明一个希望有帮助的方向!

于 2012-07-18T06:21:16.150 回答
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

于 2016-12-14T10:59:26.223 回答