mailhandler 1.0.52 → 1.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/mailhandler.rb +19 -15
- data/lib/mailhandler/errors.rb +2 -0
- data/lib/mailhandler/receiver.rb +12 -1
- data/lib/mailhandler/receiving/base.rb +1 -1
- data/lib/mailhandler/sender.rb +12 -2
- data/lib/mailhandler/sending/api.rb +23 -3
- data/lib/mailhandler/sending/api_batch.rb +10 -1
- data/lib/mailhandler/sending/base.rb +4 -0
- data/lib/mailhandler/sending/smtp.rb +12 -1
- data/lib/mailhandler/version.rb +1 -1
- data/spec/unit/mailhandler/receiver_spec.rb +29 -1
- metadata +5 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: eb1c79224a2d06818e5fe0d17efb43582e3bc4493e0a96059ade1ce0a040210d
         | 
| 4 | 
            +
              data.tar.gz: 65a3032f84a5f0485b8d9e59768d3641d74ffeb32731d06854e18828fb975211
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b95a623ebf0d6c1d06f2f8de30ff4f8123ae0cb9d5bde77d2b61f088af958154bf1c7626db84137cd5ded7e3734b79ad0fda345cec2f88e8784583c9aeb8706d
         | 
| 7 | 
            +
              data.tar.gz: 33e8d8113c5bdc964564a034c9113a98ad571acc1fd824448a6b6def2363c82b8e72dc98bcd15042ae0656cf27d84cedd698d0d61541688dd80ff4b4ad44ea22
         | 
    
        data/lib/mailhandler.rb
    CHANGED
    
    | @@ -34,12 +34,7 @@ module MailHandler | |
| 34 34 | 
             
              #
         | 
| 35 35 | 
             
              def sender(type = :postmark_api, settings = {})
         | 
| 36 36 | 
             
                handler = Handler.new
         | 
| 37 | 
            -
                handler.init_sender(type)
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                settings.each do |setting_name, setting_value|
         | 
| 40 | 
            -
                  handler.sender.dispatcher.instance_variable_set("@#{setting_name}", setting_value)
         | 
| 41 | 
            -
                end
         | 
| 42 | 
            -
             | 
| 37 | 
            +
                handler.init_sender(type, settings)
         | 
| 43 38 | 
             
                yield(handler.sender.dispatcher) if block_given?
         | 
| 44 39 |  | 
| 45 40 | 
             
                handler.sender
         | 
| @@ -72,12 +67,7 @@ module MailHandler | |
| 72 67 | 
             
              #
         | 
| 73 68 | 
             
              def receiver(type = :folder, settings = {})
         | 
| 74 69 | 
             
                handler = Handler.new
         | 
| 75 | 
            -
                handler.init_receiver(type, settings | 
| 76 | 
            -
             | 
| 77 | 
            -
                settings.each do |setting_name, setting_value|
         | 
| 78 | 
            -
                  handler.receiver.checker.instance_variable_set("@#{setting_name}", setting_value)
         | 
| 79 | 
            -
                end
         | 
| 80 | 
            -
             | 
| 70 | 
            +
                handler.init_receiver(type, settings)
         | 
| 81 71 | 
             
                yield(handler.receiver.checker) if block_given?
         | 
| 82 72 | 
             
                handler.receiver
         | 
| 83 73 | 
             
              end
         | 
| @@ -96,16 +86,30 @@ module MailHandler | |
| 96 86 | 
             
                attr_accessor :sender,
         | 
| 97 87 | 
             
                              :receiver
         | 
| 98 88 |  | 
| 99 | 
            -
                def init_sender(type = :postmark_api)
         | 
| 89 | 
            +
                def init_sender(type = :postmark_api, settings = {})
         | 
| 100 90 | 
             
                  verify_type(type, SENDER_TYPES)
         | 
| 101 91 | 
             
                  @sender = MailHandler::Sender.new(SENDER_TYPES[type].new)
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  settings.each do |setting_name, setting_value|
         | 
| 94 | 
            +
                    if @sender.dispatcher.respond_to?(setting_name)
         | 
| 95 | 
            +
                      @sender.dispatcher.instance_variable_set("@#{setting_name}", setting_value)
         | 
| 96 | 
            +
                    end
         | 
| 97 | 
            +
                  end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                  @sender
         | 
| 102 100 | 
             
                end
         | 
| 103 101 |  | 
| 104 | 
            -
                def init_receiver(type = :folder,  | 
| 102 | 
            +
                def init_receiver(type = :folder, settings = {})
         | 
| 105 103 | 
             
                  verify_type(type, CHECKER_TYPES)
         | 
| 106 104 | 
             
                  receiver = MailHandler::Receiver.new(CHECKER_TYPES[type].new)
         | 
| 107 105 |  | 
| 108 | 
            -
                   | 
| 106 | 
            +
                  settings.each do |setting_name, setting_value|
         | 
| 107 | 
            +
                    if receiver.checker.respond_to?(setting_name)
         | 
| 108 | 
            +
                      receiver.checker.instance_variable_set("@#{setting_name}", setting_value)
         | 
| 109 | 
            +
                    end
         | 
| 110 | 
            +
                  end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                  add_receiving_notifications(receiver, settings[:notifications])
         | 
| 109 113 | 
             
                  @receiver = receiver
         | 
| 110 114 | 
             
                end
         | 
| 111 115 |  | 
    
        data/lib/mailhandler/errors.rb
    CHANGED
    
    
    
        data/lib/mailhandler/receiver.rb
    CHANGED
    
    | @@ -4,6 +4,7 @@ require_relative 'receiving/folder' | |
| 4 4 | 
             
            require_relative 'receiving/imap'
         | 
| 5 5 | 
             
            require_relative 'extensions/mail/imap'
         | 
| 6 6 | 
             
            require_relative 'receiving/observer'
         | 
| 7 | 
            +
            require_relative 'errors'
         | 
| 7 8 |  | 
| 8 9 | 
             
            module MailHandler
         | 
| 9 10 | 
             
              # handling receiving email
         | 
| @@ -13,7 +14,8 @@ module MailHandler | |
| 13 14 | 
             
                attr_accessor :checker,
         | 
| 14 15 | 
             
                              :search,
         | 
| 15 16 | 
             
                              :max_search_duration,
         | 
| 16 | 
            -
                              :search_frequency
         | 
| 17 | 
            +
                              :search_frequency,
         | 
| 18 | 
            +
                              :validate_result
         | 
| 17 19 |  | 
| 18 20 | 
             
                module DEFAULTS
         | 
| 19 21 | 
             
                  MAX_SEARCH_DURATION = 240 # maximum time for search to last in [seconds]
         | 
| @@ -36,6 +38,7 @@ module MailHandler | |
| 36 38 | 
             
                  @checker = checker
         | 
| 37 39 | 
             
                  @max_search_duration = DEFAULTS::MAX_SEARCH_DURATION
         | 
| 38 40 | 
             
                  @search_frequency = DEFAULTS::SEARCH_FREQUENCY
         | 
| 41 | 
            +
                  @validate_result = false
         | 
| 39 42 | 
             
                end
         | 
| 40 43 |  | 
| 41 44 | 
             
                def find_email(options)
         | 
| @@ -52,10 +55,18 @@ module MailHandler | |
| 52 55 | 
             
                  checker.search_result
         | 
| 53 56 | 
             
                ensure
         | 
| 54 57 | 
             
                  checker.stop
         | 
| 58 | 
            +
                  check_result
         | 
| 55 59 | 
             
                end
         | 
| 56 60 |  | 
| 57 61 | 
             
                private
         | 
| 58 62 |  | 
| 63 | 
            +
                def check_result
         | 
| 64 | 
            +
                  return unless validate_result
         | 
| 65 | 
            +
                  return if checker.search_result
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  raise SearchEmailError, "Email searched by #{@search.options} not found for #{@search.max_duration} seconds."
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 59 70 | 
             
                def single_search(options)
         | 
| 60 71 | 
             
                  received = checker.find(options)
         | 
| 61 72 | 
             
                  update_search_details
         | 
| @@ -90,7 +90,7 @@ module MailHandler | |
| 90 90 |  | 
| 91 91 | 
             
                    count = options[:count]
         | 
| 92 92 | 
             
                    error_message = "Incorrect option options[:count]=#{options[:count]}."
         | 
| 93 | 
            -
                    raise MailHandler::Error, error_message if (count <0) || (count > 2000)
         | 
| 93 | 
            +
                    raise MailHandler::Error, error_message if (count < 0) || (count > 2000)
         | 
| 94 94 | 
             
                  end
         | 
| 95 95 |  | 
| 96 96 | 
             
                  def validate_used_options(options)
         | 
    
        data/lib/mailhandler/sender.rb
    CHANGED
    
    | @@ -3,12 +3,14 @@ | |
| 3 3 | 
             
            require_relative 'sending/smtp'
         | 
| 4 4 | 
             
            require_relative 'sending/api'
         | 
| 5 5 | 
             
            require_relative 'sending/api_batch'
         | 
| 6 | 
            +
            require_relative 'errors'
         | 
| 6 7 |  | 
| 7 8 | 
             
            module MailHandler
         | 
| 8 9 | 
             
              # Class for sending email, and storing details about the sending.
         | 
| 9 10 | 
             
              class Sender
         | 
| 10 11 | 
             
                attr_accessor :dispatcher,
         | 
| 11 | 
            -
                              :sending
         | 
| 12 | 
            +
                              :sending,
         | 
| 13 | 
            +
                              :validate_response
         | 
| 12 14 |  | 
| 13 15 | 
             
                # @param [Time] - sending started at Time
         | 
| 14 16 | 
             
                # @param [Time] - sending finished at Time
         | 
| @@ -21,13 +23,14 @@ module MailHandler | |
| 21 23 | 
             
                def initialize(dispatcher)
         | 
| 22 24 | 
             
                  @dispatcher = dispatcher
         | 
| 23 25 | 
             
                  @sending = Sending.new
         | 
| 26 | 
            +
                  @validate_response = false
         | 
| 24 27 | 
             
                end
         | 
| 25 28 |  | 
| 26 29 | 
             
                def send_email(email)
         | 
| 27 30 | 
             
                  init_sending_details(email)
         | 
| 28 31 | 
             
                  response = dispatcher.send(email)
         | 
| 29 32 | 
             
                  update_sending_details(response)
         | 
| 30 | 
            -
             | 
| 33 | 
            +
                  check_response(response)
         | 
| 31 34 | 
             
                  response
         | 
| 32 35 | 
             
                end
         | 
| 33 36 |  | 
| @@ -37,6 +40,13 @@ module MailHandler | |
| 37 40 |  | 
| 38 41 | 
             
                private
         | 
| 39 42 |  | 
| 43 | 
            +
                def check_response(response)
         | 
| 44 | 
            +
                  return unless validate_response
         | 
| 45 | 
            +
                  return if dispatcher.valid_response?(response)
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  raise SendEmailError, "Invalid sending response: #{response}."
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 40 50 | 
             
                def init_sending_details(email)
         | 
| 41 51 | 
             
                  @sending = Sending.new
         | 
| 42 52 | 
             
                  @sending.started_at = Time.now
         | 
| @@ -27,7 +27,8 @@ module MailHandler | |
| 27 27 | 
             
                  def send(email)
         | 
| 28 28 | 
             
                    verify_email(email)
         | 
| 29 29 | 
             
                    init_client
         | 
| 30 | 
            -
                    client.deliver_message(email)
         | 
| 30 | 
            +
                    response = client.deliver_message(email)
         | 
| 31 | 
            +
                    format_response(response)
         | 
| 31 32 | 
             
                  end
         | 
| 32 33 |  | 
| 33 34 | 
             
                  def client
         | 
| @@ -45,11 +46,30 @@ module MailHandler | |
| 45 46 | 
             
                                                       host: host, secure: @use_ssl)
         | 
| 46 47 | 
             
                  end
         | 
| 47 48 |  | 
| 49 | 
            +
                  def valid_response?(response)
         | 
| 50 | 
            +
                    response[:message].to_s.strip.downcase == 'ok' && response[:error_code].to_s.downcase == '0'
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  def timeout=(value)
         | 
| 54 | 
            +
                    @http_open_timeout = value
         | 
| 55 | 
            +
                    @http_read_timeout = value
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
             | 
| 48 58 | 
             
                  DEFAULTS = {
         | 
| 49 59 | 
             
                    host: 'api.postmarkapp.com',
         | 
| 50 | 
            -
                    read_timeout:  | 
| 51 | 
            -
                    open_timeout:  | 
| 60 | 
            +
                    read_timeout: 60,
         | 
| 61 | 
            +
                    open_timeout: 60
         | 
| 52 62 | 
             
                  }.freeze
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  protected
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  def format_response(response)
         | 
| 67 | 
            +
                    return response unless response.is_a? Hash
         | 
| 68 | 
            +
                    return response if response.keys.select { |key| key.is_a? Symbol }.empty?
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                    response.keys.select { |key| key.is_a? String }.each { |s| response.delete(s) }
         | 
| 71 | 
            +
                    response
         | 
| 72 | 
            +
                  end
         | 
| 53 73 | 
             
                end
         | 
| 54 74 | 
             
              end
         | 
| 55 75 | 
             
            end
         | 
| @@ -14,11 +14,20 @@ module MailHandler | |
| 14 14 | 
             
                  def send(emails)
         | 
| 15 15 | 
             
                    verify_email(emails)
         | 
| 16 16 | 
             
                    init_client
         | 
| 17 | 
            -
                    client.deliver_messages(emails)
         | 
| 17 | 
            +
                    response = client.deliver_messages(emails)
         | 
| 18 | 
            +
                    format_response(response)
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  def valid_response?(responses)
         | 
| 22 | 
            +
                    responses.map { |response| super(response) }.all?(true)
         | 
| 18 23 | 
             
                  end
         | 
| 19 24 |  | 
| 20 25 | 
             
                  protected
         | 
| 21 26 |  | 
| 27 | 
            +
                  def format_response(response)
         | 
| 28 | 
            +
                    response.map { |r| super(r) }
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 22 31 | 
             
                  def verify_email(emails)
         | 
| 23 32 | 
             
                    return if emails.is_a?(Array) && emails.all? { |e| e.is_a? allowed_email_type }
         | 
| 24 33 |  | 
| @@ -12,7 +12,8 @@ module MailHandler | |
| 12 12 | 
             
                                :username,
         | 
| 13 13 | 
             
                                :password,
         | 
| 14 14 | 
             
                                :authentication,
         | 
| 15 | 
            -
                                :use_ssl
         | 
| 15 | 
            +
                                :use_ssl,
         | 
| 16 | 
            +
                                :openssl_verify_mode
         | 
| 16 17 |  | 
| 17 18 | 
             
                  attr_accessor :open_timeout,
         | 
| 18 19 | 
             
                                :read_timeout,
         | 
| @@ -42,6 +43,15 @@ module MailHandler | |
| 42 43 | 
             
                    save_response ? response : nil
         | 
| 43 44 | 
             
                  end
         | 
| 44 45 |  | 
| 46 | 
            +
                  def valid_response?(response)
         | 
| 47 | 
            +
                    response.string.to_s.downcase.include?('250 2.0.0 ok')
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  def timeout=(value)
         | 
| 51 | 
            +
                    @read_timeout = value
         | 
| 52 | 
            +
                    @open_timeout = value
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 45 55 | 
             
                  private
         | 
| 46 56 |  | 
| 47 57 | 
             
                  def init_net_smtp
         | 
| @@ -66,6 +76,7 @@ module MailHandler | |
| 66 76 | 
             
                      password: password,
         | 
| 67 77 | 
             
                      authentication: @authentication,
         | 
| 68 78 | 
             
                      enable_starttls_auto: @use_ssl,
         | 
| 79 | 
            +
                      openssl_verify_mode: @openssl_verify_mode,
         | 
| 69 80 |  | 
| 70 81 | 
             
                      return_response: save_response,
         | 
| 71 82 | 
             
                      open_timeout: open_timeout,
         | 
    
        data/lib/mailhandler/version.rb
    CHANGED
    
    
| @@ -59,6 +59,34 @@ describe MailHandler::Receiver do | |
| 59 59 | 
             
                  end
         | 
| 60 60 | 
             
                end
         | 
| 61 61 |  | 
| 62 | 
            +
                describe '.search not found' do
         | 
| 63 | 
            +
                  let(:checker) do
         | 
| 64 | 
            +
                    checker = instance_double('Checker')
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                    allow(checker).to receive(:find).and_return(false)
         | 
| 67 | 
            +
                    allow(checker).to receive(:search_result).and_return(false)
         | 
| 68 | 
            +
                    allow(checker).to receive(:found_emails).and_return([])
         | 
| 69 | 
            +
                    allow(checker).to receive(:reset_found_emails).and_return([])
         | 
| 70 | 
            +
                    allow(checker).to receive(:start).and_return(nil)
         | 
| 71 | 
            +
                    allow(checker).to receive(:stop).and_return(nil)
         | 
| 72 | 
            +
                    checker
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                  it "raise error" do
         | 
| 76 | 
            +
                    receiver.max_search_duration = 3
         | 
| 77 | 
            +
                    receiver.validate_result=true
         | 
| 78 | 
            +
                    expect { receiver.find_email(default_search_option) }.
         | 
| 79 | 
            +
                        to raise_error(MailHandler::SearchEmailError,
         | 
| 80 | 
            +
                                       "Email searched by {:by_subject=>\"test\"} not found for 3 seconds.")
         | 
| 81 | 
            +
                  end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                  it "do not raise error" do
         | 
| 84 | 
            +
                    receiver.max_search_duration = 3
         | 
| 85 | 
            +
                    receiver.validate_result=false
         | 
| 86 | 
            +
                    expect(receiver.find_email(default_search_option)).to be false
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 62 90 | 
             
                describe '.search' do
         | 
| 63 91 | 
             
                  let(:checker) do
         | 
| 64 92 | 
             
                    checker = instance_double('Checker')
         | 
| @@ -67,7 +95,7 @@ describe MailHandler::Receiver do | |
| 67 95 | 
             
                      sleep 1
         | 
| 68 96 | 
             
                      false
         | 
| 69 97 | 
             
                    end
         | 
| 70 | 
            -
                    allow(checker).to receive(:search_result).and_return( | 
| 98 | 
            +
                    allow(checker).to receive(:search_result).and_return(true)
         | 
| 71 99 | 
             
                    allow(checker).to receive(:found_emails).and_return([])
         | 
| 72 100 | 
             
                    allow(checker).to receive(:reset_found_emails).and_return([])
         | 
| 73 101 | 
             
                    allow(checker).to receive(:start).and_return(nil)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: mailhandler
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0. | 
| 4 | 
            +
              version: 1.0.57
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Igor Balos
         | 
| 8 | 
            -
            autorequire: | 
| 8 | 
            +
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-04-15 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: mail
         | 
| @@ -114,8 +114,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 114 114 | 
             
                - !ruby/object:Gem::Version
         | 
| 115 115 | 
             
                  version: 1.9.3
         | 
| 116 116 | 
             
            requirements: []
         | 
| 117 | 
            -
            rubygems_version: 3. | 
| 118 | 
            -
            signing_key: | 
| 117 | 
            +
            rubygems_version: 3.2.3
         | 
| 118 | 
            +
            signing_key:
         | 
| 119 119 | 
             
            specification_version: 4
         | 
| 120 120 | 
             
            summary: Postmark email receiving and sending handler.
         | 
| 121 121 | 
             
            test_files: []
         |