Shr*_*ane 2 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 %>
Run Code Online (Sandbox Code Playgroud)
在控制器中:
def my_mail
MyMailer.delay.my_mail(params)
end
Run Code Online (Sandbox Code Playgroud)
在Mailer中:
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
Run Code Online (Sandbox Code Playgroud)
但是,由于无法访问文件,将引发IOError。
而且,我在控制器中执行文件读取操作
def my_mail
MyMailer.delay.my_mail(File.read(params[:attachment].tempfile))
end
Run Code Online (Sandbox Code Playgroud)
现在,我可以在Mailer中添加附件为
attachments['attachment'] = message
Run Code Online (Sandbox Code Playgroud)
现在,它确实可以按我的要求工作,但是由于安全原因,在控制器中读取文件非常糟糕。
所以,现在我想知道附加从表单获取的文件并通过sidekiq发送文件的最佳方法。
在控制器:
它不是好发送类似散装物体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
Run Code Online (Sandbox Code Playgroud)
在Mailer中:
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
Run Code Online (Sandbox Code Playgroud)
为什么会警告安全问题?
直接使用params而不使用强参数来限制仅允许的属性被认为是不好的。注意:
如您使用TMP上传的文件可能无法使用总是sidekiq通过上传后台处理文件sidekiq-client时,可能无法提供sidekiq-server (Background version)尝试访问时tmp文件sidekiq-server忙很长很长一段时间后,处理此任务。
您的方法可能不起作用的条件:
当您进入生产环境时,需要运行多个实例。假设您需要一个单独的实用程序实例来运行sidekiq和
redis。然后,您sidekiq-server将找不到的tmp位置application_master。
当您sidekiq-server忙于处理或停工了一段时间并在很长一段时间后恢复时
| 归档时间: |
|
| 查看次数: |
1994 次 |
| 最近记录: |