[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_typemail.content_type = 'multipart/alternative'
..但后来我缺少边界和字符集参数。
我尝试过的其他功能不起作用:
答案 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
。