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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ee79cf7cc71fee2d3bd2212d2bfb1221d9629d90
4
- data.tar.gz: f35a57e974388b72188ae92d9dd168763a662a6c
2
+ SHA256:
3
+ metadata.gz: d59836f5bb9a8cc47a2a4c45406d5ceb7c13798677676b5f8d04db5adbba15d3
4
+ data.tar.gz: 07bf50bf757fafa6d18c8848eac7b40e9789329c4aa0cfd2682726d83ee131bb
5
5
  SHA512:
6
- metadata.gz: c37de30e3e2b91fb8cac5860bda517d44eea91eb04d60403ed6af2b3652a6fcb3b003aaafb6bf4550287c6bb115d5d8ad2e22b18d83e68f608a32c2706292585
7
- data.tar.gz: d82abaf00a36eec76085fe8df9db0311634dd89ec49df7a799be08b55a13bd04bc1018ee6258775b5609854ffeaaab89e6ceb4930134371bfe03ddc180016b20
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
@@ -11,6 +11,7 @@ module SendGridActionMailerAdapter
11
11
  def convert(mail)
12
12
  categories_str = mail['categories']&.value
13
13
  return if categories_str.nil? || categories_str.empty?
14
+
14
15
  categories_str.split(', ').map { |c| ::SendGrid::Category.new(name: c) }
15
16
  end
16
17
 
@@ -9,7 +9,8 @@ module SendGridActionMailerAdapter
9
9
  end
10
10
 
11
11
  def convert(mail)
12
- ::SendGrid::Content.new(type: mail.mime_type, value: mail.body.to_s)
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)
@@ -11,6 +11,7 @@ module SendGridActionMailerAdapter
11
11
  def convert(mail)
12
12
  addr = mail[:reply_to]&.addrs&.first
13
13
  return if addr.nil?
14
+
14
15
  ::SendGrid::Email.new(email: addr.address, name: addr.display_name)
15
16
  end
16
17
 
@@ -11,6 +11,7 @@ module SendGridActionMailerAdapter
11
11
  def convert(mail)
12
12
  send_at_str = mail['send_at']&.value
13
13
  return if send_at_str.nil? || send_at_str.empty?
14
+
14
15
  send_at_str.to_i
15
16
  end
16
17
 
@@ -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
- with_retry(@settings[:retry]) do
40
- response = client.post(request_body: body)
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 => _e
74
+ rescue ::SendGridActionMailerAdapter::ApiClientError => e
75
+ @logger.error(e)
53
76
  raise
54
- rescue => _e
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SendGridActionMailerAdapter
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.2'
5
5
  end
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.0
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: 2017-07-16 00:00:00.000000000 Z
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: bundler
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: rake
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: ryu39cop
56
+ name: mail
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 0.49.1.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.49.1.0
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rspec
70
+ name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '3.0'
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: '3.0'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: webmock
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: mail
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: actionmailer
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.3'
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
- rubyforge_project:
167
- rubygems_version: 2.6.11
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: []