ActionMailer after_filter破坏content_type

时间:2014-02-10 01:35:20

标签: ruby-on-rails ruby-on-rails-3 actionmailer

[Rails 3.2.13]我有一个邮件程序,它根据.text.erb.html.haml模板发送隐式多部分电子邮件。没问题。

我正在尝试添加after_filter来有条件地阻止发送到无效的电子邮件。基于this answer和我读过的所有文档,这看起来非常简单。

但是,包括此after_filter会将内容类型从multipart/alternative更改为text/plain即使电子邮件有效也是如此。在文档中:“如果已将任何附件或部件添加到电子邮件中,则不执行隐式模板渲染”。这适用于此吗?这是预期的行为,还是我做错了什么?

我的头撞在墙上,因为这看起来很简单。

class Notify < ActionMailer::Base

  include AbstractController::Callbacks

  after_filter :ensure_valid

  def some_email(user_id)
    @user = User.find(user_id)
    mail(to: @user.email)
  end

  ...

  private

  def ensure_valid
    if User.where(email: mail.to, invalid_email: true).any?
      mail.perform_deliveries = false
    end
    true
  end

end

修改:经过多次修改后,似乎在after_filter中调用mail对象 会关闭多部分,即使是这样的内容:

def ensure_valid
  puts "mail: #{mail}"
  true
end

这里发生了什么?


尝试在after_filter中手动添加content_type + params,例如

mail.content_type = 'multipart/alternative'
mail.header['Content-Type'].parameters[:boundary] = mail.body.boundary
mail.header['Content-Type'].parameters[:charset] = 'UTF-8' 

但无论出于何种原因,这似乎都不起作用。如果我只包括

,它会设置content_type
mail.content_type = 'multipart/alternative'

..但后来我缺少边界和字符集参数。

我尝试过的其他功能不起作用:

  • 在environment.rb中设置默认content_type
  • 在邮件程序中设置默认content_type

1 个答案:

答案 0 :(得分:2)

仍然不完全确定这里发生了什么,但似乎在after_filter中使用message对象而非mail修复此问题:

def ensure_valid
  if User.where(email: message.to, invalid_email: true).any?
    message.perform_deliveries = false
  end
  true
end

这会正确设置perform_deliveries而不会影响content_type(将其保留为multipart/alternative)。很奇怪,所有示例都使用mail对象而不是message