sendgrid-ruby 4.0.8 → 6.0.0

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +21 -0
  3. data/.env_sample +1 -0
  4. data/.github/PULL_REQUEST_TEMPLATE +26 -0
  5. data/.gitignore +1 -0
  6. data/.travis.yml +11 -2
  7. data/CHANGELOG.md +119 -3
  8. data/CODE_OF_CONDUCT.md +41 -0
  9. data/CONTRIBUTING.md +34 -30
  10. data/Gemfile +4 -1
  11. data/LICENSE.txt +1 -1
  12. data/README.md +53 -24
  13. data/Rakefile +7 -2
  14. data/TROUBLESHOOTING.md +41 -15
  15. data/UPGRADE.md +5 -0
  16. data/USAGE.md +1130 -1129
  17. data/USE_CASES.md +280 -16
  18. data/config.ru +4 -0
  19. data/docker/Dockerfile +12 -0
  20. data/docker/README.md +30 -0
  21. data/examples/helpers/mail/example.rb +62 -45
  22. data/examples/helpers/settings/example.rb +23 -0
  23. data/examples/helpers/stats/example.rb +42 -0
  24. data/examples/ips/ips.rb +13 -0
  25. data/examples/mail/mail.rb +2 -2
  26. data/examples/scopes/scopes.rb +49 -3
  27. data/examples/{whitelabel/whitelabel.rb → senderauthentication/senderauthentication.rb} +27 -27
  28. data/examples/suppression/suppression.rb +10 -10
  29. data/gemfiles/Sinatra_1.gemfile +6 -0
  30. data/gemfiles/Sinatra_2.gemfile +6 -0
  31. data/lib/sendgrid-ruby.rb +27 -1
  32. data/lib/sendgrid/client.rb +12 -9
  33. data/lib/sendgrid/helpers/inbound/README.md +98 -0
  34. data/lib/sendgrid/helpers/inbound/app.rb +32 -0
  35. data/lib/sendgrid/helpers/inbound/config.yml +26 -0
  36. data/lib/sendgrid/helpers/inbound/public/index.html +10 -0
  37. data/lib/sendgrid/helpers/inbound/sample_data/default_data.txt +58 -0
  38. data/lib/sendgrid/helpers/inbound/sample_data/raw_data.txt +57 -0
  39. data/lib/sendgrid/helpers/inbound/sample_data/raw_data_with_attachments.txt +298 -0
  40. data/lib/sendgrid/helpers/inbound/send.rb +26 -0
  41. data/lib/sendgrid/helpers/ip_management/ip_management.rb +17 -0
  42. data/lib/sendgrid/helpers/mail/README.md +1 -1
  43. data/lib/sendgrid/helpers/mail/asm.rb +33 -0
  44. data/lib/sendgrid/helpers/mail/attachment.rb +86 -0
  45. data/lib/sendgrid/helpers/mail/bcc_settings.rb +33 -0
  46. data/lib/sendgrid/helpers/mail/bypass_list_management.rb +43 -0
  47. data/lib/sendgrid/helpers/mail/category.rb +20 -0
  48. data/lib/sendgrid/helpers/mail/click_tracking.rb +33 -0
  49. data/lib/sendgrid/helpers/mail/content.rb +20 -0
  50. data/lib/sendgrid/helpers/mail/custom_arg.rb +24 -0
  51. data/lib/sendgrid/helpers/mail/email.rb +29 -0
  52. data/lib/sendgrid/helpers/mail/footer.rb +43 -0
  53. data/lib/sendgrid/helpers/mail/ganalytics.rb +74 -0
  54. data/lib/sendgrid/helpers/mail/header.rb +24 -0
  55. data/lib/sendgrid/helpers/mail/mail.rb +36 -895
  56. data/lib/sendgrid/helpers/mail/mail_settings.rb +63 -0
  57. data/lib/sendgrid/helpers/mail/open_tracking.rb +33 -0
  58. data/lib/sendgrid/helpers/mail/personalization.rb +82 -0
  59. data/lib/sendgrid/helpers/mail/section.rb +24 -0
  60. data/lib/sendgrid/helpers/mail/spam_check.rb +43 -0
  61. data/lib/sendgrid/helpers/mail/subscription_tracking.rb +53 -0
  62. data/lib/sendgrid/helpers/mail/substitution.rb +24 -0
  63. data/lib/sendgrid/helpers/mail/tracking_settings.rb +53 -0
  64. data/lib/sendgrid/helpers/permissions/scope.rb +28 -0
  65. data/lib/sendgrid/helpers/permissions/scopes.yml +309 -0
  66. data/lib/sendgrid/helpers/settings/README.md +14 -0
  67. data/lib/sendgrid/helpers/settings/mail_settings_dto.rb +13 -0
  68. data/lib/sendgrid/helpers/settings/partner_settings_dto.rb +13 -0
  69. data/lib/sendgrid/helpers/settings/settings.rb +28 -0
  70. data/lib/sendgrid/helpers/settings/tracking_settings_dto.rb +24 -0
  71. data/lib/sendgrid/helpers/settings/user_settings_dto.rb +13 -0
  72. data/lib/sendgrid/helpers/stats/email_stats.rb +46 -0
  73. data/lib/sendgrid/helpers/stats/metrics.rb +35 -0
  74. data/lib/sendgrid/helpers/stats/stats_response.rb +31 -0
  75. data/lib/sendgrid/version.rb +2 -2
  76. data/mail_helper_v3.md +390 -0
  77. data/sendgrid-ruby.gemspec +12 -5
  78. data/spec/sendgrid/helpers/ip_management/ip_management_spec.rb +12 -0
  79. data/spec/sendgrid/helpers/settings/mail_settings_dto_spec.rb +32 -0
  80. data/spec/sendgrid/helpers/settings/partner_settings_dto_spec.rb +24 -0
  81. data/spec/sendgrid/helpers/settings/settings_spec.rb +25 -0
  82. data/spec/sendgrid/helpers/settings/tracking_settings_dto_spec.rb +27 -0
  83. data/spec/sendgrid/helpers/settings/user_settings_dto_spec.rb +24 -0
  84. data/spec/sendgrid/helpers/stats/email_stats_spec.rb +112 -0
  85. data/spec/sendgrid/helpers/stats/metrics_spec.rb +46 -0
  86. data/spec/sendgrid/helpers/stats/stats_response_spec.rb +76 -0
  87. data/spec/spec_helper.rb +10 -0
  88. data/test/sendgrid/helpers/mail/test_attachment.rb +35 -0
  89. data/test/sendgrid/helpers/mail/test_category.rb +27 -0
  90. data/test/sendgrid/helpers/mail/test_email.rb +34 -0
  91. data/test/sendgrid/helpers/mail/test_mail.rb +198 -59
  92. data/test/sendgrid/helpers/mail/test_personalizations.rb +161 -0
  93. data/test/sendgrid/permissions/test_scopes.rb +38 -0
  94. data/test/sendgrid/test_sendgrid-ruby.rb +90 -9
  95. metadata +170 -10
@@ -0,0 +1,26 @@
1
+ # A module for sending test Twilio SendGrid Inbound Parse messages
2
+ # Usage: ruby ./send.rb [path to file containing test data]
3
+ require 'ruby_http_client'
4
+ require 'yaml'
5
+ require 'optparse'
6
+
7
+ OPTS = {}
8
+ opt = OptionParser.new
9
+ opt.on('--host=HOST') {|v| OPTS[:host] = v}
10
+ argv = opt.parse!(ARGV)
11
+ config = YAML.load_file(File.dirname(__FILE__) + '/config.yml')
12
+ host = OPTS[:host] || config['host']
13
+ client = SendGrid::Client.new(host: host)
14
+ File.open(argv[0]) do |file|
15
+ data = file.read
16
+ headers = {
17
+ 'User-Agent' => 'Twilio-SendGrid-Test',
18
+ 'Content-Type' => 'multipart/form-data; boundary=xYzZY'
19
+ }
20
+ response = client.post(
21
+ request_body: data, request_headers: headers
22
+ )
23
+ puts response.status_code
24
+ puts response.body
25
+ puts response.headers
26
+ end
@@ -0,0 +1,17 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class IpManagement
5
+ attr_accessor :sendgrid_client
6
+
7
+ def initialize(sendgrid_client:)
8
+ @sendgrid_client = sendgrid_client
9
+ end
10
+
11
+ def unassigned
12
+ response = @sendgrid_client.ips.get
13
+ ips = JSON.parse(response.body)
14
+ ips.select {|ip| ip.subusers.empty?}
15
+ end
16
+ end
17
+ end
@@ -1,4 +1,4 @@
1
- **This helper allows you to quickly and easily build a Mail object for sending email through SendGrid.**
1
+ **This helper allows you to quickly and easily build a Mail object for sending email through Twilio SendGrid.**
2
2
 
3
3
  # Quick Start
4
4
 
@@ -0,0 +1,33 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class ASM
5
+ def initialize(group_id: nil, groups_to_display: nil)
6
+ @group_id = group_id
7
+ @groups_to_display = groups_to_display
8
+ end
9
+
10
+ def group_id=(group_id)
11
+ @group_id = group_id
12
+ end
13
+
14
+ def group_id
15
+ @group_id
16
+ end
17
+
18
+ def groups_to_display=(groups_to_display)
19
+ @groups_to_display = groups_to_display
20
+ end
21
+
22
+ def groups_to_display
23
+ @groups_to_display
24
+ end
25
+
26
+ def to_json(*)
27
+ {
28
+ 'group_id' => self.group_id,
29
+ 'groups_to_display' => self.groups_to_display
30
+ }.delete_if { |_, value| value.to_s.strip == '' }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,86 @@
1
+ require 'json'
2
+ require 'base64'
3
+
4
+ module SendGrid
5
+ class Attachment
6
+ def initialize
7
+ @content = nil
8
+ @type = nil
9
+ @filename = nil
10
+ @disposition = nil
11
+ @content_id = nil
12
+ end
13
+
14
+ def content=(content)
15
+ @encoded_content = nil
16
+ @content = content
17
+ end
18
+
19
+ def content
20
+ return @encoded_content if @encoded_content
21
+
22
+ if @content.respond_to?(:read)
23
+ @encoded_content = encode @content
24
+ else
25
+ @encoded_content = @content
26
+ end
27
+ end
28
+
29
+ def type=(type)
30
+ @type = type
31
+ end
32
+
33
+ def type
34
+ @type
35
+ end
36
+
37
+ def filename=(filename)
38
+ @filename = filename
39
+ end
40
+
41
+ def filename
42
+ @filename
43
+ end
44
+
45
+ def disposition=(disposition)
46
+ @disposition = disposition
47
+ end
48
+
49
+ def disposition
50
+ @disposition
51
+ end
52
+
53
+ def content_id=(content_id)
54
+ @content_id = content_id
55
+ end
56
+
57
+ def content_id
58
+ @content_id
59
+ end
60
+
61
+ def to_json(*)
62
+ {
63
+ 'content' => self.content,
64
+ 'type' => self.type,
65
+ 'filename' => self.filename,
66
+ 'disposition' => self.disposition,
67
+ 'content_id' => self.content_id
68
+ }.delete_if { |_, value| value.to_s.strip == '' }
69
+ end
70
+
71
+ private
72
+
73
+ def encode(io)
74
+ str = io.read
75
+ # Since the API expects UTF-8, we need to ensure that we're
76
+ # converting other formats to it so (byte-wise) Base64 encoding
77
+ # will come through properly on the other side.
78
+ #
79
+ # Not much to be done to try to handle encoding for files opened
80
+ # in binary mode, but at least we can faithfully convey the
81
+ # bytes.
82
+ str = str.encode('UTF-8') unless io.respond_to?(:binmode?) && io.binmode?
83
+ Base64.encode64 str
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,33 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class BccSettings
5
+ def initialize(enable: nil, email: nil)
6
+ @enable = enable
7
+ @email = email
8
+ end
9
+
10
+ def enable=(enable)
11
+ @enable = enable
12
+ end
13
+
14
+ def enable
15
+ @enable
16
+ end
17
+
18
+ def email=(email)
19
+ @email = email
20
+ end
21
+
22
+ def email
23
+ @email
24
+ end
25
+
26
+ def to_json(*)
27
+ {
28
+ 'enable' => self.enable,
29
+ 'email' => self.email
30
+ }.delete_if { |_, value| value.to_s.strip == '' }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class BypassListManagement
5
+ def initialize(enable: nil)
6
+ @enable = enable
7
+ end
8
+
9
+ def enable=(enable)
10
+ @enable = enable
11
+ end
12
+
13
+ def enable
14
+ @enable
15
+ end
16
+
17
+ def to_json(*)
18
+ {
19
+ 'enable' => self.enable
20
+ }.delete_if { |_, value| value.to_s.strip == '' }
21
+ end
22
+ end
23
+
24
+ class SandBoxMode
25
+ def initialize(enable: nil)
26
+ @enable = enable
27
+ end
28
+
29
+ def enable=(enable)
30
+ @enable = enable
31
+ end
32
+
33
+ def enable
34
+ @enable
35
+ end
36
+
37
+ def to_json(*)
38
+ {
39
+ 'enable' => self.enable
40
+ }.delete_if { |_, value| value.to_s.strip == '' }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,20 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class Category
5
+ attr_accessor :name
6
+
7
+ def initialize(name: nil)
8
+ @name = name
9
+ end
10
+
11
+ def to_json(*)
12
+ {
13
+ 'category' => name
14
+ }.delete_if { |_, value| value.to_s.strip == '' }
15
+ end
16
+
17
+ alias :category :name
18
+ alias :category= :name=
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class ClickTracking
5
+ def initialize(enable: nil, enable_text: nil)
6
+ @enable = enable
7
+ @enable_text = enable_text
8
+ end
9
+
10
+ def enable=(enable)
11
+ @enable = enable
12
+ end
13
+
14
+ def enable
15
+ @enable
16
+ end
17
+
18
+ def enable_text=(enable_text)
19
+ @enable_text = enable_text
20
+ end
21
+
22
+ def enable_text
23
+ @enable_text
24
+ end
25
+
26
+ def to_json(*)
27
+ {
28
+ 'enable' => self.enable,
29
+ 'enable_text' => self.enable_text
30
+ }.delete_if { |_, value| value.to_s.strip == '' }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,20 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class Content
5
+
6
+ attr_accessor :type, :value
7
+
8
+ def initialize(type: nil, value: nil)
9
+ @type = type
10
+ @value = value
11
+ end
12
+
13
+ def to_json(*)
14
+ {
15
+ 'type' => self.type,
16
+ 'value' => self.value
17
+ }.delete_if { |_, value| value.to_s.strip == '' }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class CustomArg
5
+ def initialize(key: nil, value: nil)
6
+ @custom_arg = {}
7
+ (key.nil? || value.nil?) ? @custom_arg = nil : @custom_arg[key.to_s] = value.to_s
8
+ end
9
+
10
+ def custom_arg=(custom_arg)
11
+ @custom_arg = custom_arg
12
+ end
13
+
14
+ def custom_arg
15
+ @custom_arg
16
+ end
17
+
18
+ def to_json(*)
19
+ {
20
+ 'custom_arg' => self.custom_arg
21
+ }.delete_if { |_, value| value.to_s.strip == '' }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class Email
5
+
6
+ attr_accessor :email, :name
7
+
8
+ def initialize(email: nil, name: nil)
9
+ if name
10
+ @email = email
11
+ @name = name
12
+ else
13
+ @email, @name = split_email(email)
14
+ end
15
+ end
16
+
17
+ def split_email(email)
18
+ split = /(?:(?<address>.+)\s)?<?(?<email>.+@[^>]+)>?/.match(email)
19
+ return split[:email], split[:address]
20
+ end
21
+
22
+ def to_json(*)
23
+ {
24
+ 'email' => self.email,
25
+ 'name' => self.name
26
+ }.delete_if { |_, value| value.to_s.strip == '' }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,43 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class Footer
5
+ def initialize(enable: nil, text: nil, html: nil)
6
+ @enable = enable
7
+ @text = text
8
+ @html = html
9
+ end
10
+
11
+ def enable=(enable)
12
+ @enable = enable
13
+ end
14
+
15
+ def enable
16
+ @enable
17
+ end
18
+
19
+ def text=(text)
20
+ @text = text
21
+ end
22
+
23
+ def text
24
+ @text
25
+ end
26
+
27
+ def html=(html)
28
+ @html = html
29
+ end
30
+
31
+ def html
32
+ @html
33
+ end
34
+
35
+ def to_json(*)
36
+ {
37
+ 'enable' => self.enable,
38
+ 'text' => self.text,
39
+ 'html' => self.html
40
+ }.delete_if { |_, value| value.to_s.strip == '' }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,74 @@
1
+ require 'json'
2
+
3
+ module SendGrid
4
+ class Ganalytics
5
+ def initialize(enable: nil, utm_source: nil, utm_medium: nil, utm_term: nil, utm_content: nil, utm_campaign: nil, utm_name: nil)
6
+ @enable = enable
7
+ @utm_source = utm_source
8
+ @utm_medium = utm_medium
9
+ @utm_term = utm_term
10
+ @utm_content = utm_content
11
+ @utm_campaign = utm_campaign
12
+ @utm_name = utm_name
13
+ end
14
+
15
+ def enable=(enable)
16
+ @enable = enable
17
+ end
18
+
19
+ def enable
20
+ @enable
21
+ end
22
+
23
+ def utm_source=(utm_source)
24
+ @utm_source = utm_source
25
+ end
26
+
27
+ def utm_source
28
+ @utm_source
29
+ end
30
+
31
+ def utm_medium=(utm_medium)
32
+ @utm_medium = utm_medium
33
+ end
34
+
35
+ def utm_medium
36
+ @utm_medium
37
+ end
38
+
39
+ def utm_term=(utm_term)
40
+ @utm_term = utm_term
41
+ end
42
+
43
+ def utm_term
44
+ @utm_term
45
+ end
46
+
47
+ def utm_content=(utm_content)
48
+ @utm_content = utm_content
49
+ end
50
+
51
+ def utm_content
52
+ @utm_content
53
+ end
54
+
55
+ def utm_campaign=(utm_campaign)
56
+ @utm_campaign = utm_campaign
57
+ end
58
+
59
+ def utm_campaign
60
+ @utm_campaign
61
+ end
62
+
63
+ def to_json(*)
64
+ {
65
+ 'enable' => self.enable,
66
+ 'utm_source' => self.utm_source,
67
+ 'utm_medium' => self.utm_medium,
68
+ 'utm_term' => self.utm_term,
69
+ 'utm_content' => self.utm_content,
70
+ 'utm_campaign' => self.utm_campaign
71
+ }.delete_if { |_, value| value.to_s.strip == '' }
72
+ end
73
+ end
74
+ end