2012-07-18 92 views
2

我正在使用'to_xls'創建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控制器方法,它將數據流發送到視圖而不生成新文件。

那麼,我該怎麼做呢?

回答

1

一些接近這一點,我可能已經得到MIME類型錯誤的,它在下面的代碼通用的,但我在Rails代碼使用行動郵件格式如下:

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

可能的類型可能是:

「應用/ EXCEL」 或 「應用程序/ vnd.ms - Excel的」,而不是 「應用程序/八位字節流」

我沒有測試過這...

此外,如果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

下面的代碼塊就像一個魅力。我已經嘗試過,並且正在運行中。

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: "[email protected]", bcc: bcc_emails) do |format| 
     format.html { render :partial => "users/mail_body"} 
    end 
    end 

FYI:我已經使用電子表格寶石創建Excel

相關問題