我使用'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控制器方法的东西,它会向视图发送数据流而不生成新文件。
那么,我该怎么做?
答案 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