猴子修补Ruby邮件模块中的类方法

时间:2017-05-17 18:51:23

标签: ruby email jruby monkeypatching

我目前正在使用JRuby Mail-2.6.0模块中的猴子补丁。具体来说,我想修补ssl_context类方法。如果有帮助,这是module的完整路径。

我对猴子补丁的一个问题是,由于我想要替换一个类方法,我不太清楚用什么方法来替换ssl_context

这就是我对猴子补丁的看法:

require 'mail/check_delivery_params'

class << Mail::SMTP
  remove_method :ssl_context
end

module Mail
  class SMTP
        # Allow SSL context to be configured via settings, for Ruby >= 1.9
    # Just returns openssl verify mode for Ruby 1.8.x
    def ssl_context
      openssl_verify_mode = settings[:openssl_verify_mode]

      if openssl_verify_mode.kind_of?(String)
        openssl_verify_mode = "OpenSSL::SSL::VERIFY_#{openssl_verify_mode.upcase}".constantize
      end

      # context = Net::SMTP.default_ssl_context
      context = OpenSSL::SSL::SSLContext.new(settings[:ssl_version])
      context.verify_mode = openssl_verify_mode
      context.ca_path = settings[:ca_path] if settings[:ca_path]
      context.ca_file = settings[:ca_file] if settings[:ca_file]
      context
    end
  end
end

我基本上只想改变:

context = Net::SMTP.default_ssl_context

要:

context = OpenSSL::SSL::SSLContext.new(settings[:ssl_version])

我已尝试undef_methodremove_class_variableremove_method,但仍然遇到以下类型的错误:

2017-05-17 11:44:03.423 -0700 [ERROR|007d0|main] :: Error starting Application: Undefined method ssl_context for 'Mail::SMTP'
  org/jruby/RubyModule.java:2826:in `undef_method'
  /Users/App/Code/yourtool/lib/helltool/mailer.rb:328:in `singleton class'
  /Users/App/Code/yourtool//lib/helltool/mailer.rb:327:in `<main>'
  org/jruby/RubyKernel.java:961:in `require'

好奇我可以做些什么让它发挥作用?

0 个答案:

没有答案