mail_plugger 1.0.0.beta1 → 1.0.0.rc1
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/.rubocop.yml +3 -0
- data/CHANGELOG.md +12 -0
- data/Gemfile.lock +8 -8
- data/README.md +16 -3
- data/docs/usage_in_ruby_on_rails.md +4 -4
- data/docs/usage_in_script_or_console.md +9 -9
- data/docs/usage_of_attachments_in_ruby_on_rails.md +110 -0
- data/docs/usage_of_aws_ses_in_ruby_on_rails.md +136 -0
- data/docs/usage_of_delivery_method.md +104 -0
- data/docs/usage_of_mailgun_in_ruby_on_rails.md +58 -0
- data/docs/usage_of_mandrill_in_ruby_on_rails.md +104 -0
- data/docs/usage_of_more_delivery_system_in_ruby_on_rails.md +332 -0
- data/docs/usage_of_one_delivery_system_with_more_send_methods_in_ruby_on_rails.md +119 -0
- data/docs/usage_of_plug_in_method.md +62 -0
- data/docs/usage_of_postmark_in_ruby_on_rails.md +59 -0
- data/docs/usage_of_secial_options_in_ruby_on_rails.md +90 -0
- data/docs/usage_of_sendgrid_in_ruby_on_rails.md +82 -0
- data/docs/usage_of_sparkpost_in_ruby_on_rails.md +142 -0
- data/gemfiles/mail_2.6.gemfile.lock +8 -8
- data/gemfiles/mail_2.7.0.gemfile.lock +8 -8
- data/gemfiles/mail_2.7.gemfile.lock +8 -8
- data/lib/mail_plugger.rb +36 -26
- data/lib/mail_plugger/delivery_method.rb +42 -5
- data/lib/mail_plugger/mail_helper.rb +41 -18
- data/lib/mail_plugger/version.rb +1 -1
- data/mail_plugger.gemspec +4 -3
- metadata +18 -6
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
mail_plugger (0.
|
4
|
+
mail_plugger (1.0.0.rc1)
|
5
5
|
mail (~> 2.5)
|
6
6
|
|
7
7
|
GEM
|
@@ -45,16 +45,16 @@ GEM
|
|
45
45
|
diff-lcs (>= 1.2.0, < 2.0)
|
46
46
|
rspec-support (~> 3.10.0)
|
47
47
|
rspec-support (3.10.1)
|
48
|
-
rubocop (1.
|
48
|
+
rubocop (1.8.0)
|
49
49
|
parallel (~> 1.10)
|
50
|
-
parser (>=
|
50
|
+
parser (>= 3.0.0.0)
|
51
51
|
rainbow (>= 2.2.2, < 4.0)
|
52
52
|
regexp_parser (>= 1.8, < 3.0)
|
53
53
|
rexml
|
54
54
|
rubocop-ast (>= 1.2.0, < 2.0)
|
55
55
|
ruby-progressbar (~> 1.7)
|
56
|
-
unicode-display_width (>= 1.4.0, <
|
57
|
-
rubocop-ast (1.
|
56
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
57
|
+
rubocop-ast (1.4.0)
|
58
58
|
parser (>= 2.7.1.5)
|
59
59
|
rubocop-performance (1.9.2)
|
60
60
|
rubocop (>= 0.90.0, < 2.0)
|
@@ -63,14 +63,14 @@ GEM
|
|
63
63
|
rubocop (~> 1.0)
|
64
64
|
rubocop-ast (>= 1.1.0)
|
65
65
|
ruby-progressbar (1.11.0)
|
66
|
-
simplecov (0.
|
66
|
+
simplecov (0.21.2)
|
67
67
|
docile (~> 1.1)
|
68
68
|
simplecov-html (~> 0.11)
|
69
69
|
simplecov_json_formatter (~> 0.1)
|
70
70
|
simplecov-html (0.12.3)
|
71
71
|
simplecov_json_formatter (0.1.2)
|
72
72
|
thor (1.0.1)
|
73
|
-
unicode-display_width (
|
73
|
+
unicode-display_width (2.0.0)
|
74
74
|
webmock (3.11.0)
|
75
75
|
addressable (>= 2.3.6)
|
76
76
|
crack (>= 0.3.2)
|
@@ -92,4 +92,4 @@ DEPENDENCIES
|
|
92
92
|
webmock (~> 3.0)
|
93
93
|
|
94
94
|
BUNDLED WITH
|
95
|
-
2.2.
|
95
|
+
2.2.4
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
mail_plugger (0.
|
4
|
+
mail_plugger (1.0.0.rc1)
|
5
5
|
mail (~> 2.5)
|
6
6
|
|
7
7
|
GEM
|
@@ -43,16 +43,16 @@ GEM
|
|
43
43
|
diff-lcs (>= 1.2.0, < 2.0)
|
44
44
|
rspec-support (~> 3.10.0)
|
45
45
|
rspec-support (3.10.1)
|
46
|
-
rubocop (1.
|
46
|
+
rubocop (1.8.0)
|
47
47
|
parallel (~> 1.10)
|
48
|
-
parser (>=
|
48
|
+
parser (>= 3.0.0.0)
|
49
49
|
rainbow (>= 2.2.2, < 4.0)
|
50
50
|
regexp_parser (>= 1.8, < 3.0)
|
51
51
|
rexml
|
52
52
|
rubocop-ast (>= 1.2.0, < 2.0)
|
53
53
|
ruby-progressbar (~> 1.7)
|
54
|
-
unicode-display_width (>= 1.4.0, <
|
55
|
-
rubocop-ast (1.
|
54
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
55
|
+
rubocop-ast (1.4.0)
|
56
56
|
parser (>= 2.7.1.5)
|
57
57
|
rubocop-performance (1.9.2)
|
58
58
|
rubocop (>= 0.90.0, < 2.0)
|
@@ -61,14 +61,14 @@ GEM
|
|
61
61
|
rubocop (~> 1.0)
|
62
62
|
rubocop-ast (>= 1.1.0)
|
63
63
|
ruby-progressbar (1.11.0)
|
64
|
-
simplecov (0.
|
64
|
+
simplecov (0.21.2)
|
65
65
|
docile (~> 1.1)
|
66
66
|
simplecov-html (~> 0.11)
|
67
67
|
simplecov_json_formatter (~> 0.1)
|
68
68
|
simplecov-html (0.12.3)
|
69
69
|
simplecov_json_formatter (0.1.2)
|
70
70
|
thor (1.0.1)
|
71
|
-
unicode-display_width (
|
71
|
+
unicode-display_width (2.0.0)
|
72
72
|
webmock (3.11.0)
|
73
73
|
addressable (>= 2.3.6)
|
74
74
|
crack (>= 0.3.2)
|
@@ -90,4 +90,4 @@ DEPENDENCIES
|
|
90
90
|
webmock (~> 3.0)
|
91
91
|
|
92
92
|
BUNDLED WITH
|
93
|
-
2.2.
|
93
|
+
2.2.4
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
mail_plugger (0.
|
4
|
+
mail_plugger (1.0.0.rc1)
|
5
5
|
mail (~> 2.5)
|
6
6
|
|
7
7
|
GEM
|
@@ -43,16 +43,16 @@ GEM
|
|
43
43
|
diff-lcs (>= 1.2.0, < 2.0)
|
44
44
|
rspec-support (~> 3.10.0)
|
45
45
|
rspec-support (3.10.1)
|
46
|
-
rubocop (1.
|
46
|
+
rubocop (1.8.0)
|
47
47
|
parallel (~> 1.10)
|
48
|
-
parser (>=
|
48
|
+
parser (>= 3.0.0.0)
|
49
49
|
rainbow (>= 2.2.2, < 4.0)
|
50
50
|
regexp_parser (>= 1.8, < 3.0)
|
51
51
|
rexml
|
52
52
|
rubocop-ast (>= 1.2.0, < 2.0)
|
53
53
|
ruby-progressbar (~> 1.7)
|
54
|
-
unicode-display_width (>= 1.4.0, <
|
55
|
-
rubocop-ast (1.
|
54
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
55
|
+
rubocop-ast (1.4.0)
|
56
56
|
parser (>= 2.7.1.5)
|
57
57
|
rubocop-performance (1.9.2)
|
58
58
|
rubocop (>= 0.90.0, < 2.0)
|
@@ -61,14 +61,14 @@ GEM
|
|
61
61
|
rubocop (~> 1.0)
|
62
62
|
rubocop-ast (>= 1.1.0)
|
63
63
|
ruby-progressbar (1.11.0)
|
64
|
-
simplecov (0.
|
64
|
+
simplecov (0.21.2)
|
65
65
|
docile (~> 1.1)
|
66
66
|
simplecov-html (~> 0.11)
|
67
67
|
simplecov_json_formatter (~> 0.1)
|
68
68
|
simplecov-html (0.12.3)
|
69
69
|
simplecov_json_formatter (0.1.2)
|
70
70
|
thor (1.0.1)
|
71
|
-
unicode-display_width (
|
71
|
+
unicode-display_width (2.0.0)
|
72
72
|
webmock (3.11.0)
|
73
73
|
addressable (>= 2.3.6)
|
74
74
|
crack (>= 0.3.2)
|
@@ -90,4 +90,4 @@ DEPENDENCIES
|
|
90
90
|
webmock (~> 3.0)
|
91
91
|
|
92
92
|
BUNDLED WITH
|
93
|
-
2.2.
|
93
|
+
2.2.4
|
data/lib/mail_plugger.rb
CHANGED
@@ -9,26 +9,22 @@ require 'mail_plugger/version'
|
|
9
9
|
|
10
10
|
module MailPlugger
|
11
11
|
class << self
|
12
|
-
attr_reader :
|
12
|
+
attr_reader :client, :delivery_options, :delivery_settings
|
13
13
|
|
14
14
|
# Plug in defined API(s) class.
|
15
15
|
#
|
16
|
-
# @param [String] delivery_system the name of the API
|
16
|
+
# @param [String/Symbol] delivery_system the name of the API
|
17
17
|
#
|
18
18
|
# @example using Rails config/initializers/mail_plugger.rb
|
19
19
|
#
|
20
20
|
# The defined API class should have an 'initializer' and a 'deliver' method.
|
21
21
|
# class DefinedApiClientClass
|
22
|
-
# def initialize(options = {})
|
23
|
-
# @settings = { api_key:
|
24
|
-
# @
|
25
|
-
# @message_from = options[:from]
|
26
|
-
# @message_subject = options[:subject]
|
27
|
-
# @message_body_text = options[:text_part]
|
28
|
-
# @message_body_html = options[:html_part]
|
22
|
+
# def initialize(options = {})
|
23
|
+
# @settings = { api_key: '12345' }
|
24
|
+
# @options = options
|
29
25
|
# end
|
30
26
|
#
|
31
|
-
# def deliver
|
27
|
+
# def deliver
|
32
28
|
# API.new(@settings).client.post(generate_mail_hash)
|
33
29
|
# end
|
34
30
|
#
|
@@ -38,24 +34,24 @@ module MailPlugger
|
|
38
34
|
# {
|
39
35
|
# to: generate_recipients,
|
40
36
|
# from: {
|
41
|
-
# email: @
|
37
|
+
# email: @options[:from].first
|
42
38
|
# },
|
43
|
-
# subject: @
|
39
|
+
# subject: @options[:subject],
|
44
40
|
# content: [
|
45
41
|
# {
|
46
42
|
# type: 'text/plain',
|
47
|
-
# value: @
|
43
|
+
# value: @options[:text_part]
|
48
44
|
# },
|
49
45
|
# {
|
50
|
-
# type: 'text/html',
|
51
|
-
# value: @
|
46
|
+
# type: 'text/html; charset=UTF-8',
|
47
|
+
# value: @options[:html_part]
|
52
48
|
# }
|
53
49
|
# ]
|
54
50
|
# }
|
55
51
|
# end
|
56
52
|
#
|
57
53
|
# def generate_recipients
|
58
|
-
# @
|
54
|
+
# @options[:to].map do |to|
|
59
55
|
# {
|
60
56
|
# email: to
|
61
57
|
# }
|
@@ -63,18 +59,15 @@ module MailPlugger
|
|
63
59
|
# end
|
64
60
|
# end
|
65
61
|
#
|
66
|
-
# MailPlugger.plug_in('
|
62
|
+
# MailPlugger.plug_in('defined_api') do |api|
|
67
63
|
# # It will search these options in the Mail::Message object
|
68
64
|
# api.delivery_options = [:to, :from, :subject, :text_part, :html_part]
|
69
|
-
#
|
65
|
+
# api.delivery_settings = { return_response: true }
|
70
66
|
# api.client = DefinedApiClientClass
|
71
67
|
# end
|
72
68
|
#
|
73
69
|
def plug_in(delivery_system)
|
74
|
-
|
75
|
-
raise Error::WrongDeliverySystem, 'Delivery system is nil or empty. ' \
|
76
|
-
'You should provide correct MailPlugger.plug_in parameter'
|
77
|
-
end
|
70
|
+
check_value(delivery_system)
|
78
71
|
|
79
72
|
@delivery_system = delivery_system
|
80
73
|
|
@@ -83,15 +76,32 @@ module MailPlugger
|
|
83
76
|
raise Error::WrongPlugInOption, e.message
|
84
77
|
end
|
85
78
|
|
86
|
-
# Define 'delivery_options' and '
|
87
|
-
# generating a hash where the key is the
|
88
|
-
# set/use more than one API.
|
89
|
-
%w[delivery_options delivery_settings
|
79
|
+
# Define 'client', 'delivery_options' and 'delivery_settings' setter
|
80
|
+
# methods. These methods are generating a hash where the key is the
|
81
|
+
# 'delivery_system'. This let us to set/use more than one API.
|
82
|
+
%w[client delivery_options delivery_settings].each do |method|
|
90
83
|
define_method "#{method}=" do |value|
|
91
84
|
variable = instance_variable_get("@#{method}")
|
92
85
|
variable = instance_variable_set("@#{method}", {}) if variable.nil?
|
93
86
|
variable[@delivery_system] = value
|
94
87
|
end
|
95
88
|
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def check_value(delivery_system)
|
93
|
+
if delivery_system.nil?
|
94
|
+
raise Error::WrongDeliverySystem, '"delivery_system" is nil'
|
95
|
+
end
|
96
|
+
|
97
|
+
if delivery_system.is_a?(String) && delivery_system.strip.empty?
|
98
|
+
raise Error::WrongDeliverySystem, '"delivery_system" is empty'
|
99
|
+
end
|
100
|
+
|
101
|
+
return if delivery_system.is_a?(String) || delivery_system.is_a?(Symbol)
|
102
|
+
|
103
|
+
raise Error::WrongDeliverySystem, '"delivery_system" does not a ' \
|
104
|
+
'String or Symbol'
|
105
|
+
end
|
96
106
|
end
|
97
107
|
end
|
@@ -8,19 +8,31 @@ module MailPlugger
|
|
8
8
|
# method, then these attributes can be nil, if not then we should set these
|
9
9
|
# attributes.
|
10
10
|
#
|
11
|
-
# @param [Hash] options
|
11
|
+
# @param [Hash] options below
|
12
|
+
# @option options [Class/Hash] client
|
13
|
+
# e.g. DefinedApiClientClass or { 'key' => DefinedApiClientClass }
|
14
|
+
#
|
15
|
+
# @option options [Array/Hash] delivery_options
|
16
|
+
# e.g. [:to, :from, :subject, :body] or
|
17
|
+
# { 'key' => [:to, :from, :subject, :body] }
|
18
|
+
#
|
19
|
+
# @option options [Hash] delivery_settings
|
20
|
+
# e.g. { return_response: true }
|
21
|
+
#
|
22
|
+
# @option options [String/Symbol] default_delivery_system
|
23
|
+
# e.g. 'defined_api'
|
12
24
|
def initialize(options = {})
|
25
|
+
@client = options[:client] || MailPlugger.client
|
26
|
+
|
13
27
|
@delivery_options = options[:delivery_options] ||
|
14
28
|
MailPlugger.delivery_options
|
15
29
|
|
16
|
-
@
|
30
|
+
@delivery_settings = options[:delivery_settings] ||
|
31
|
+
MailPlugger.delivery_settings
|
17
32
|
|
18
33
|
@default_delivery_system = options[:default_delivery_system] ||
|
19
34
|
default_delivery_system_get
|
20
35
|
|
21
|
-
@delivery_settings = options[:delivery_settings] ||
|
22
|
-
MailPlugger.delivery_settings
|
23
|
-
|
24
36
|
@message = nil
|
25
37
|
end
|
26
38
|
|
@@ -31,6 +43,31 @@ module MailPlugger
|
|
31
43
|
# provided client class which has a 'deliver' method.
|
32
44
|
#
|
33
45
|
# @param [Mail::Message] message what we would like to send
|
46
|
+
#
|
47
|
+
# @return [Mail::Message/Hash] depend on delivery_settings and method calls
|
48
|
+
#
|
49
|
+
# @example
|
50
|
+
#
|
51
|
+
# MailPlugger.plug_in('test_api_client') do |api|
|
52
|
+
# api.delivery_options = %i[from to subject body]
|
53
|
+
# api.client = DefinedApiClientClass
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# message = Mail.new(from: 'from@example.com', to: 'to@example.com',
|
57
|
+
# subject: 'Test email', body: 'Test email body')
|
58
|
+
#
|
59
|
+
# MailPlugger::DeliveryMethod.new.deliver!(message)
|
60
|
+
#
|
61
|
+
# or
|
62
|
+
#
|
63
|
+
# message = Mail.new(from: 'from@example.com', to: 'to@example.com',
|
64
|
+
# subject: 'Test email', body: 'Test email body')
|
65
|
+
#
|
66
|
+
# MailPlugger::DeliveryMethod.new(
|
67
|
+
# delivery_options: %i[from to subject body],
|
68
|
+
# client: DefinedApiClientClass
|
69
|
+
# ).deliver!(message)
|
70
|
+
#
|
34
71
|
def deliver!(message)
|
35
72
|
unless message.is_a?(Mail::Message)
|
36
73
|
raise Error::WrongParameter,
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'base64'
|
4
|
+
require 'mail/indifferent_hash'
|
4
5
|
|
5
6
|
module MailPlugger
|
6
7
|
module MailHelper
|
@@ -42,6 +43,8 @@ module MailPlugger
|
|
42
43
|
data = {}
|
43
44
|
|
44
45
|
delivery_options.each do |option|
|
46
|
+
option = option.to_sym unless option.is_a?(Symbol)
|
47
|
+
|
45
48
|
data[option] =
|
46
49
|
case option
|
47
50
|
when :from, :to, :cc, :bcc, :subject
|
@@ -50,12 +53,14 @@ module MailPlugger
|
|
50
53
|
extract_attachments
|
51
54
|
when :body, :html_part, :text_part
|
52
55
|
@message.public_send(option)&.decoded
|
56
|
+
when :message_obj
|
57
|
+
@message
|
53
58
|
else
|
54
|
-
message_field_value_from(@message[option
|
59
|
+
message_field_value_from(@message[option])
|
55
60
|
end
|
56
61
|
end
|
57
62
|
|
58
|
-
data
|
63
|
+
Mail::IndifferentHash.new(data)
|
59
64
|
end
|
60
65
|
|
61
66
|
# Tries to set up a default delivery system, if the 'delivery_system'
|
@@ -65,11 +70,7 @@ module MailPlugger
|
|
65
70
|
#
|
66
71
|
# @return [Stirng] the first key of the 'delivery_options' or 'client'
|
67
72
|
def default_delivery_system_get
|
68
|
-
|
69
|
-
@delivery_options
|
70
|
-
elsif @client.is_a?(Hash)
|
71
|
-
@client
|
72
|
-
end&.keys&.first
|
73
|
+
extract_keys&.first
|
73
74
|
end
|
74
75
|
|
75
76
|
# Extract 'delivery_options'. If it's a hash then it'll return the right
|
@@ -95,16 +96,30 @@ module MailPlugger
|
|
95
96
|
# @return [String] with the name of the delivery system
|
96
97
|
def delivery_system
|
97
98
|
@delivery_system ||=
|
98
|
-
(@message && message_field_value_from(@message[
|
99
|
+
(@message && message_field_value_from(@message[:delivery_system])) ||
|
99
100
|
@default_delivery_system
|
100
101
|
|
101
|
-
|
102
|
-
|
102
|
+
delivery_system_value_check
|
103
|
+
|
104
|
+
@delivery_system
|
105
|
+
end
|
106
|
+
|
107
|
+
# Check the given 'delivery_options' or 'client' are hashes and
|
108
|
+
# if one of that does then check the 'delivery_system' is valid or not.
|
109
|
+
# If the given 'delivery_system' is nil or doesn't match with extracted keys
|
110
|
+
# then it will raise error.
|
111
|
+
def delivery_system_value_check
|
112
|
+
return unless @delivery_options.is_a?(Hash) || @client.is_a?(Hash)
|
113
|
+
|
114
|
+
if @delivery_system.nil?
|
103
115
|
raise Error::WrongDeliverySystem,
|
104
116
|
'"delivery_system" was not defined as a Mail::Message parameter'
|
105
117
|
end
|
106
118
|
|
107
|
-
@delivery_system
|
119
|
+
return if extract_keys&.include?(@delivery_system)
|
120
|
+
|
121
|
+
raise Error::WrongDeliverySystem,
|
122
|
+
"\"delivery_system\" '#{@delivery_system}' does not exist"
|
108
123
|
end
|
109
124
|
|
110
125
|
# Extract attachments.
|
@@ -112,21 +127,29 @@ module MailPlugger
|
|
112
127
|
# @return [Array] with extracted attachment hashes
|
113
128
|
def extract_attachments
|
114
129
|
@message.attachments&.map do |attachment|
|
115
|
-
hash =
|
116
|
-
if attachment.inline?
|
117
|
-
{ cid: attachment.cid }
|
118
|
-
else
|
119
|
-
{ filename: attachment.filename }
|
120
|
-
end
|
130
|
+
hash = attachment.inline? ? { cid: attachment.cid } : {}
|
121
131
|
|
122
132
|
hash.merge(
|
133
|
+
filename: attachment.filename,
|
123
134
|
type: attachment.mime_type,
|
124
135
|
content: Base64.encode64(attachment.decoded)
|
125
136
|
)
|
126
137
|
end
|
127
138
|
end
|
128
139
|
|
129
|
-
#
|
140
|
+
# Extract keys from 'delivery_options' or 'client', depends on which is a
|
141
|
+
# hash. If none of these are hashes then returns nil.
|
142
|
+
#
|
143
|
+
# @return [Array/NilClass] with the keys of 'delivery_options' or 'client'
|
144
|
+
def extract_keys
|
145
|
+
if @delivery_options.is_a?(Hash)
|
146
|
+
@delivery_options
|
147
|
+
elsif @client.is_a?(Hash)
|
148
|
+
@client
|
149
|
+
end&.keys
|
150
|
+
end
|
151
|
+
|
152
|
+
# How to Extract the (unparsed) value of the mail message fields.
|
130
153
|
#
|
131
154
|
# @return [String] version dependent method call
|
132
155
|
def mail_field_value
|