emailbutler 0.8.4 → 0.8.6
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 +4 -4
- data/README.md +1 -1
- data/app/controllers/emailbutler/webhooks_controller.rb +12 -0
- data/lib/emailbutler/configuration.rb +14 -14
- data/lib/emailbutler/container.rb +4 -0
- data/lib/emailbutler/version.rb +1 -1
- data/lib/emailbutler/webhooks/mappers/mailjet.rb +3 -7
- data/lib/emailbutler/webhooks/mappers/mailtrap.rb +30 -0
- data/lib/emailbutler/webhooks/mappers/mandrill.rb +30 -0
- data/lib/emailbutler/webhooks/mappers/resend.rb +3 -6
- data/lib/emailbutler/webhooks/mappers/sendgrid.rb +2 -6
- data/lib/emailbutler/webhooks/mappers/smtp2go.rb +3 -6
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0bd13652cc6d27528cda94c0245808f10ac00a71b903a59a85bf1b5f703d540e
|
|
4
|
+
data.tar.gz: d1e3a64b3b54906385f69231a2e4ecbc2eb417b06226d43954686e06dc55ccae
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: aff55f8d47be9a08766807f4e83ada5e7ae11bb8dc8eedbf0940613222aa768c2ae2ebe6c9af6697fff543e0da256f66eb529c2cd0249981ea51a3bea5f69d36
|
|
7
|
+
data.tar.gz: 2e012d481612783002bf5f8800b0fbfb2ba8c5366f3867d73fa1aeb19cae687367718ef25db3aa7aad268b5d86560f55c406be64a5e0d3915b261236191375ca
|
data/README.md
CHANGED
|
@@ -36,7 +36,7 @@ require 'emailbutler/adapters/active_record'
|
|
|
36
36
|
|
|
37
37
|
Emailbutler.configure do |config|
|
|
38
38
|
config.adapter = Emailbutler::Adapters::ActiveRecord.new # required
|
|
39
|
-
config.providers = %w[sendgrid smtp2go resend mailjet] # optional
|
|
39
|
+
config.providers = %w[sendgrid smtp2go resend mailjet mailtrap mandrill] # optional
|
|
40
40
|
config.ui_username = 'username' # optional
|
|
41
41
|
config.ui_password = 'password' # optional
|
|
42
42
|
config.ui_secured_environments = ['production'] # optional
|
|
@@ -26,6 +26,8 @@ module Emailbutler
|
|
|
26
26
|
when 'smtp2go' then Emailbutler::Container.resolve(:smtp2go_mapper)
|
|
27
27
|
when 'resend' then Emailbutler::Container.resolve(:resend_mapper)
|
|
28
28
|
when 'mailjet' then Emailbutler::Container.resolve(:mailjet_mapper)
|
|
29
|
+
when 'mailtrap' then Emailbutler::Container.resolve(:mailtrap_mapper)
|
|
30
|
+
when 'mandrill' then Emailbutler::Container.resolve(:mandrill_mapper)
|
|
29
31
|
end
|
|
30
32
|
end
|
|
31
33
|
|
|
@@ -35,6 +37,8 @@ module Emailbutler
|
|
|
35
37
|
when 'smtp2go' then smtp2go_params
|
|
36
38
|
when 'resend' then resend_params
|
|
37
39
|
when 'mailjet' then mailjet_params
|
|
40
|
+
when 'mailtrap' then mailtrap_params
|
|
41
|
+
when 'mandrill' then mandrill_params
|
|
38
42
|
end
|
|
39
43
|
end
|
|
40
44
|
|
|
@@ -53,5 +57,13 @@ module Emailbutler
|
|
|
53
57
|
def mailjet_params
|
|
54
58
|
params.permit('event', 'time', 'Message_GUID')
|
|
55
59
|
end
|
|
60
|
+
|
|
61
|
+
def mailtrap_params
|
|
62
|
+
params.permit('events' => %w[event timestamp message_id])
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def mandrill_params
|
|
66
|
+
params.permit('mandrill_events' => %w[event ts _id])
|
|
67
|
+
end
|
|
56
68
|
end
|
|
57
69
|
end
|
|
@@ -7,7 +7,7 @@ module Emailbutler
|
|
|
7
7
|
AVAILABLE_ADAPTERS = %w[
|
|
8
8
|
Emailbutler::Adapters::ActiveRecord
|
|
9
9
|
].freeze
|
|
10
|
-
AVAILABLE_PROVIDERS = %w[sendgrid smtp2go resend mailjet].freeze
|
|
10
|
+
AVAILABLE_PROVIDERS = %w[sendgrid smtp2go resend mailjet mailtrap mandrill].freeze
|
|
11
11
|
|
|
12
12
|
attr_accessor :adapter, :providers, :ui_username, :ui_password, :ui_secured_environments
|
|
13
13
|
|
|
@@ -16,8 +16,8 @@ module Emailbutler
|
|
|
16
16
|
@providers = []
|
|
17
17
|
|
|
18
18
|
# It's required to specify these 3 variables to enable basic auth to UI
|
|
19
|
-
@ui_username =
|
|
20
|
-
@ui_password =
|
|
19
|
+
@ui_username = ''
|
|
20
|
+
@ui_password = ''
|
|
21
21
|
# Secured environments variable must directly contains environment names
|
|
22
22
|
@ui_secured_environments = []
|
|
23
23
|
end
|
|
@@ -25,9 +25,9 @@ module Emailbutler
|
|
|
25
25
|
def validate
|
|
26
26
|
validate_adapter
|
|
27
27
|
validate_providers
|
|
28
|
+
validate_secured_environments
|
|
28
29
|
validate_username
|
|
29
30
|
validate_password
|
|
30
|
-
validate_secured_environments
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
private
|
|
@@ -45,22 +45,22 @@ module Emailbutler
|
|
|
45
45
|
raise InitializeError, 'Providers list contain invalid element'
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
+
def validate_secured_environments
|
|
49
|
+
raise InitializeError, 'Environments list must be array' unless ui_secured_environments.is_a?(Array)
|
|
50
|
+
end
|
|
51
|
+
|
|
48
52
|
def validate_username
|
|
49
|
-
return if
|
|
50
|
-
return if ui_username.is_a?(String)
|
|
53
|
+
return if ui_secured_environments.blank? && ui_username.is_a?(String)
|
|
54
|
+
return if ui_secured_environments.any? && ui_username.is_a?(String) && ui_username.present?
|
|
51
55
|
|
|
52
|
-
raise InitializeError, 'Username must be
|
|
56
|
+
raise InitializeError, 'Username must be string'
|
|
53
57
|
end
|
|
54
58
|
|
|
55
59
|
def validate_password
|
|
56
|
-
return if
|
|
57
|
-
return if ui_password.is_a?(String)
|
|
58
|
-
|
|
59
|
-
raise InitializeError, 'Password must be nil or filled string'
|
|
60
|
-
end
|
|
60
|
+
return if ui_secured_environments.blank? && ui_password.is_a?(String)
|
|
61
|
+
return if ui_secured_environments.any? && ui_password.is_a?(String) && ui_password.present?
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
raise InitializeError, 'Environments list must be array' unless ui_secured_environments.is_a?(Array)
|
|
63
|
+
raise InitializeError, 'Password must be string'
|
|
64
64
|
end
|
|
65
65
|
end
|
|
66
66
|
end
|
|
@@ -5,6 +5,8 @@ require 'emailbutler/webhooks/mappers/sendgrid'
|
|
|
5
5
|
require 'emailbutler/webhooks/mappers/smtp2go'
|
|
6
6
|
require 'emailbutler/webhooks/mappers/resend'
|
|
7
7
|
require 'emailbutler/webhooks/mappers/mailjet'
|
|
8
|
+
require 'emailbutler/webhooks/mappers/mailtrap'
|
|
9
|
+
require 'emailbutler/webhooks/mappers/mandrill'
|
|
8
10
|
require 'emailbutler/webhooks/receiver'
|
|
9
11
|
|
|
10
12
|
module Emailbutler
|
|
@@ -24,6 +26,8 @@ module Emailbutler
|
|
|
24
26
|
register(:smtp2go_mapper) { Emailbutler::Webhooks::Mappers::Smtp2Go.new }
|
|
25
27
|
register(:resend_mapper) { Emailbutler::Webhooks::Mappers::Resend.new }
|
|
26
28
|
register(:mailjet_mapper) { Emailbutler::Webhooks::Mappers::Mailjet.new }
|
|
29
|
+
register(:mailtrap_mapper) { Emailbutler::Webhooks::Mappers::Mailtrap.new }
|
|
30
|
+
register(:mandrill_mapper) { Emailbutler::Webhooks::Mappers::Mandrill.new }
|
|
27
31
|
|
|
28
32
|
# webhook receiver
|
|
29
33
|
register(:webhooks_receiver) { Emailbutler::Webhooks::Receiver.new }
|
data/lib/emailbutler/version.rb
CHANGED
|
@@ -7,19 +7,15 @@ module Emailbutler
|
|
|
7
7
|
DELIVERABILITY_MAPPER = {
|
|
8
8
|
'sent' => 'processed',
|
|
9
9
|
'open' => 'delivered',
|
|
10
|
-
'click' => 'delivered'
|
|
11
|
-
'unsub' => 'failed',
|
|
12
|
-
'blocked' => 'failed',
|
|
13
|
-
'bounce' => 'failed',
|
|
14
|
-
'spam' => 'failed'
|
|
10
|
+
'click' => 'delivered'
|
|
15
11
|
}.freeze
|
|
16
12
|
|
|
17
13
|
def call(payload:)
|
|
18
14
|
payload.stringify_keys!
|
|
19
15
|
# message-id contains data like <uuid>
|
|
20
16
|
message_uuid = payload['Message_GUID']
|
|
21
|
-
status = DELIVERABILITY_MAPPER[payload['event']]
|
|
22
|
-
return [] if message_uuid.nil?
|
|
17
|
+
status = DELIVERABILITY_MAPPER[payload['event']] || Emailbutler::Message::FAILED
|
|
18
|
+
return [] if message_uuid.nil?
|
|
23
19
|
|
|
24
20
|
[
|
|
25
21
|
{
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Emailbutler
|
|
4
|
+
module Webhooks
|
|
5
|
+
module Mappers
|
|
6
|
+
class Mailtrap
|
|
7
|
+
DELIVERABILITY_MAPPER = {
|
|
8
|
+
'delivery' => 'delivered',
|
|
9
|
+
'open' => 'delivered',
|
|
10
|
+
'click' => 'delivered'
|
|
11
|
+
}.freeze
|
|
12
|
+
|
|
13
|
+
def call(payload:)
|
|
14
|
+
payload['events'].filter_map { |message|
|
|
15
|
+
message.stringify_keys!
|
|
16
|
+
message_uuid = message['message_id']
|
|
17
|
+
status = DELIVERABILITY_MAPPER[message['event']] || Emailbutler::Message::FAILED
|
|
18
|
+
next if message_uuid.nil?
|
|
19
|
+
|
|
20
|
+
{
|
|
21
|
+
message_uuid: message_uuid,
|
|
22
|
+
status: status,
|
|
23
|
+
timestamp: message['timestamp'] ? Time.at(message['timestamp']).utc.to_datetime : nil
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Emailbutler
|
|
4
|
+
module Webhooks
|
|
5
|
+
module Mappers
|
|
6
|
+
class Mandrill
|
|
7
|
+
DELIVERABILITY_MAPPER = {
|
|
8
|
+
'send' => 'processed',
|
|
9
|
+
'open' => 'delivered',
|
|
10
|
+
'click' => 'delivered'
|
|
11
|
+
}.freeze
|
|
12
|
+
|
|
13
|
+
def call(payload:)
|
|
14
|
+
payload['mandrill_events'].filter_map { |message|
|
|
15
|
+
message.stringify_keys!
|
|
16
|
+
message_uuid = message['_id']
|
|
17
|
+
status = DELIVERABILITY_MAPPER[message['event']] || Emailbutler::Message::FAILED
|
|
18
|
+
next if message_uuid.nil?
|
|
19
|
+
|
|
20
|
+
{
|
|
21
|
+
message_uuid: message_uuid,
|
|
22
|
+
status: status,
|
|
23
|
+
timestamp: message['ts'] ? Time.at(message['ts']).utc.to_datetime : nil
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -8,17 +8,14 @@ module Emailbutler
|
|
|
8
8
|
'email.sent' => 'processed',
|
|
9
9
|
'email.delivered' => 'delivered',
|
|
10
10
|
'email.opened' => 'delivered',
|
|
11
|
-
'email.clicked' => 'delivered'
|
|
12
|
-
'email.delivered_delayed' => 'failed',
|
|
13
|
-
'email.bounced' => 'failed',
|
|
14
|
-
'email.complained' => 'failed'
|
|
11
|
+
'email.clicked' => 'delivered'
|
|
15
12
|
}.freeze
|
|
16
13
|
|
|
17
14
|
def call(payload:)
|
|
18
15
|
payload.stringify_keys!
|
|
19
16
|
message_uuid = payload.dig('data', 'email_id')
|
|
20
|
-
status = DELIVERABILITY_MAPPER[payload['type']]
|
|
21
|
-
return [] if message_uuid.nil?
|
|
17
|
+
status = DELIVERABILITY_MAPPER[payload['type']] || Emailbutler::Message::FAILED
|
|
18
|
+
return [] if message_uuid.nil?
|
|
22
19
|
|
|
23
20
|
[
|
|
24
21
|
{
|
|
@@ -8,18 +8,14 @@ module Emailbutler
|
|
|
8
8
|
'processed' => 'processed',
|
|
9
9
|
'delivered' => 'delivered',
|
|
10
10
|
'open' => 'delivered',
|
|
11
|
-
'click' => 'delivered'
|
|
12
|
-
'deferred' => 'failed',
|
|
13
|
-
'bounce' => 'failed',
|
|
14
|
-
'dropped' => 'failed',
|
|
15
|
-
'spamreport' => 'failed'
|
|
11
|
+
'click' => 'delivered'
|
|
16
12
|
}.freeze
|
|
17
13
|
|
|
18
14
|
def call(payload:)
|
|
19
15
|
payload['_json'].filter_map { |message|
|
|
20
16
|
message.stringify_keys!
|
|
21
17
|
message_uuid = message['smtp-id'] || message['sg_message_id']
|
|
22
|
-
status = DELIVERABILITY_MAPPER[message['event']]
|
|
18
|
+
status = DELIVERABILITY_MAPPER[message['event']] || Emailbutler::Message::FAILED
|
|
23
19
|
next if message_uuid.nil? || status.nil?
|
|
24
20
|
|
|
25
21
|
{
|
|
@@ -8,18 +8,15 @@ module Emailbutler
|
|
|
8
8
|
'processed' => 'processed',
|
|
9
9
|
'delivered' => 'delivered',
|
|
10
10
|
'open' => 'delivered',
|
|
11
|
-
'click' => 'delivered'
|
|
12
|
-
'bounce' => 'failed',
|
|
13
|
-
'reject' => 'failed',
|
|
14
|
-
'spam' => 'failed'
|
|
11
|
+
'click' => 'delivered'
|
|
15
12
|
}.freeze
|
|
16
13
|
|
|
17
14
|
def call(payload:)
|
|
18
15
|
payload.stringify_keys!
|
|
19
16
|
# message-id contains data like <uuid>
|
|
20
17
|
message_uuid = payload['message-id'][1..-2]
|
|
21
|
-
status = DELIVERABILITY_MAPPER[payload['event']]
|
|
22
|
-
return [] if message_uuid.nil?
|
|
18
|
+
status = DELIVERABILITY_MAPPER[payload['event']] || Emailbutler::Message::FAILED
|
|
19
|
+
return [] if message_uuid.nil?
|
|
23
20
|
|
|
24
21
|
[
|
|
25
22
|
{
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: emailbutler
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.8.
|
|
4
|
+
version: 0.8.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Bogdanov Anton
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-
|
|
11
|
+
date: 2024-10-04 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: dry-container
|
|
@@ -245,6 +245,8 @@ files:
|
|
|
245
245
|
- lib/emailbutler/mailers/helpers.rb
|
|
246
246
|
- lib/emailbutler/version.rb
|
|
247
247
|
- lib/emailbutler/webhooks/mappers/mailjet.rb
|
|
248
|
+
- lib/emailbutler/webhooks/mappers/mailtrap.rb
|
|
249
|
+
- lib/emailbutler/webhooks/mappers/mandrill.rb
|
|
248
250
|
- lib/emailbutler/webhooks/mappers/resend.rb
|
|
249
251
|
- lib/emailbutler/webhooks/mappers/sendgrid.rb
|
|
250
252
|
- lib/emailbutler/webhooks/mappers/smtp2go.rb
|