2014-02-10 68 views
3

[Rails 3.2.13]我有一個郵件發送基於.text.erb.html.haml模板的隱式多部分電子郵件。那裏沒有問題。ActionMailer after_filter破解content_type

我想添加一個after_filter來有條件地阻止發送到無效的電子郵件。基於this answer和我讀過的所有文檔,這看起來非常簡單。

然而,包括本after_filter改變從multipart/alternativetext/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 

編輯:更多的修修補補之後,似乎調用mail對象在after_filter所有關閉多,即使是這樣的:

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' 

..但後來我缺少邊界和字符集參數。

其他的事情我已經試過了不起作用:

  • 設置默認CONTENT_TYPE中的environment.rb
  • 設置默認CONTENT_TYPE在郵件

回答

2

仍然不能完全肯定這是怎麼回事在這裏,但它似乎使用message對象而不是mail在after_filter修復此問題:

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