Rails 3: Попытка расширить Action Mailer с помощью модуля - PullRequest
1 голос
/ 30 ноября 2011

Попытка переписать старый alias_method_chain, чтобы добавить фильтр для исходящих писем, но он не работает.Я почти уверен, что что-то пропустил / что-то пропустил, но я не знаю что.

Этот файл находится в /lib/outgoing_mail_filter.rb, который загружается с config / initializer / required.rb

Вот старый код, который работал под Rails 2:

class ActionMailer::Base
  def deliver_with_recipient_filter!(mail = @mail) 
    unless 'production' == Rails.env
      mail.to = mail.to.to_a.delete_if do |to| 
        !(to.ends_with?('some_domain.com'))
      end
    end
    unless mail.to.blank?
      deliver_without_recipient_filter!(mail)
    end
  end
  alias_method_chain 'deliver!'.to_sym, :recipient_filter
end

И вот моя текущая попытка переписать его:

class ActionMailer::Base
  module RecipientFilter
    def deliver(mail = @mail) 
      super
      unless 'production' == Rails.env
        mail.to = mail.to.to_a.delete_if do |to| 
          !(to.ends_with?('some_domain.com'))
        end
      end
      unless mail.to.blank?
        deliver(mail)
      end    
    end
  end

  include RecipientFilter
end

Когда я запускаю свойтесты, даже не похоже, что это называется или что-то в этом роде.Любая помощь приветствуется

1 Ответ

0 голосов
/ 30 ноября 2011

Я использую mail_safe для перезаписи электронной почты в среде разработки, настоятельно рекомендуется. Вы можете найти его для вдохновения, если он не соответствует вашим требованиям, код очень прост.

Следующий код извлечен из / lib / mail_safe / rails3_hook.rb и должен делать то, что вы хотите:

require 'mail'

module MailSafe
  class MailInterceptor
    def self.delivering_email(mail)
      # replace the following line with your code
      # and don't forget to return the mail object at the end
      MailSafe::AddressReplacer.replace_external_addresses(mail) if mail
    end

    ::Mail.register_interceptor(self)
  end
end

Альтернативная версия, регистрация с ActionMailer::Base вместо Mail (спасибо Кевину Уитакеру за сообщение, что это возможно):

module MailSafe
  class MailInterceptor
    def self.delivering_email(mail)
      # replace the following line with your code
      # and don't forget to return the mail object at the end
      MailSafe::AddressReplacer.replace_external_addresses(mail) if mail
    end

    ::ActionMailer::Base.register_interceptor(self)
  end
end
...