sendgrid_actionmailer_adapter 0.2.0 → 0.3.2
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 +5 -5
- data/lib/sendgrid_actionmailer_adapter/configuration.rb +3 -1
- data/lib/sendgrid_actionmailer_adapter/converters/categories.rb +1 -0
- data/lib/sendgrid_actionmailer_adapter/converters/contents.rb +2 -1
- data/lib/sendgrid_actionmailer_adapter/converters/reply_to.rb +1 -0
- data/lib/sendgrid_actionmailer_adapter/converters/send_at.rb +1 -0
- data/lib/sendgrid_actionmailer_adapter/delivery_method.rb +40 -6
- data/lib/sendgrid_actionmailer_adapter/version.rb +1 -1
- metadata +26 -27
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: d59836f5bb9a8cc47a2a4c45406d5ceb7c13798677676b5f8d04db5adbba15d3
         | 
| 4 | 
            +
              data.tar.gz: 07bf50bf757fafa6d18c8848eac7b40e9789329c4aa0cfd2682726d83ee131bb
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 38233870aeb4994d09dd2394e15a521f8fd2cc154b06e43de9d2b70b6301bb62bf5c7867d986cfb263a760c9c3cb09f00f273b72716ac8d01c93ec40f9809df2
         | 
| 7 | 
            +
              data.tar.gz: 9c581f63f5ccad65c7881034b50b46ac415beff1225c70e5bdf8c2d8f89617195d44e86771d4d082bb674d86d9428999955af70b85e7f43db68fa5f1ab572089
         | 
| @@ -7,7 +7,7 @@ module SendGridActionMailerAdapter | |
| 7 7 |  | 
| 8 8 | 
             
                class << self
         | 
| 9 9 | 
             
                  attr_accessor :api_key, :host, :request_headers, :version, :retry_max_count,
         | 
| 10 | 
            -
                                :retry_wait_seconds, :return_response
         | 
| 10 | 
            +
                                :retry_wait_seconds, :return_response, :logger
         | 
| 11 11 |  | 
| 12 12 | 
             
                  # Set your configuration with block.
         | 
| 13 13 | 
             
                  def configure
         | 
| @@ -30,6 +30,7 @@ module SendGridActionMailerAdapter | |
| 30 30 | 
             
                        wait_seconds: retry_wait_seconds || DEFAULT_RETRY_WAIT_SECONDS,
         | 
| 31 31 | 
             
                      },
         | 
| 32 32 | 
             
                      return_response: return_response,
         | 
| 33 | 
            +
                      logger: logger,
         | 
| 33 34 | 
             
                    }.freeze
         | 
| 34 35 | 
             
                  end
         | 
| 35 36 |  | 
| @@ -42,6 +43,7 @@ module SendGridActionMailerAdapter | |
| 42 43 | 
             
                    self.retry_max_count = nil
         | 
| 43 44 | 
             
                    self.retry_wait_seconds = nil
         | 
| 44 45 | 
             
                    self.return_response = nil
         | 
| 46 | 
            +
                    self.logger = nil
         | 
| 45 47 | 
             
                    @settings = nil
         | 
| 46 48 | 
             
                  end
         | 
| 47 49 | 
             
                end
         | 
| @@ -9,7 +9,8 @@ module SendGridActionMailerAdapter | |
| 9 9 | 
             
                  end
         | 
| 10 10 |  | 
| 11 11 | 
             
                  def convert(mail)
         | 
| 12 | 
            -
                     | 
| 12 | 
            +
                    contents = mail.body.multipart? ? mail.body.parts.select(&:text?) : [mail]
         | 
| 13 | 
            +
                    contents.map { |c| ::SendGrid::Content.new(type: c.mime_type, value: c.body.to_s) }
         | 
| 13 14 | 
             
                  end
         | 
| 14 15 |  | 
| 15 16 | 
             
                  def assign_attributes(sendgrid_mail, value)
         | 
| @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            require 'logger'
         | 
| 3 4 | 
             
            require 'sendgrid/client'
         | 
| 4 5 | 
             
            require_relative 'configuration'
         | 
| 5 6 | 
             
            require_relative 'converter'
         | 
| @@ -22,6 +23,7 @@ module SendGridActionMailerAdapter | |
| 22 23 | 
             
                # @options settings [Integer, Float] :retry_wait_sec Wait seconds for next retry, Default is 1.
         | 
| 23 24 | 
             
                def initialize(settings)
         | 
| 24 25 | 
             
                  @settings = ::SendGridActionMailerAdapter::Configuration.settings.merge(settings)
         | 
| 26 | 
            +
                  @logger = @settings[:logger] || ::Logger.new(nil)
         | 
| 25 27 | 
             
                end
         | 
| 26 28 |  | 
| 27 29 | 
             
                # Deliver a mail via SendGrid Web API.
         | 
| @@ -33,33 +35,65 @@ module SendGridActionMailerAdapter | |
| 33 35 | 
             
                # @raise [SendGridActionMailerAdapter::ApiError] when SendGrid Web API returns error response.
         | 
| 34 36 | 
             
                def deliver!(mail)
         | 
| 35 37 | 
             
                  sendgrid_mail = ::SendGridActionMailerAdapter::Converter.to_sendgrid_mail(mail)
         | 
| 36 | 
            -
                  body = sendgrid_mail.to_json
         | 
| 37 | 
            -
                  client = ::SendGrid::API.new(@settings[:sendgrid]).client.mail._('send')
         | 
| 38 38 |  | 
| 39 | 
            -
                   | 
| 40 | 
            -
                     | 
| 39 | 
            +
                  if mail[:remove_from_bounces]
         | 
| 40 | 
            +
                    remove_to_addrs_from_bounces(sendgrid_mail)
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  with_retry(**@settings[:retry]) do
         | 
| 44 | 
            +
                    @logger.info("Calling sendMail API, #{extract_log_info(sendgrid_mail)}")
         | 
| 45 | 
            +
                    response = sendgrid_client.mail._('send').post(request_body: sendgrid_mail.to_json)
         | 
| 46 | 
            +
                    @logger.info("End calling sendMail API, status_code: #{response.status_code}")
         | 
| 41 47 | 
             
                    handle_response!(response)
         | 
| 42 48 | 
             
                  end
         | 
| 43 49 | 
             
                end
         | 
| 44 50 |  | 
| 45 51 | 
             
                private
         | 
| 46 52 |  | 
| 53 | 
            +
                def sendgrid_client
         | 
| 54 | 
            +
                  @sendgrid_client ||= ::SendGrid::API.new(**@settings[:sendgrid]).client
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                # @param [::SendGrid::Mail]
         | 
| 58 | 
            +
                def remove_to_addrs_from_bounces(sendgrid_mail)
         | 
| 59 | 
            +
                  sendgrid_mail.personalizations.each do |personalization|
         | 
| 60 | 
            +
                    personalization['to'].each do |to|
         | 
| 61 | 
            +
                      @logger.info("Calling deleteBounce API, #{to}")
         | 
| 62 | 
            +
                      # success => 204, not_found => 404
         | 
| 63 | 
            +
                      sendgrid_client.suppression.bounces._(to['email']).delete
         | 
| 64 | 
            +
                      @logger.info('End calling deleteBounce API')
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 47 69 | 
             
                def with_retry(max_count:, wait_seconds:)
         | 
| 48 70 | 
             
                  tryable_count = max_count + 1
         | 
| 49 71 | 
             
                  begin
         | 
| 50 72 | 
             
                    tryable_count -= 1
         | 
| 51 73 | 
             
                    yield
         | 
| 52 | 
            -
                  rescue ::SendGridActionMailerAdapter::ApiClientError =>  | 
| 74 | 
            +
                  rescue ::SendGridActionMailerAdapter::ApiClientError => e
         | 
| 75 | 
            +
                    @logger.error(e)
         | 
| 53 76 | 
             
                    raise
         | 
| 54 | 
            -
                  rescue =>  | 
| 77 | 
            +
                  rescue StandardError => e
         | 
| 55 78 | 
             
                    if tryable_count > 0
         | 
| 79 | 
            +
                      @logger.warn("Retry mail sending, tryable_count: #{tryable_count}")
         | 
| 80 | 
            +
                      @logger.warn(e)
         | 
| 56 81 | 
             
                      sleep(wait_seconds)
         | 
| 57 82 | 
             
                      retry
         | 
| 58 83 | 
             
                    end
         | 
| 84 | 
            +
                    @logger.error('Give up retrying')
         | 
| 85 | 
            +
                    @logger.error(e)
         | 
| 59 86 | 
             
                    raise
         | 
| 60 87 | 
             
                  end
         | 
| 61 88 | 
             
                end
         | 
| 62 89 |  | 
| 90 | 
            +
                def extract_log_info(sendgrid_mail)
         | 
| 91 | 
            +
                  {
         | 
| 92 | 
            +
                    subject: sendgrid_mail.subject,
         | 
| 93 | 
            +
                    personalizations: sendgrid_mail.personalizations,
         | 
| 94 | 
            +
                  }
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
             | 
| 63 97 | 
             
                # @see https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html
         | 
| 64 98 | 
             
                def handle_response!(response)
         | 
| 65 99 | 
             
                  case response.status_code.to_i
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: sendgrid_actionmailer_adapter
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.2 | 
| 4 | 
            +
              version: 0.3.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - ryu39
         | 
| 8 | 
            -
            autorequire: | 
| 8 | 
            +
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-03-09 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: sendgrid-ruby
         | 
| @@ -25,7 +25,7 @@ dependencies: | |
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: '5.0'
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            -
              name:  | 
| 28 | 
            +
              name: actionmailer
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - ">="
         | 
| @@ -39,7 +39,7 @@ dependencies: | |
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 40 | 
             
                    version: '0'
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            -
              name:  | 
| 42 | 
            +
              name: bundler
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 44 | 
             
                requirements:
         | 
| 45 45 | 
             
                - - ">="
         | 
| @@ -53,49 +53,49 @@ dependencies: | |
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 54 | 
             
                    version: '0'
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            -
              name:  | 
| 56 | 
            +
              name: mail
         | 
| 57 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 58 | 
             
                requirements:
         | 
| 59 | 
            -
                - - " | 
| 59 | 
            +
                - - ">="
         | 
| 60 60 | 
             
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: 0 | 
| 61 | 
            +
                    version: '0'
         | 
| 62 62 | 
             
              type: :development
         | 
| 63 63 | 
             
              prerelease: false
         | 
| 64 64 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 65 | 
             
                requirements:
         | 
| 66 | 
            -
                - - " | 
| 66 | 
            +
                - - ">="
         | 
| 67 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            -
                    version: 0 | 
| 68 | 
            +
                    version: '0'
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            -
              name:  | 
| 70 | 
            +
              name: rake
         | 
| 71 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 72 | 
             
                requirements:
         | 
| 73 | 
            -
                - - " | 
| 73 | 
            +
                - - ">="
         | 
| 74 74 | 
             
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            -
                    version: ' | 
| 75 | 
            +
                    version: '0'
         | 
| 76 76 | 
             
              type: :development
         | 
| 77 77 | 
             
              prerelease: false
         | 
| 78 78 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 79 | 
             
                requirements:
         | 
| 80 | 
            -
                - - " | 
| 80 | 
            +
                - - ">="
         | 
| 81 81 | 
             
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            -
                    version: ' | 
| 82 | 
            +
                    version: '0'
         | 
| 83 83 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 84 | 
            -
              name:  | 
| 84 | 
            +
              name: rspec
         | 
| 85 85 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 86 | 
             
                requirements:
         | 
| 87 | 
            -
                - - " | 
| 87 | 
            +
                - - "~>"
         | 
| 88 88 | 
             
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            -
                    version: '0'
         | 
| 89 | 
            +
                    version: '3.0'
         | 
| 90 90 | 
             
              type: :development
         | 
| 91 91 | 
             
              prerelease: false
         | 
| 92 92 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 93 | 
             
                requirements:
         | 
| 94 | 
            -
                - - " | 
| 94 | 
            +
                - - "~>"
         | 
| 95 95 | 
             
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            -
                    version: '0'
         | 
| 96 | 
            +
                    version: '3.0'
         | 
| 97 97 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 98 | 
            -
              name:  | 
| 98 | 
            +
              name: ryu39cop
         | 
| 99 99 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 100 100 | 
             
                requirements:
         | 
| 101 101 | 
             
                - - ">="
         | 
| @@ -109,7 +109,7 @@ dependencies: | |
| 109 109 | 
             
                  - !ruby/object:Gem::Version
         | 
| 110 110 | 
             
                    version: '0'
         | 
| 111 111 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 112 | 
            -
              name:  | 
| 112 | 
            +
              name: webmock
         | 
| 113 113 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 114 114 | 
             
                requirements:
         | 
| 115 115 | 
             
                - - ">="
         | 
| @@ -148,7 +148,7 @@ homepage: https://github.com/ryu39/sendgrid_actionmailer_adapter | |
| 148 148 | 
             
            licenses:
         | 
| 149 149 | 
             
            - MIT
         | 
| 150 150 | 
             
            metadata: {}
         | 
| 151 | 
            -
            post_install_message: | 
| 151 | 
            +
            post_install_message:
         | 
| 152 152 | 
             
            rdoc_options: []
         | 
| 153 153 | 
             
            require_paths:
         | 
| 154 154 | 
             
            - lib
         | 
| @@ -156,16 +156,15 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 156 156 | 
             
              requirements:
         | 
| 157 157 | 
             
              - - ">="
         | 
| 158 158 | 
             
                - !ruby/object:Gem::Version
         | 
| 159 | 
            -
                  version: '2. | 
| 159 | 
            +
                  version: '2.4'
         | 
| 160 160 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 161 161 | 
             
              requirements:
         | 
| 162 162 | 
             
              - - ">="
         | 
| 163 163 | 
             
                - !ruby/object:Gem::Version
         | 
| 164 164 | 
             
                  version: '0'
         | 
| 165 165 | 
             
            requirements: []
         | 
| 166 | 
            -
             | 
| 167 | 
            -
             | 
| 168 | 
            -
            signing_key: 
         | 
| 166 | 
            +
            rubygems_version: 3.2.3
         | 
| 167 | 
            +
            signing_key:
         | 
| 169 168 | 
             
            specification_version: 4
         | 
| 170 169 | 
             
            summary: A ActionMailer adapter using SendGrid Web API v3
         | 
| 171 170 | 
             
            test_files: []
         |