sendgrid_notification 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app/jobs/sendgrid_notification/sendmail_job.rb +10 -2
- data/app/models/sendgrid_notification/attachment.rb +37 -0
- data/app/models/sendgrid_notification/base_mailer.rb +6 -1
- data/app/models/sendgrid_notification/mail_recordable.rb +17 -2
- data/app/models/sendgrid_notification/notification_mail.rb +6 -5
- data/app/models/sendgrid_notification/null_mailer.rb +3 -3
- data/app/models/sendgrid_notification/sendgrid_client.rb +5 -1
- data/app/models/sendgrid_notification/sendgrid_mailer.rb +5 -4
- data/app/models/sendgrid_notification/sendgrid_status.rb +23 -9
- data/db/migrate/20191120042452_alter_update_histories_body_to_longtext.rb +14 -0
- data/db/migrate/20191120042453_alter_notification_body_to_mediumtext.rb +14 -0
- data/db/migrate/20191120070545_add_mail_histories_indexes.rb +5 -0
- data/db/migrate/20191125125857_add_attachment_summary_to_mail_histories.rb +5 -0
- data/lib/sendgrid_notification/version.rb +1 -1
- data/lib/tasks/sendgrid_notification_tasks.rake +2 -1
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e396c43724c97f270821ea8d3e6207e4c646fabcc322622a8c3083d43e92e471
|
4
|
+
data.tar.gz: 95233c736ced4094c01141e07fbf30dcaa9644ac356658515934f4df57c7c4eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 644f5639f1a2cef044c0b649f5c034e69035eeff83d4a5be0ff9be6eacdbb6116601d2c3169eab49fe7f3d30591dde9f1115fb16bdf6e6b5557a8af82f231b7e
|
7
|
+
data.tar.gz: df37e36a5bdd31f5df56c0478fbb018f3e9fdc9a768a3746d24e24a98573d29ece9ddd9c2180bcc0484b2f045ec0cd044ad0170b676171e85607232d74f0caaf
|
@@ -1,11 +1,19 @@
|
|
1
1
|
module SendgridNotification
|
2
2
|
class SendmailJob < ApplicationJob
|
3
|
+
class HTTPException < StandardError; end
|
4
|
+
|
3
5
|
queue_as :sendmail
|
4
6
|
|
5
7
|
MailerClass = Rails.application.config.sendgrid_notification.mailer.constantize
|
6
8
|
|
7
|
-
def perform(to, notification_mail, params)
|
8
|
-
|
9
|
+
def perform(to, notification_mail, params, hash_attachments = [])
|
10
|
+
|
11
|
+
mailer = MailerClass.new(params)
|
12
|
+
obj_attachments = hash_attachments.map{|hash| SendgridNotification::Attachment.wrap(hash.symbolize_keys) }
|
13
|
+
mailer.sendmail(to, notification_mail, params, obj_attachments)
|
14
|
+
raise HTTPException, mailer.last_result.body unless mailer.last_result_success?
|
15
|
+
|
16
|
+
mailer.last_result.body
|
9
17
|
end
|
10
18
|
end
|
11
19
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'sendgrid-ruby'
|
2
|
+
|
3
|
+
module SendgridNotification
|
4
|
+
class Attachment
|
5
|
+
include ActiveModel::Model
|
6
|
+
include ActiveModel::Attributes # Rails 5.2
|
7
|
+
|
8
|
+
validates :content_id, :filename, :content, presence: true
|
9
|
+
|
10
|
+
attribute :content_id, :string
|
11
|
+
attribute :filename, :string
|
12
|
+
attribute :content, :string
|
13
|
+
attribute :mime_type, :string, default: "application/octet-stream"
|
14
|
+
attribute :disposition, :string, default: "attachment"
|
15
|
+
|
16
|
+
alias_method :to_h, :attributes
|
17
|
+
|
18
|
+
def as_sendgrid
|
19
|
+
a = ::SendGrid::Attachment.new
|
20
|
+
a.content_id = content_id
|
21
|
+
a.filename = filename
|
22
|
+
a.content = Base64.strict_encode64(content)
|
23
|
+
a.type = mime_type
|
24
|
+
a.disposition = disposition
|
25
|
+
a
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.wrap(hash_or_attachment)
|
29
|
+
case hash_or_attachment
|
30
|
+
when Attachment
|
31
|
+
self
|
32
|
+
else
|
33
|
+
Attachment.new(**hash_or_attachment.to_h)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -8,7 +8,12 @@ module SendgridNotification
|
|
8
8
|
@from_name = _params.fetch(:mail_from_name) { Rails.application.config.sendgrid_notification.mail_from_name }
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
# Send mail about:
|
12
|
+
# +to+ recipent to
|
13
|
+
# +notification_mail+ NotificationMail object for mail expression
|
14
|
+
# +params+ params for notification_mail
|
15
|
+
# +attachments+ attachment in hash or SendgridNotification::Attachment
|
16
|
+
def sendmail(to, notification_mail, params, attachments = [])
|
12
17
|
raise NotImplementedError, "you should implement #{self.class}##{__method__}"
|
13
18
|
end
|
14
19
|
|
@@ -1,17 +1,32 @@
|
|
1
1
|
# prepend me
|
2
2
|
module SendgridNotification
|
3
3
|
module MailRecordable
|
4
|
-
def sendmail(to, notification_mail,
|
4
|
+
def sendmail(to, notification_mail, parmas, attachments = [])
|
5
5
|
result = super
|
6
6
|
|
7
|
-
m = MailHistory.
|
7
|
+
m = MailHistory.new(
|
8
8
|
key: notification_mail.key,
|
9
9
|
to: to,
|
10
10
|
sent_at: Time.now,
|
11
11
|
)
|
12
|
+
m.attachment_summary = attachment_summary(attachments) if m.respond_to?(:attachment_summary=)
|
13
|
+
m.save
|
12
14
|
Rails.logger.error m.errors.full_messages if m.invalid? # and ignore
|
13
15
|
|
14
16
|
result
|
15
17
|
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def attachment_summary(attachments)
|
22
|
+
attachments.map do |a|
|
23
|
+
{
|
24
|
+
content_id: a.content_id,
|
25
|
+
mime_type: a.mime_type,
|
26
|
+
filename: a.filename,
|
27
|
+
size: a.content.bytesize,
|
28
|
+
}
|
29
|
+
end.to_json
|
30
|
+
end
|
16
31
|
end
|
17
32
|
end
|
@@ -12,15 +12,16 @@ module SendgridNotification
|
|
12
12
|
VARIABLE_REGEXP_DEFAULT = /\{\{\s*(\w+)\s*\}\}/
|
13
13
|
self.variable_regexp = VARIABLE_REGEXP_DEFAULT
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
SendmailJob.perform_later(to, self, params)
|
15
|
+
def sendmail_later(to, params, attachments = [])
|
16
|
+
hash_attachments = attachments.map(&:to_h)
|
17
|
+
SendmailJob.perform_later(to, self, params, hash_attachments)
|
18
18
|
end
|
19
19
|
|
20
20
|
alias_method :sendmail, :sendmail_later
|
21
21
|
|
22
|
-
def sendmail_now(to, params =
|
23
|
-
|
22
|
+
def sendmail_now(to, params, attachments = [])
|
23
|
+
hash_attachments = attachments.map(&:to_h)
|
24
|
+
SendmailJob.perform_now(to, self, params, hash_attachments)
|
24
25
|
end
|
25
26
|
|
26
27
|
def apply(params)
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module SendgridNotification
|
2
2
|
class NullMailer < BaseMailer
|
3
3
|
prepend MailRecordable
|
4
|
-
Result = Struct.new(:from, :to, :subject, :body, :sent_at)
|
4
|
+
Result = Struct.new(:from, :to, :subject, :body, :sent_at, :attachments)
|
5
5
|
|
6
6
|
@@results = []
|
7
7
|
cattr_reader :results
|
8
8
|
|
9
|
-
def sendmail(to, notification_mail, params =
|
9
|
+
def sendmail(to, notification_mail, params, attachments = [])
|
10
10
|
body = notification_mail.apply(params)
|
11
|
-
results << Result.new(from, to, notification_mail.subject, body, Time.now)
|
11
|
+
results << Result.new(from, to, notification_mail.subject, body, Time.now, attachments)
|
12
12
|
end
|
13
13
|
|
14
14
|
def last_result
|
@@ -50,8 +50,12 @@ module SendgridNotification
|
|
50
50
|
|
51
51
|
# TODO: status_code が 500 系およびタイムアウトのときにリトライできるようにする
|
52
52
|
# POST /mail/send
|
53
|
-
def mail_send(from:, from_name:, to:, subject:, body:)
|
53
|
+
def mail_send(from:, from_name:, to:, subject:, body:, attachments: [])
|
54
54
|
mail = build_mail(from, from_name, to, subject, body)
|
55
|
+
attachments.each do |a|
|
56
|
+
a = SendgridNotification::Attachment.new(a) if a.is_a?(Hash)
|
57
|
+
mail.add_attachment(a.as_sendgrid)
|
58
|
+
end
|
55
59
|
res = client.mail._('send').post(request_body: mail.to_json)
|
56
60
|
@last_response = Response.new(res)
|
57
61
|
end
|
@@ -3,9 +3,9 @@ module SendgridNotification
|
|
3
3
|
prepend MailRecordable
|
4
4
|
class Error < StandardError; end
|
5
5
|
|
6
|
-
def sendmail(to, notification_mail, params =
|
6
|
+
def sendmail(to, notification_mail, params, attachments = [])
|
7
7
|
body = notification_mail.apply(params)
|
8
|
-
_sendmail(to, notification_mail, body)
|
8
|
+
_sendmail(to, notification_mail, body, attachments: attachments)
|
9
9
|
end
|
10
10
|
|
11
11
|
def last_result
|
@@ -24,13 +24,14 @@ module SendgridNotification
|
|
24
24
|
@sendgrid_client ||= SendgridClient.new
|
25
25
|
end
|
26
26
|
|
27
|
-
def _sendmail(to, notification_mail, body)
|
27
|
+
def _sendmail(to, notification_mail, body, attachments: )
|
28
28
|
sendgrid_client.mail_send(
|
29
29
|
from: from,
|
30
30
|
from_name: from_name,
|
31
31
|
to: to,
|
32
32
|
subject: notification_mail.subject,
|
33
|
-
body: body
|
33
|
+
body: body,
|
34
|
+
attachments: attachments,
|
34
35
|
)
|
35
36
|
end
|
36
37
|
end
|
@@ -17,19 +17,33 @@ module SendgridNotification
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
def self.auto_update
|
21
|
-
|
22
|
-
start_time =
|
20
|
+
def self.auto_update(ignore_errors: false)
|
21
|
+
last_end_time = SendgridNotification::SendgridStatusUpdateHistory.order(:id).reverse_order.limit(1).pluck(:end_time).first
|
22
|
+
start_time = last_end_time || 1.hour.ago.to_i
|
23
23
|
end_time = Time.now.to_i
|
24
24
|
|
25
25
|
suppressions = update(start_time, end_time)
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
begin
|
28
|
+
SendgridStatusUpdateHistory.create!(
|
29
|
+
start_time: start_time,
|
30
|
+
end_time: end_time,
|
31
|
+
count: suppressions.size,
|
32
|
+
body: suppressions.map(&:to_s).join("\n")
|
33
|
+
)
|
34
|
+
rescue => e
|
35
|
+
if ignore_errors
|
36
|
+
warn "#{e} (ignored)"
|
37
|
+
SendgridStatusUpdateHistory.create(
|
38
|
+
start_time: start_time,
|
39
|
+
end_time: end_time,
|
40
|
+
count: suppressions.size,
|
41
|
+
body: "" # ignored
|
42
|
+
)
|
43
|
+
else
|
44
|
+
raise
|
45
|
+
end
|
46
|
+
end
|
33
47
|
end
|
34
48
|
|
35
49
|
# TODO: 前回の保存日時からの内容を記録
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class AlterUpdateHistoriesBodyToLongtext < ActiveRecord::Migration[5.1]
|
2
|
+
def change
|
3
|
+
longtextlimit = 4294967295
|
4
|
+
reversible do |dir|
|
5
|
+
dir.up do
|
6
|
+
change_column :sendgrid_status_update_histories, :body, :text, limit: longtextlimit
|
7
|
+
end
|
8
|
+
|
9
|
+
dir.down do
|
10
|
+
change_column :sendgrid_status_update_histories, :body, :text
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class AlterNotificationBodyToMediumtext < ActiveRecord::Migration[5.1]
|
2
|
+
def change
|
3
|
+
mediumtext = 16777215
|
4
|
+
reversible do |dir|
|
5
|
+
dir.up do
|
6
|
+
change_column :notification_mails, :content, :text, limit: mediumtext
|
7
|
+
end
|
8
|
+
|
9
|
+
dir.down do
|
10
|
+
change_column :notification_mails, :content, :text
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -42,7 +42,8 @@ This is test mail.
|
|
42
42
|
|
43
43
|
desc 'update status after previous autoupdate'
|
44
44
|
task autoupdate: :environment do
|
45
|
-
|
45
|
+
ignore_errors = !!ENV["IGNORE_ERRORS"]
|
46
|
+
SendgridNotification::SendgridStatus.auto_update(ignore_errors: ignore_errors)
|
46
47
|
end
|
47
48
|
|
48
49
|
desc 'only retrieve suppression statuses (start=datetime end=datetime)'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sendgrid_notification
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- HORII Keima
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '5.
|
19
|
+
version: '5.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '5.
|
26
|
+
version: '5.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sendgrid-ruby
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -141,6 +141,7 @@ files:
|
|
141
141
|
- app/jobs/sendgrid_notification/sendmail_job.rb
|
142
142
|
- app/mailers/sendgrid_notification/application_mailer.rb
|
143
143
|
- app/models/sendgrid_notification/application_record.rb
|
144
|
+
- app/models/sendgrid_notification/attachment.rb
|
144
145
|
- app/models/sendgrid_notification/base_mailer.rb
|
145
146
|
- app/models/sendgrid_notification/mail_history.rb
|
146
147
|
- app/models/sendgrid_notification/mail_recordable.rb
|
@@ -156,6 +157,10 @@ files:
|
|
156
157
|
- db/migrate/20170208085706_create_notification_mails.rb
|
157
158
|
- db/migrate/20170208113843_create_mail_histories.rb
|
158
159
|
- db/migrate/20170217072256_create_sendgrid_status_update_histories.rb
|
160
|
+
- db/migrate/20191120042452_alter_update_histories_body_to_longtext.rb
|
161
|
+
- db/migrate/20191120042453_alter_notification_body_to_mediumtext.rb
|
162
|
+
- db/migrate/20191120070545_add_mail_histories_indexes.rb
|
163
|
+
- db/migrate/20191125125857_add_attachment_summary_to_mail_histories.rb
|
159
164
|
- lib/sendgrid_notification.rb
|
160
165
|
- lib/sendgrid_notification/engine.rb
|
161
166
|
- lib/sendgrid_notification/version.rb
|
@@ -179,8 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
184
|
- !ruby/object:Gem::Version
|
180
185
|
version: '0'
|
181
186
|
requirements: []
|
182
|
-
|
183
|
-
rubygems_version: 2.6.13
|
187
|
+
rubygems_version: 3.0.3
|
184
188
|
signing_key:
|
185
189
|
specification_version: 4
|
186
190
|
summary: notification mail sender via sendgrid API
|