mail_smtp_connection_pool 0.1.0
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 +7 -0
- data/lib/mail/smtp_pool/connection.rb +60 -0
- data/lib/mail/smtp_pool.rb +42 -0
- metadata +88 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: b0058cb8356a709adda99c190df8c3afc3f37eb201c69f705ccf44affb1cc1a3
         | 
| 4 | 
            +
              data.tar.gz: 52abaf3ecb4912329c65248205a93057ba8b616a6f09d3fd3b2680faa621fc18
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: f04824f52482621e0392c67049d054eb0152ad8a29d9c9d0722722c11506a0e204baffb4d7a7d2d64813b7523639d831bdc981b858cc50878a6cd4e2dbe366a2
         | 
| 7 | 
            +
              data.tar.gz: 2c0df938e72fb0ef6a55478cb9b89da05033e733c5b0cc2b75faa85d3a3dfe2a2e5b7786f1f1ca28fde841990b823af8dff64c14e6624737a1ac52f3b6309a52
         | 
| @@ -0,0 +1,60 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # A connection object that can be used to deliver mail.
         | 
| 4 | 
            +
            #
         | 
| 5 | 
            +
            # This is meant to be used in a pool so the main difference between this
         | 
| 6 | 
            +
            # and Mail::SMTP is that this expects deliver! to be called multiple times.
         | 
| 7 | 
            +
            #
         | 
| 8 | 
            +
            # SMTP connection reset and error handling is handled by this class and
         | 
| 9 | 
            +
            # the SMTP connection is not closed after a delivery.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            require 'mail'
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            module Mail
         | 
| 14 | 
            +
              class SMTPPool
         | 
| 15 | 
            +
                class Connection < Mail::SMTP
         | 
| 16 | 
            +
                  def initialize(values)
         | 
| 17 | 
            +
                    super
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    @smtp_session = nil
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def deliver!(mail)
         | 
| 23 | 
            +
                    response = Mail::SMTPConnection.new(connection: smtp_session, return_response: true).deliver!(mail)
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    settings[:return_response] ? response : self
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  def finish
         | 
| 29 | 
            +
                    finish_smtp_session if @smtp_session && @smtp_session.started?
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  private
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def smtp_session
         | 
| 35 | 
            +
                    return start_smtp_session if @smtp_session.nil? || !@smtp_session.started?
         | 
| 36 | 
            +
                    return @smtp_session if reset_smtp_session
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    finish_smtp_session
         | 
| 39 | 
            +
                    start_smtp_session
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  def start_smtp_session
         | 
| 43 | 
            +
                    @smtp_session = build_smtp_session.start(settings[:domain], settings[:user_name], settings[:password], settings[:authentication])
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  def reset_smtp_session
         | 
| 47 | 
            +
                    !@smtp_session.instance_variable_get(:@error_occurred) && @smtp_session.rset.success?
         | 
| 48 | 
            +
                  rescue Net::SMTPError, IOError
         | 
| 49 | 
            +
                    false
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  def finish_smtp_session
         | 
| 53 | 
            +
                    @smtp_session.finish
         | 
| 54 | 
            +
                  rescue Net::SMTPError, IOError
         | 
| 55 | 
            +
                  ensure
         | 
| 56 | 
            +
                    @smtp_session = nil
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
            end
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'connection_pool'
         | 
| 4 | 
            +
            require 'mail/smtp_pool/connection'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Mail
         | 
| 7 | 
            +
              class SMTPPool
         | 
| 8 | 
            +
                VERSION = '0.1.0'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                POOL_DEFAULTS = {
         | 
| 11 | 
            +
                  pool_size: 5,
         | 
| 12 | 
            +
                  pool_timeout: 5
         | 
| 13 | 
            +
                }.freeze
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                class << self
         | 
| 16 | 
            +
                  def create_pool(settings = {})
         | 
| 17 | 
            +
                    pool_settings = POOL_DEFAULTS.merge(settings)
         | 
| 18 | 
            +
                    smtp_settings = settings.reject { |k, v| POOL_DEFAULTS.keys.include?(k) }
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    ConnectionPool.new(size: pool_settings[:pool_size], timeout: pool_settings[:pool_timeout]) do
         | 
| 21 | 
            +
                      Mail::SMTPPool::Connection.new(smtp_settings)
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def initialize(settings)
         | 
| 27 | 
            +
                  raise ArgumentError, 'pool is required. You can create one using Mail::SMTPPool.create_pool.' if settings[:pool].nil?
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  @pool = settings[:pool]
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def deliver!(mail)
         | 
| 33 | 
            +
                  @pool.with { |conn| conn.deliver!(mail) }
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                # This makes it compatible with Mail's `#deliver!` method
         | 
| 37 | 
            +
                # https://github.com/mikel/mail/blob/22a7afc23f253319965bf9228a0a430eec94e06d/lib/mail/message.rb#L271
         | 
| 38 | 
            +
                def settings
         | 
| 39 | 
            +
                  {}
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,88 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: mail_smtp_connection_pool
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - Fabio Tranjan
         | 
| 8 | 
            +
            autorequire:
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
            date: 2024-01-08 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: connection_pool
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - "~>"
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '2.4'
         | 
| 20 | 
            +
              type: :runtime
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - "~>"
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '2.4'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: mail
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - "~>"
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '2.8'
         | 
| 34 | 
            +
              type: :runtime
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - "~>"
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '2.8'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: rspec
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - "~>"
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: 3.12.0
         | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - "~>"
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: 3.12.0
         | 
| 55 | 
            +
            description:
         | 
| 56 | 
            +
            email:
         | 
| 57 | 
            +
            - fabiotranjan@gmail.com
         | 
| 58 | 
            +
            executables: []
         | 
| 59 | 
            +
            extensions: []
         | 
| 60 | 
            +
            extra_rdoc_files: []
         | 
| 61 | 
            +
            files:
         | 
| 62 | 
            +
            - lib/mail/smtp_pool.rb
         | 
| 63 | 
            +
            - lib/mail/smtp_pool/connection.rb
         | 
| 64 | 
            +
            homepage: https://github.com/FabioTranjan/mail_smtp_connection_pool
         | 
| 65 | 
            +
            licenses:
         | 
| 66 | 
            +
            - MIT
         | 
| 67 | 
            +
            metadata:
         | 
| 68 | 
            +
              source_code_uri: https://github.com/FabioTranjan/mail_smtp_connection_pool
         | 
| 69 | 
            +
            post_install_message:
         | 
| 70 | 
            +
            rdoc_options: []
         | 
| 71 | 
            +
            require_paths:
         | 
| 72 | 
            +
            - lib
         | 
| 73 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 74 | 
            +
              requirements:
         | 
| 75 | 
            +
              - - ">="
         | 
| 76 | 
            +
                - !ruby/object:Gem::Version
         | 
| 77 | 
            +
                  version: '0'
         | 
| 78 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
              requirements:
         | 
| 80 | 
            +
              - - ">="
         | 
| 81 | 
            +
                - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                  version: '0'
         | 
| 83 | 
            +
            requirements: []
         | 
| 84 | 
            +
            rubygems_version: 3.5.3
         | 
| 85 | 
            +
            signing_key:
         | 
| 86 | 
            +
            specification_version: 4
         | 
| 87 | 
            +
            summary: Mail extension for sending mails using an SMTP connection pool
         | 
| 88 | 
            +
            test_files: []
         |