2015-07-21 53 views
2

在rails中,我想使用Action Mailer發送電子郵件,附件是從窗體文件字段獲得的,並且希望通過sidekiq將其延遲。從窗體文件字段郵件附件並通過sidekiq發送郵件

我寫了下面的代碼。

鑑於:

<%= form_tag({ controller: 'my_controller', action: 'my_mail', method: 'post' }, { multipart: true }) do %> 
    <%= form_field_tag(:attachment) %> 
<% end %> 

在控制器:

def my_mail 
    MyMailer.delay.my_mail(params) 
end 

在梅勒:

def my_mail(message) 
    attachments['attachment'] = File.read(message[:attachment].tempfile) 
    mail(from: ENV['MY_MAIL'], to: ENV['MAIL_RECIVER'], subject: 'this is subject') 
end 

但是,IO錯誤會因無法進入到該文件提出。

而且,我執行文件的讀取控制器操作

def my_mail 
    MyMailer.delay.my_mail(File.read(params[:attachment].tempfile)) 
end 

現在,我可以使附着在梅勒作爲

attachments['attachment'] = message 

而現在,它的工作,因爲我想要的,但它是非常糟糕由於安全原因讀取控制器中的文件。

所以,現在我想知道附加從窗體獲得的文件並通過sidekiq發送它的最佳方式。

回答

1

在控制器:
它不是好發送大量的對象,如params和經由sidekiqFile對象redis-server。讓我們使它簡單

def my_mail 
    # get absolute path of temporary location uploaded file 
    attachment_tmp_path = File.absolute_path(params[:attachment].tempfile) 
    MyMailer.delay.my_mail(attachment_tmp_path) 
end 

在梅勒:

def my_mail(attachment_tmp_path) 
    attachments['attachment'] = File.read(attachment_tmp_path) 
    mail(from: ENV['MY_MAIL'], to: ENV['MAIL_RECIVER'], subject: 'this is subject') 
end 

爲什麼安全問題被警告?
直接使用params而不使用強參數來限制僅允許的屬性並不好。

注意
TMP上傳的文件可能無法使用總是像你已經使用sidekiq通過sidekiq-client上傳後臺處理文件可能不可用時sidekiq-server (Background version)試圖訪問tmp文件時sidekiq-server正在忙於處理後此任務很長很長時間。

條件你的方法可能無法正常工作

  • 當你轉到以生產,需要運行多個實例。讓 說你需要一個單獨的實用程序實例來運行sidekiqredis。那麼你的sidekiq-server不能找到tmp的位置 的application_master

  • 當你sidekiq-server忙於 處理或下跌一段時間,恢復後很長很長的時間

+0

是的,它與任何安全問題工作正常。謝謝@Cba –

+2

當您嘗試在Rails和Sidekiq之間傳遞臨時文件時,特定於主機的隊列變得非常有用:http://www.mikeperham.com/2013/11/13/advanced-sidekiq-host-specific-queues / –

相關問題