我需要覆盖ActionMailer的mail
方法。这个方法受到保护,因此在子类中,我还将mail
方法定义为protected:
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
结尾时,该方法应返回nil而不发送电子邮件。
但是,在我的单元测试中,似乎电子邮件仍然是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")
我收到如下相同的电子邮件。我也尝试以这种方式覆盖邮件方法:
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
更新:我也尝试使用重写的deliver
方法执行此操作:
#create一个覆盖传递方法的类,什么都不做。 class NonSendingEmail; def交付;结束;端
def mail(headers = {},&amp; block) #add检查以避免发送以“.old”结尾的电子邮件 除非标题[:to] =〜/ .old $ / super(标题和&amp;块) 其他 NonSendingEmail.new 结束 端
但我仍然有相同的结果。
似乎我想要做的是什么都没有生成。这是来自deliveryies数组的电子邮件: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
方法正在生成一个空的电子邮件?
{{1}}
答案 0 :(得分:6)
你正在编辑错误的地方。将邮件方法更改为返回nil将无济于事,因为邮件程序然后使用空消息。你可以改为修补邮件类(使用rails 3):
module Mail
class Message
alias :old_deliver :deliver
def deliver
old_deliver unless to.first =~ /\.old$/
end
end
end
答案 1 :(得分:3)
您可以将邮件的perform_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