sendgrid_actionmailer_adapter 0.2.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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: []