unigo-ruby 1.0.1

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.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +133 -0
  4. data/Rakefile +52 -0
  5. data/config/response_schema/domain.yml +74 -0
  6. data/config/response_schema/email.yml +23 -0
  7. data/config/response_schema/event_dump.yml +75 -0
  8. data/config/response_schema/project.yml +59 -0
  9. data/config/response_schema/suppression.yml +71 -0
  10. data/config/response_schema/system.yml +33 -0
  11. data/config/response_schema/tag.yml +26 -0
  12. data/config/response_schema/template.yml +134 -0
  13. data/config/response_schema/unsubscribed.yml +45 -0
  14. data/config/response_schema/webhook.yml +141 -0
  15. data/examples/api/custom_api.rb +14 -0
  16. data/examples/api/domain.rb +25 -0
  17. data/examples/api/email/attachments.rb +28 -0
  18. data/examples/api/email/multiple_recipients.rb +24 -0
  19. data/examples/api/email/send.rb +25 -0
  20. data/examples/api/email/settings.rb +41 -0
  21. data/examples/api/email/subscribe.rb +14 -0
  22. data/examples/api/email/template.rb +26 -0
  23. data/examples/api/email.rb +51 -0
  24. data/examples/api/event_dump.rb +44 -0
  25. data/examples/api/project.rb +44 -0
  26. data/examples/api/suppression.rb +34 -0
  27. data/examples/api/system.rb +10 -0
  28. data/examples/api/tag.rb +15 -0
  29. data/examples/api/template.rb +54 -0
  30. data/examples/api/unsubscribed.rb +22 -0
  31. data/examples/api/webhook.rb +42 -0
  32. data/examples/helpers.rb +29 -0
  33. data/examples/send_mail.rb +44 -0
  34. data/examples/sending_mail.rb +32 -0
  35. data/examples/setup.rb +34 -0
  36. data/lib/unigo/client/domain.rb +34 -0
  37. data/lib/unigo/client/email.rb +25 -0
  38. data/lib/unigo/client/event_dump.rb +37 -0
  39. data/lib/unigo/client/project.rb +34 -0
  40. data/lib/unigo/client/suppression.rb +38 -0
  41. data/lib/unigo/client/system.rb +19 -0
  42. data/lib/unigo/client/tag.rb +24 -0
  43. data/lib/unigo/client/template.rb +34 -0
  44. data/lib/unigo/client/unsubscribed.rb +31 -0
  45. data/lib/unigo/client/webhook.rb +34 -0
  46. data/lib/unigo/client.rb +69 -0
  47. data/lib/unigo/connection.rb +62 -0
  48. data/lib/unigo/helpers/mail/mail.rb +42 -0
  49. data/lib/unigo/helpers/template/template.rb +32 -0
  50. data/lib/unigo/helpers/webhook/webhook.rb +18 -0
  51. data/lib/unigo/helpers.rb +22 -0
  52. data/lib/unigo/response/raise_error.rb +20 -0
  53. data/lib/unigo/validation.rb +45 -0
  54. data/lib/unigo/version.rb +3 -0
  55. data/lib/unigo-ruby.rb +2 -0
  56. data/test/CONFIGFILE.yml +71 -0
  57. data/unigo-ruby.gemspec +24 -0
  58. metadata +182 -0
@@ -0,0 +1,42 @@
1
+ require 'unigo-ruby'
2
+ require 'json'
3
+
4
+ unigo = UniGo::Client.new(
5
+ hostname: 'go1.unisender.ru',
6
+ lang: 'ru',
7
+ api_key: ENV['UNIGO_API_KEY']
8
+ )
9
+
10
+ # Set webhook
11
+ params = {}
12
+
13
+ params[:url] = 'http://example.com'
14
+ params[:status] = :active
15
+
16
+ params[:event_format] = :json_post
17
+ params[:delivery_info] = 1
18
+ params[:single_event] = 0
19
+ params[:max_parallel] = 10
20
+
21
+ params[:events] = {
22
+ email_status: %w(sent delivered opened hard_bounced soft_bounced spam clicked unsubscribed),
23
+ spam_block: ["*"]
24
+ }
25
+
26
+ response = unigo.set_webhook(params)
27
+
28
+ # Get webhook
29
+ response = unigo.get_webhook(
30
+ url: 'http://example.com'
31
+ )
32
+
33
+ # List all webhooks
34
+ response = unigo.list_webhooks(
35
+ limit: 50,
36
+ offset: 0
37
+ )
38
+
39
+ # Delete webhook
40
+ response = unigo.delete_webhook(
41
+ url: 'http://example.com'
42
+ )
@@ -0,0 +1,29 @@
1
+ require 'unigo-ruby'
2
+
3
+ unigo = UniGo::Client.new(
4
+ hostname: 'go1.unisender.ru',
5
+ lang: 'ru',
6
+ api_key: ENV['UNIGO_API_KEY']
7
+ )
8
+
9
+ # Verify webhook callback message
10
+ # Will raise UniGo::Client::InvalidCallbackAuth error unless `auth' field is correct.
11
+ unigo.verify_callback_auth!(params)
12
+
13
+ # Callback helper usage
14
+ # Will raise UniGo::Client::InvalidCallbackAuth error unless `auth' field is correct.
15
+ unigo.callback_helper(params) do |events|
16
+ # [
17
+ # {
18
+ # 'event_name' => 'transactional_email_status',
19
+ # 'event_data' =>
20
+ # {
21
+ # 'email' => 'recipient.email@example.com',
22
+ # 'status' => 'sent',
23
+ # 'event_time' => '2015-11-30 15:09:42',
24
+ # ...
25
+ # }
26
+ # },
27
+ # ...
28
+ # ]
29
+ end
@@ -0,0 +1,44 @@
1
+ require 'unigo-ruby'
2
+ require 'json'
3
+
4
+ unigo = UniGo::Client.new(
5
+ hostname: 'go1.unisender.ru',
6
+ lang: 'ru',
7
+ api_key: ENV['UNIGO_API_KEY'],
8
+ enable_logging: true
9
+ )
10
+
11
+ message = {}
12
+
13
+ message[:template_engine] = 'simple'
14
+ message[:template_id] = 'template_id'
15
+
16
+ # In case template_id is not specified, subject and body are mandatory
17
+ message[:subject] = 'test letter'
18
+ message[:body] = {"html": "tests", "plaintext": "plaintext"}
19
+
20
+ message[:from_email] = 'test@example.net'
21
+ message[:from_name] = 'userName'
22
+
23
+ message[:recipients] = []
24
+ message[:recipients] << {
25
+ email: 'test1@example.com',
26
+ substitutions: { 'substitutionName' => 'substitutionVal', to_name: 'Name Surname' },
27
+ metadata: { key1: 'val' },
28
+ }
29
+
30
+ message[:global_metadata] = { key1: 'val' }
31
+ message[:headers] = { 'X-ReplyTo' => 'reply@example.com' }
32
+ message[:options] = { unsubscribe_url: 'someurl' }
33
+
34
+ message[:attachments] = []
35
+ message[:attachments] << { type: 'text/plain', name: 'myfile.txt', content: 'ZXhhbXBsZSBmaWxl' }
36
+
37
+ message[:inline_attachments] = []
38
+ message[:inline_attachments] << { type: 'image/png', name: 'IMAGECID', content: 'iVBORw0KGgo' }
39
+
40
+ response = unigo.send_email(message: message)
41
+
42
+ puts response.status
43
+ puts response.body.to_h
44
+ puts response.headers
@@ -0,0 +1,32 @@
1
+ require 'unigo-ruby'
2
+ require 'json'
3
+
4
+ unigo = UniGo::Client.new(data_center: 'eu1', lang: 'ru', api_key: ENV['UNIGO_API_KEY'])
5
+
6
+ mail = UniGo::Mail.new
7
+
8
+ template_id = "bc0372d4-69f2-11eb-9d14-366b3a36c9e1"
9
+ mail.template = { template_engine: 'simple', template_id: template_id }
10
+
11
+ mail.from = { from_email: 'test@example.net', from_name: 'userName' }
12
+
13
+ substitutions = { 'substitutionName' => 'substitutionVal', to_name: 'Name Surname 1' }
14
+ recipient = { email: 'test1@example.com', substitutions: substitutions, metadata: { key1: 'val1' } }
15
+ mail.recipients << recipient
16
+
17
+ substitutions = { 'substitutionName' => 'substitutionVal', to_name: 'Name Surname 2' }
18
+ recipient = { email: 'test2@example.com', substitutions: substitutions, metadata: { key1: 'val1' } }
19
+ mail.recipients << recipient
20
+
21
+ mail.global_metadata = { key1: 'val1' }
22
+ mail.headers = { 'X-ReplyTo' => 'reply@example.com' }
23
+ mail.options = { unsubscribe_url: 'someurl' }
24
+
25
+ mail.attachments << { type: 'text/plain', name: 'myfile.txt', content: 'ZXhhbXBsZSBmaWxl' }
26
+ mail.inline_attachments << { type: 'image/png', name: 'IMAGECID', content: 'iVBORw0KGgo' }
27
+
28
+ response = unigo.send_email(mail.to_json)
29
+
30
+ puts response.status
31
+ puts response.body.to_h
32
+ puts response.headers
data/examples/setup.rb ADDED
@@ -0,0 +1,34 @@
1
+ require 'unigo-ruby'
2
+ require 'json'
3
+
4
+ unigo = UniGo::Client.new(
5
+ hostname: 'go1.unisender.ru',
6
+ lang: 'ru',
7
+ api_key: ENV['UNIGO_API_KEY']
8
+ )
9
+
10
+ # Validate domain verification record
11
+ unigo.validate_verification_record(domain: 'example.net')
12
+
13
+ # Create template
14
+ template = {}
15
+
16
+ template[:name] = 'Template Name'
17
+ template[:subject] = 'Email Subject'
18
+ template[:template_engine] = 'simple'
19
+ template[:headers] = {'X-ReplyTo' => 'reply@example.com'}
20
+
21
+ template[:global_substitutions] = { 'someVar' => 'someVal' }
22
+ template[:from_email] = 'test@example.com'
23
+ template[:from_name] = 'userName'
24
+ template[:body] = { html: '<b>Hello {{substitutionName}}</b>' }
25
+ template[:options] = { unsubscribe_url: 'someurl' }
26
+
27
+ template[:attachments] = []
28
+ template[:attachments] << { type: 'text/plain', name: 'myfile.txt', content: 'ZXhhbXBsZSBmaWxl' }
29
+
30
+ template[:inline_attachments] = []
31
+ template[:inline_attachments] << { type: 'image/png', name: 'IMAGECID', content: 'iVBORw0KGgo' }
32
+
33
+ response = unigo.set_template(template: template)
34
+ template_id = response.body.template.id
@@ -0,0 +1,34 @@
1
+ module UniGo
2
+ class Client
3
+ module Domain
4
+ extend UniGo::Validation::ClassMethods
5
+ include UniGo::Validation::InstanceMethods
6
+
7
+ def get_dns_records(params = {})
8
+ post('domain/get-dns-records.json', params)
9
+ end
10
+
11
+ def validate_verification_record(params = {})
12
+ post('domain/validate-verification-record.json', params)
13
+ end
14
+
15
+ def validate_dkim(params = {})
16
+ post('domain/validate-dkim.json', params)
17
+ end
18
+
19
+ def list_domains(params = {})
20
+ post('domain/list.json', params)
21
+ end
22
+
23
+ add_response_validations(
24
+ :domain,
25
+ %w(
26
+ get_dns_records
27
+ validate_verification_record
28
+ validate_dkim
29
+ list_domains
30
+ )
31
+ )
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,25 @@
1
+ module UniGo
2
+ class Client
3
+ module Email
4
+ extend UniGo::Validation::ClassMethods
5
+ include UniGo::Validation::InstanceMethods
6
+
7
+ def send_email(params = {})
8
+ params[:message][:options][:send_at] = handle_time_param(params.dig(:message, :options, :send_at)) if params.dig(:message, :options, :send_at)
9
+ post('email/send.json', params)
10
+ end
11
+
12
+ def subscribe_email(params = {})
13
+ post('email/subscribe.json', params)
14
+ end
15
+
16
+ add_response_validations(
17
+ :email,
18
+ %w(
19
+ send_email
20
+ subscribe_email
21
+ )
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ module UniGo
2
+ class Client
3
+ module EventDump
4
+ extend UniGo::Validation::ClassMethods
5
+ include UniGo::Validation::InstanceMethods
6
+
7
+ def create_event_dump(params = {})
8
+ params[:start_time] = handle_time_param(params[:start_time]) if params[:start_time]
9
+ params[:end_time] = handle_time_param(params[:end_time]) if params[:end_time]
10
+
11
+ post('event-dump/create.json', params)
12
+ end
13
+
14
+ def get_event_dump(params = {})
15
+ post('event-dump/get.json', params)
16
+ end
17
+
18
+ def list_event_dumps(params = {})
19
+ post('event-dump/list.json', params)
20
+ end
21
+
22
+ def delete_event_dump(params = {})
23
+ post('event-dump/delete.json', params)
24
+ end
25
+
26
+ add_response_validations(
27
+ :event_dump,
28
+ %w(
29
+ create_event_dump
30
+ get_event_dump
31
+ list_event_dumps
32
+ delete_event_dump
33
+ )
34
+ )
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,34 @@
1
+ module UniGo
2
+ class Client
3
+ module Project
4
+ extend UniGo::Validation::ClassMethods
5
+ include UniGo::Validation::InstanceMethods
6
+
7
+ def create_project(params = {})
8
+ post('project/create.json', params)
9
+ end
10
+
11
+ def update_project(params = {})
12
+ post('project/update.json', params)
13
+ end
14
+
15
+ def list_projects(params = {})
16
+ post('project/list.json', params)
17
+ end
18
+
19
+ def delete_project(params = {})
20
+ post('project/delete.json', params)
21
+ end
22
+
23
+ add_response_validations(
24
+ :project,
25
+ %w(
26
+ create_project
27
+ update_project
28
+ list_projects
29
+ delete_project
30
+ )
31
+ )
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,38 @@
1
+ module UniGo
2
+ class Client
3
+ module Suppression
4
+ extend UniGo::Validation::ClassMethods
5
+ include UniGo::Validation::InstanceMethods
6
+
7
+ def set_suppression(params = {})
8
+ params[:created] = handle_time_param(params[:created]) if params[:created]
9
+
10
+ post('suppression/set.json', params)
11
+ end
12
+
13
+ def get_suppression(params = {})
14
+ post('suppression/get.json', params)
15
+ end
16
+
17
+ def list_suppressions(params = {})
18
+ params[:start_time] = handle_time_param(params[:start_time]) if params[:start_time]
19
+
20
+ post('suppression/list.json', params)
21
+ end
22
+
23
+ def delete_suppression(params = {})
24
+ post('suppression/delete.json', params)
25
+ end
26
+
27
+ add_response_validations(
28
+ :suppression,
29
+ %w(
30
+ set_suppression
31
+ get_suppression
32
+ list_suppressions
33
+ delete_suppression
34
+ )
35
+ )
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,19 @@
1
+ module UniGo
2
+ class Client
3
+ module System
4
+ extend UniGo::Validation::ClassMethods
5
+ include UniGo::Validation::InstanceMethods
6
+
7
+ def info(params = {})
8
+ post('system/info.json', params)
9
+ end
10
+
11
+ add_response_validations(
12
+ :system,
13
+ %w(
14
+ info
15
+ )
16
+ )
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module UniGo
2
+ class Client
3
+ module Tag
4
+ extend UniGo::Validation::ClassMethods
5
+ include UniGo::Validation::InstanceMethods
6
+
7
+ def list_tags(params = {})
8
+ post('tag/list.json', params)
9
+ end
10
+
11
+ def delete_tag(params = {})
12
+ post('tag/delete.json', params)
13
+ end
14
+
15
+ add_response_validations(
16
+ :tag,
17
+ %w(
18
+ list_tags
19
+ delete_tag
20
+ )
21
+ )
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,34 @@
1
+ module UniGo
2
+ class Client
3
+ module Template
4
+ extend UniGo::Validation::ClassMethods
5
+ include UniGo::Validation::InstanceMethods
6
+
7
+ def set_template(params = {})
8
+ post('template/set.json', params)
9
+ end
10
+
11
+ def get_template(params = {})
12
+ post('template/get.json', params)
13
+ end
14
+
15
+ def list_templates(params = {})
16
+ post('template/list.json', params)
17
+ end
18
+
19
+ def delete_template(params = {})
20
+ post('template/delete.json', params)
21
+ end
22
+
23
+ add_response_validations(
24
+ :template,
25
+ %w(
26
+ set_template
27
+ get_template
28
+ list_templates
29
+ delete_template
30
+ )
31
+ )
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,31 @@
1
+ module UniGo
2
+ class Client
3
+ module Unsubscribed
4
+ extend UniGo::Validation::ClassMethods
5
+ include UniGo::Validation::InstanceMethods
6
+
7
+ def unsubscribe(params = {})
8
+ post('unsubscribed/set.json', params)
9
+ end
10
+
11
+ def check_unsubscribed(params = {})
12
+ post('unsubscribed/check.json', params)
13
+ end
14
+
15
+ def list_unsubscribed(params = {})
16
+ params[:date_from] = handle_date_param(params[:date_from]) if params[:date_from]
17
+
18
+ post('unsubscribed/list.json', params)
19
+ end
20
+
21
+ add_response_validations(
22
+ :unsubscribed,
23
+ %w(
24
+ unsubscribe
25
+ check_unsubscribed
26
+ list_unsubscribed
27
+ )
28
+ )
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,34 @@
1
+ module UniGo
2
+ class Client
3
+ module Webhook
4
+ extend UniGo::Validation::ClassMethods
5
+ include UniGo::Validation::InstanceMethods
6
+
7
+ def set_webhook(params = {})
8
+ post('webhook/set.json', params)
9
+ end
10
+
11
+ def get_webhook(params = {})
12
+ post('webhook/get.json', params)
13
+ end
14
+
15
+ def list_webhooks(params = {})
16
+ post('webhook/list.json', params)
17
+ end
18
+
19
+ def delete_webhook(params = {})
20
+ post('webhook/delete.json', params)
21
+ end
22
+
23
+ add_response_validations(
24
+ :webhook,
25
+ %w(
26
+ set_webhook
27
+ get_webhook
28
+ list_webhooks
29
+ delete_webhook
30
+ )
31
+ )
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,69 @@
1
+ require_relative 'connection'
2
+ require_relative 'validation'
3
+ require_relative 'helpers'
4
+ require_relative 'client/domain'
5
+ require_relative 'client/email'
6
+ require_relative 'client/event_dump'
7
+ require_relative 'client/project'
8
+ require_relative 'client/suppression'
9
+ require_relative 'client/system'
10
+ require_relative 'client/tag'
11
+ require_relative 'client/template'
12
+ require_relative 'client/unsubscribed'
13
+ require_relative 'client/webhook'
14
+
15
+ module UniGo
16
+ class Client
17
+ include UniGo::Connection
18
+ extend UniGo::Validation::ClassMethods
19
+ include UniGo::Validation::InstanceMethods
20
+ include UniGo::Client::Helpers
21
+ include UniGo::Client::Domain
22
+ include UniGo::Client::Email
23
+ include UniGo::Client::EventDump
24
+ include UniGo::Client::Project
25
+ include UniGo::Client::Suppression
26
+ include UniGo::Client::System
27
+ include UniGo::Client::Tag
28
+ include UniGo::Client::Template
29
+ include UniGo::Client::Unsubscribed
30
+ include UniGo::Client::Webhook
31
+
32
+ class BaseException < StandardError; end
33
+ class InvalidCallbackAuth < BaseException; end
34
+
35
+ API_ENDPOINT =
36
+ 'https://%{hostname}/%{lang}/transactional/api/v1/'
37
+
38
+ # * *Args* :
39
+ # - +hostname+ -> string, API hostname, for example 'go1.unisender.ru'
40
+ # - +lang+ -> string, two-letter ISO 639-1 language abbreviation, e.g. 'ru'
41
+ # - +api_key+ -> string, your Unisender Go API key
42
+ # - +timeout+ -> integer, timeout in seconds, 5 by default
43
+ # - +api_key_in_params+ -> boolean, pass API key in parameters, otherwise pass in headers (default)
44
+ # - +enable_logging+ -> boolean, enable logging
45
+ def initialize(params = {})
46
+ @hostname = params[:hostname]
47
+ @lang = params[:lang]
48
+ @api_key = params[:api_key]
49
+ @timeout = params[:timeout] || 5
50
+ @api_key_in_params = params[:api_key_in_params]
51
+ @enable_logging = params[:enable_logging] || ENV['ENABLE_LOGGING']
52
+ end
53
+
54
+ private
55
+
56
+ def api_endpoint
57
+ @api_endpoint ||=
58
+ API_ENDPOINT % { hostname: @hostname, lang: @lang }
59
+ end
60
+
61
+ def handle_time_param(param)
62
+ param.respond_to?(:strftime) ? param.strftime('%Y-%m-%d %H:%M:%S') : param
63
+ end
64
+
65
+ def handle_date_param(param)
66
+ param.respond_to?(:strftime) ? param.strftime('%Y-%m-%d') : param
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,62 @@
1
+ require 'json'
2
+ require 'faraday'
3
+ require 'faraday_middleware'
4
+ require 'hashie'
5
+
6
+ module UniGo
7
+ module Connection
8
+
9
+ def get(url, params = {})
10
+ prepare_params!(params)
11
+
12
+ # Assume HTTP library receives params as Hash
13
+ request(:get, url, params)
14
+ end
15
+
16
+ def post(url, params = {})
17
+ prepare_params!(params)
18
+
19
+ # Assume HTTP library receives payload body as String
20
+ request(:post, url, JSON.dump(params))
21
+ end
22
+
23
+ private
24
+
25
+ def request(method, path, data)
26
+ path = add_version(path)
27
+ @last_response = conn.send(method, path, data)
28
+ end
29
+
30
+ def conn
31
+ headers = {'Content-Type' => 'application/json'}
32
+ prepare_headers!(headers)
33
+
34
+ @conn ||= Faraday.new(
35
+ url: api_endpoint,
36
+ headers: headers,
37
+ request: { timeout: @timeout }
38
+ ) do |conn|
39
+ conn.response :mashify, content_type: /\bjson$/
40
+ conn.response :json, content_type: /\bjson$/
41
+ conn.response :raise_error
42
+ conn.adapter :net_http_persistent
43
+
44
+ if @enable_logging
45
+ conn.response(:logger, nil, { headers: true, bodies: true, errors: true })
46
+ end
47
+ end
48
+ end
49
+
50
+ def prepare_params!(params)
51
+ params.merge!({api_key: @api_key}) if @api_key_in_params
52
+ end
53
+
54
+ def prepare_headers!(headers)
55
+ headers.merge!('X-API-KEY' => @api_key) unless @api_key_in_params
56
+ end
57
+
58
+ def add_version(path)
59
+ "#{path}?platform=unigo_ruby_#{UniGo::VERSION}"
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,42 @@
1
+ module UniGo
2
+ class Mail
3
+ attr_accessor :template, :body, :track, :from, :subject, :global_metadata, :headers, :options,
4
+ :global_substitutions, :recipients, :attachments, :inline_attachments,
5
+ :reply_to, :skip_unsubscribe, :force_send
6
+
7
+ def initialize
8
+ @template = {}
9
+ @from = {}
10
+ @track = {}
11
+ @global_substitutions = {}
12
+ @recipients = []
13
+ @attachments = []
14
+ @inline_attachments = []
15
+ end
16
+
17
+ # backward compatibility
18
+ alias_method :"metadata=", :"global_metadata="
19
+
20
+ def to_json(*)
21
+ {
22
+ message: {
23
+ global_substitutions: self.global_substitutions,
24
+ body: self.body,
25
+ subject: self.subject,
26
+ reply_to: self.reply_to,
27
+ recipients: self.recipients,
28
+ global_metadata: self.global_metadata,
29
+ headers: self.headers,
30
+ attachments: self.attachments,
31
+ inline_attachments: self.inline_attachments,
32
+ options: self.options,
33
+ skip_unsubscribe: self.skip_unsubscribe,
34
+ force_send: self.force_send
35
+ }.merge(self.template)
36
+ .merge(self.from)
37
+ .merge(self.track)
38
+ .delete_if { |_, value| value.to_s.strip == '' || value == [] || value == {}}
39
+ }
40
+ end
41
+ end
42
+ end