Augustin Riedinger
Augustin Riedinger

Reputation: 22170

Rails mail interceptor only for a specific mailer

I have an interceptor : DevelopmentMailInterceptor and an inititializer setup_mail.rb that initiates the interceptor.

But I want to apply it to a specific mailer (to intercept NotificationMailer and not the other ones.

So I set in setup_mail.rb :

`NotificationMailer.register_interceptor(DevelopmentMailInterceptor) 

But then all mailers get intercepted, as if I'd written

ActionMailer::Base.register_interceptor(DevelopmentMailInterceptor)

How can I filter this?

Upvotes: 7

Views: 2464

Answers (2)

Augustin Riedinger
Augustin Riedinger

Reputation: 22170

I found the solution by exploring in depth the message parameter of the delivering_email method of the mailer interceptor.

class DevelopmentMailInterceptor
  def self.delivering_email(message)

    filteredMailers = %w[
      NotificationMailer
    ]

    if filteredMailers.include?(message.delivery_handler)
      message.subject = "[filter] To:#{message.to} - #{message.subject}"
      message.to = '[email protected]'
    end

    return message
  end
end

@Intrepidd's answer remains true since the interceptor is applied to the whole Mail class but I found the way around to what I wanted to achieve.

Upvotes: 15

Intrepidd
Intrepidd

Reputation: 20878

You can't.

Interceptor are registered on the global Mail class (see the source of register_interceptor)

If you need your interceptor to be effective only on specific e-mails, you should add a condition inside the interceptor class.

Upvotes: 0

Related Questions