在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发送。
答案 0 :(得分:5)
在控制器中:
通过params
在File
中发送redis-server
和sidekiq
对象等批量对象并不好。让我们简单
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
可能无法使用很长一段时间后忙于处理这个任务。
您的方法可能无效的条件:
当您转到生产并需要运行多个实例时。让我们
假设你需要一个单独的实用程序实例来运行sidekiq
和
redis
。然后,您的sidekiq-server
无法找到tmp
位置
application_master
。
当sidekiq-server
忙碌时
处理或停止一段时间并在很长一段时间后恢复