从表单文件字段邮件附件并通过sidekiq发送邮件

时间:2015-07-21 05:03:35

标签: ruby-on-rails actionmailer sidekiq

在rails中,我想使用Action Mailer发送电子邮件,附件是从表单文件字段中获取的,并希望通过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

但是,由于文件不可访问,将引发IOError。

并且,我在控制器中执行文件读取操作

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

现在,我可以在Mailer中建立附件

attachments['attachment'] = message

现在,它确实可以正常工作但是由于安全原因,在控制器中读取文件非常糟糕。

所以,现在我想知道附加从表单获取的文件的最佳方法,并通过sidekiq发送。

1 个答案:

答案 0 :(得分:5)

在控制器中:
通过paramsFile中发送redis-serversidekiq对象等批量对象并不好。让我们简单

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尝试访问该tmp文件时,sidekiq-server (Background version)上传的后台处理文件sidekiq-server可能无法使用很长一段时间后忙于处理这个任务。

您的方法可能无效的条件

  • 当您转到生产并需要运行多个实例时。让我们 假设你需要一个单独的实用程序实例来运行sidekiqredis。然后,您的sidekiq-server无法找到tmp位置 application_master

  • sidekiq-server忙碌时 处理或停止一段时间并在很长一段时间后恢复