Попытка избежать отправки электронных писем, когда адрес электронной почты заканчивается на «.old» - PullRequest
6 голосов
/ 19 января 2012

У меня есть требование переопределить метод ActionMailer mail. Этот метод защищен, поэтому в подклассе я также определяю метод mail как защищенный:

protected

def mail(headers={}, &block)
  #add a check to avoid sending emails that end with ".old"
  unless headers[:to] =~ /\.old$/
    super(headers, &block)
  end
end

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

Однако в моем модульном тесте кажется, что электронное письмо все еще будет ActionMailer::Base.deliveries

вот мой модульный тест:

describe 'BaseNotifier' do

  class TestNotifier < BaseNotifier
    def mailer(to, from, subject)
      mail(:to => to,
          :from => from,
          :subject => subject)
    end
  end

  before(:each) do
    ActionMailer::Base.delivery_method = :test
    ActionMailer::Base.perform_deliveries = true
    ActionMailer::Base.deliveries.clear
  end

  it "should not send emails to a user with an email that ends in '.old'" do
    TestNotifier.mailer("some_email@gmail.com.old", "from@gmail.com", "test email").deliver
    puts "what do we have here " + ActionMailer::Base.deliveries.first.to_s
    ActionMailer::Base.deliveries.length.should == 0
  end
end

Я создаю тестовый класс и подкласс класса, где почта переопределяется (это то, как она будет использоваться в системе). Затем я отправляю электронное письмо и вызываю метод .deliver.

ОБНОВЛЕНИЕ: я думаю, что метод доставки не проблема. Когда я делаю это: puts TestNotifier.mailer("some_email@gmail.com.old", "from@gmail.com", "test email") Я получаю то же электронное сообщение, что и ниже Я также попытался переопределить метод mail следующим образом:

def mail(headers={}, &block)
  #add a check to avoid sending emails that end with ".old"
  unless headers[:to] =~ /\.old$/
    super(headers, &block)
  else
    super({:to=>nil, :from=>nil, :boundary =>nil, :date => nil, :message =>nil, :subject =>nil, :mime_version => nil,
           :content_type => nil, :charset =>nil, :content_transfer_encoding => nil}, &block)
  end

end

, который дает мне ошибку с undefined method 'ascii_only?' for nil:NilClass в этой строке: TestNotifier.mailer("some_email@gmail.com.old", "from@gmail.com", "test email").deliver

ОБНОВЛЕНИЕ: Я также пытался сделать это с переопределенным mail методом:

# создать класс, который переопределяет метод поставки, чтобы ничего не делать. класс NonSendingEmail; Def Delivery; конец; конец

def mail (заголовки = {}, & block) # добавить проверку, чтобы избежать отправки писем, заканчивающихся на ".old" если заголовки [: to] = ~ /.old$/ супер (заголовки и блок) еще NonSendingEmail.new конец конец

но у меня все тот же результат.

Кажется, что метод deliver генерирует пустое электронное письмо? Что я хотел бы сделать, так это вообще ничего не генерировать. Вот электронная почта из массива поставок:

Date: Thu, 19 Jan 2012 00:00:00 +0000
Message-ID: <4f18344f94d0_12267803589ac2731d@Ramys-MacBook-Pro.local.mail>
Mime-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

Ответы [ 2 ]

6 голосов
/ 20 января 2012

вы редактируете не в том месте.изменение метода mail для возврата nil не поможет, так как почтовая программа использует пустое сообщение.вместо этого вы можете пропатчить почтовый класс (работающий с rails 3):

module Mail
  class Message
    alias :old_deliver :deliver
    def deliver
      old_deliver unless to.first =~ /\.old$/
    end
  end
end
3 голосов
/ 12 августа 2014

Вы можете установить execute_deliveries для сообщения на false, например,

after_filter :do_not_send_if_old_email

def do_not_send_if_old_email
  message.perform_deliveries = false if to.first =~ /\.old$/
  true
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...