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

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发送文件的最佳方法。

ill*_*ist 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
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忙很长很长一段时间后,处理此任务。

您的方法可能不起作用的条件

  • 当您进入生产环境时,需要运行多个实例。假设您需要一个单独的实用程序实例来运行sidekiqredis。然后,您sidekiq-server将找不到的tmp位置application_master

  • 当您sidekiq-server忙于处理或停工了一段时间并在很长一段时间后恢复时

  • 当您尝试在Rails和Sidekiq之间传递临时文件时,特定于主机的队列变得非常有用:http://www.mikeperham.com/2013/11/13/advanced-sidekiq-host-specific-queues/ (2认同)