发送带有xls附件的邮件而不生成文件



我正在使用'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 controller方法的东西,它可以在不生成新文件的情况下向视图发送数据流。

那么,我该怎么做呢?

类似于此,我可能弄错了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流"

我还没有测试过这个。。。

此外,如果my_xls是一个字符串,那么在通过有线发送之前,您可能必须将其转换为字节:

my_xls.bytes.to_a.back("C*")

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

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

只是试着给你指明一个方向,希望对你有所帮助!

下面的代码块就像一个符咒。我已经尝试过了,并且正在使用中。

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

最新更新