mailgun-ruby 1.1.2 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7191c12a6dc2a08445f7cb623f10608e9208c9d2
4
- data.tar.gz: 5033b5cd5eb92f6ce5c2d678222f8c7d9d118c78
3
+ metadata.gz: e16b23def5c2076ebf90803c69e67c11275dd4cf
4
+ data.tar.gz: 538a0a0aa99f037d0ef044fc9d427483eb4073b1
5
5
  SHA512:
6
- metadata.gz: 38dd19ded277a5566d738c88368b811607762ee258eaca48f7f1afe069b6fd84672bef1e6fb9637b028c06762c840dbd84b7a722ec2e6b7bd51828f99eedd406
7
- data.tar.gz: a87aab066601ca346f897d551ff37165b862654d378c156df84b9443714c0795b9bb7299e16e0bce5666511d28900b0d0d7677ffe7ff826b2681d1d9c96ea7cc
6
+ metadata.gz: 4c76cf234af827e8280e5eaa466d961817d30c3875345f4c481871ac8ca5083f11d4257ab06531c12dd693eab09e70910e6feaa13576766cd689caa32653c1f6
7
+ data.tar.gz: 305a1d5edc83fef3006682c884d9abee4ecf190e40919008b8985e6a86e5dd4f1506c3344a7641f67a435a5a3f510f1e350fb63daccb25fbcdec5cbfc1a20617
@@ -7,6 +7,6 @@
7
7
  # Replace <THESE_VALUES> with yours from
8
8
  # https://mailgun.com/app/dashboard (don't include <brackets>)
9
9
  # and rename to/save as: .ruby-env.yml
10
- MAILGUN_APIKEY : '<MAILGUN_APIKEY'>
10
+ MAILGUN_APIKEY : '<MAILGUN_APIKEY>'
11
11
  MAILGUN_PUB_APIKEY : '<MAILGUN_PUBLIC_APIKEY>'
12
12
  MAILGUN_TESTDOMAIN : '<MAILGUN_SANDBOX_DOMAIN>'
data/.travis.yml CHANGED
@@ -1,21 +1,23 @@
1
1
  language: ruby
2
2
  sudo: false
3
3
  rvm:
4
- - 2.3.1
5
- - 2.2
6
- - 2.1
7
4
  - 2.0.0
5
+ - 2.1
6
+ - 2.2
7
+ - 2.3.1
8
8
  script:
9
+ - bundle install
9
10
  - bundle exec rake spec
10
11
  - '[[ "${TRAVIS_PULL_REQUEST}" == "false" ]] && ( bundle exec rake spec:integration
11
12
  ) || ( echo "Testing PR - No integration tests available")'
12
13
  deploy:
13
14
  provider: rubygems
14
15
  api_key:
15
- secure: QTNP+6720w38b8krtvXM25WDEOUxw9BlUwdXgWLrU0MGAOSvVFgnWTJs+7QvGWODjhrIqAfAm11zc+yEpzgD9P8np9cteWv5K7rMxsUMcb14kaGIA+MKO+RRJXlru4teBNX5jtp2GJiNS2mn7urzn5YhE9x9P7pMjcF+j5usoF0=
16
+ secure: DoX3w48gRyhDM1o1OLvtWsTi8ehLIarIsErzg/UlNRoLacQt5l5UzwD+u6wqsCEr4+c2uAHNahafpnw/j1rPG3LBPIXOK5A0SYbjovlckutiAC0330Q4PHwOZb73AFN1DG5JTeg4/fguEjdsEBdZObF7mh5gBMBQtNjo1Fos+4w=
16
17
  gemspec: mailgun.gemspec
17
18
  on:
18
19
  tags: true
20
+ condition: "$TRAVIS_RUBY_VERSION == 2.3.1"
19
21
  notifications:
20
22
  slack:
21
23
  rooms:
data/README.md CHANGED
@@ -19,7 +19,7 @@ gem install mailgun-ruby
19
19
  Gemfile:
20
20
 
21
21
  ```ruby
22
- gem 'mailgun-ruby', '~>1.1.2'
22
+ gem 'mailgun-ruby', '~>1.1.6'
23
23
  ```
24
24
 
25
25
  Usage
@@ -27,6 +27,8 @@ Usage
27
27
  Here's how to send a message using the library:
28
28
 
29
29
  ```ruby
30
+ require 'mailgun'
31
+
30
32
  # First, instantiate the Mailgun Client with your API key
31
33
  mg_client = Mailgun::Client.new 'your-api-key'
32
34
 
@@ -65,6 +67,15 @@ end
65
67
  ```
66
68
  Or have the initializer read your environment setting if you perfer.
67
69
 
70
+ To use as the ActionMailer delivery method, add this to your `config/environments/whatever.yml`
71
+ and replace `api-myapikey` and `mydomain.com` with your secret API key and domain, respectively:
72
+ ```ruby
73
+ config.action_mailer.delivery_method = :mailgun
74
+ config.action_mailer.mailgun_settings = {
75
+ api_key: 'api-myapikey',
76
+ domain: 'mydomain.com',
77
+ }
78
+ ```
68
79
 
69
80
  Response
70
81
  --------
@@ -136,15 +147,17 @@ mg_client.send_message("sending_domain.com", message_params)
136
147
  ```
137
148
 
138
149
  For usage examples on each API endpoint, head over to our official documentation
139
- pages. Or the [Snippets](Snippets.md) file.
150
+ pages. Or the [Snippets](docs/Snippets.md) file.
140
151
 
141
152
  This SDK includes the following components:
142
- - [Message Builder](Messages.md)
143
- - [Batch Message](Messages.md)
144
- - [Opt-In Handler](OptInHandler.md)
145
- - [Domains](Domains.md)
146
- - [Webhooks](Webhooks.md)
147
- - [Events](Events.md)
153
+ - [Messages](docs/Messages.md)
154
+ - [Message Builder](docs/MessageBuilder.md)
155
+ - [Batch Message](docs/MessageBuilder.md)
156
+ - [Opt-In Handler](docs/OptInHandler.md)
157
+ - [Domains](docs/Domains.md)
158
+ - [Webhooks](docs/Webhooks.md)
159
+ - [Events](docs/Events.md)
160
+ - [Suppressions](docs/Suppressions.md)
148
161
 
149
162
  Message Builder allows you to quickly create the array of parameters, required
150
163
  to send a message, by calling a methods for each parameter.
@@ -152,6 +165,31 @@ Batch Message is an extension of Message Builder, and allows you to easily send
152
165
  a batch message job within a few seconds. The complexity of
153
166
  batch messaging is eliminated!
154
167
 
168
+ Testing mail deliveries
169
+ ----------------------
170
+
171
+ ```ruby
172
+ # First, instantiate the Mailgun Client with your API key
173
+ mg_client = Mailgun::Client.new 'your-api-key'
174
+
175
+ # Put the client in test mode
176
+ mg_client.enable_test_mode!
177
+
178
+ # Define your message parameters
179
+ message_params = { from: 'bob@sending_domain.com',
180
+ to: 'sally@example.com',
181
+ subject: 'The Ruby SDK is awesome!',
182
+ text: 'It is really easy to send a message!'
183
+ }
184
+
185
+ # Send your message through the client
186
+ # Note: This will not actually hit the API, and will return a generic OK response.
187
+ mg_client.send_message('sending_domain.com', message_params)
188
+
189
+ # You can now access a copy of message_params
190
+ Mailgun::Client.deliveries.first[:from] # => 'bob@sending_domain.com'
191
+ ```
192
+
155
193
  Testing
156
194
  -------
157
195
 
@@ -30,6 +30,24 @@ domainer.create 'my.new.moreness', { some: 'options' }
30
30
  domainer.remove 'this.one.is.not.needed.'
31
31
  ```
32
32
 
33
+ Suppressions for a Domain
34
+ -------------------------
35
+
36
+ You can manage domain suppressions (bounces, unsubscribes, complaints) using the
37
+ [`Mailgun::Suppressions`](/docs/Suppressions.md) client:
38
+
39
+ ```ruby
40
+ # Instantiate the Mailgun Client with your API key
41
+ mg_client = Mailgun::Client.new('your-api-key')
42
+ supp_client = mg_client.suppressions('example.org')
43
+
44
+ # ...
45
+ ```
46
+
47
+ See the [Suppressions](/docs/Suppressions.md) for usage samples and
48
+ [suppressions.rb](/lib/mailgun/suppressions.rb) for suppressions client API.
49
+
50
+
33
51
  More Documentation
34
52
  ------------------
35
53
  See the official [Mailgun Domain Docs](https://documentation.mailgun.com/api-domains.html)
File without changes
@@ -24,28 +24,41 @@ mb_obj = Mailgun::MessageBuilder.new()
24
24
 
25
25
  # Define the from address.
26
26
  mb_obj.from("me@example.com", {"first"=>"Ruby", "last" => "SDK"});
27
+
27
28
  # Define a to recipient.
28
29
  mb_obj.add_recipient(:to, "john.doe@example.com", {"first" => "John", "last" => "Doe"});
30
+
29
31
  # Define a cc recipient.
30
32
  mb_obj.add_recipient(:cc, "sally.doe@example.com", {"first" => "Sally", "last" => "Doe"});
33
+
31
34
  # Define the subject.
32
35
  mb_obj.subject("A message from the Ruby SDK using Message Builder!");
36
+
33
37
  # Define the body of the message.
34
38
  mb_obj.body_text("This is the text body of the message!");
39
+
35
40
  # Set the Message-Id header, provide a valid Message-Id.
36
41
  mb_obj.message_id("<20141014000000.11111.11111@example.com>")
42
+
37
43
  # Or clear the Message-Id header, provide nil or empty string.
38
44
  mb_obj.message_id(nil)
39
45
  mb_obj.message_id('')
40
- # Campaign and other headers.
46
+
47
+ # Campaigns and headers.
41
48
  mb_obj.add_campaign_id("My-Awesome-Campaign");
42
- mb_obj.add_custom_parameter("h:Customer-Id", "12345");
49
+ mb_obj.header("Customer-Id", "12345");
50
+
51
+ # Custom variables
52
+ mb_obj.variable("Customer-Data", { :first_name => "John", :last_name => "Smith" })
43
53
 
44
54
  # Attach a file and rename it.
45
- mb_obj.add_attachment("/path/to/file/receipt_123491820.pdf", "Receipt.pdf");
55
+ mb_obj.add_attachment "/path/to/file/receipt_123491820.pdf", "Receipt.pdf"
56
+
57
+ # Attach an image inline.
58
+ mb_obj.add_inline_image "/path/to/file/header.png"
46
59
 
47
60
  # Schedule message in the future
48
- mb_obj.delivery_at("tomorrow 8:00AM PST");
61
+ mb_obj.deliver_at("tomorrow 8:00AM PST");
49
62
 
50
63
  # Finally, send your message using the client
51
64
  result = mg_client.send_message("sending_domain.com", mb_obj)
@@ -60,13 +73,16 @@ Here's how to use Batch Message to easily handle batch sending jobs.
60
73
  ```ruby
61
74
  # First, instantiate the Mailgun Client with your API key
62
75
  mg_client = Mailgun::Client.new("your-api-key")
76
+
63
77
  # Create a Batch Message object, pass in the client and your domain.
64
78
  mb_obj = Mailgun::BatchMessage.new(mg_client, "example.com")
65
79
 
66
80
  # Define the from address.
67
- mb_obj.from("me@example.com", {"first"=>"Ruby", "last" => "SDK"});
81
+ mb_obj.from("me@example.com", {"first" => "Ruby", "last" => "SDK"});
82
+
68
83
  # Define the subject.
69
84
  mb_obj.subject("A message from the Ruby SDK using Message Builder!");
85
+
70
86
  # Define the body of the message.
71
87
  mb_obj.body_text("This is the text body of the message!");
72
88
 
@@ -50,8 +50,8 @@ mb_obj.set_message_id('')
50
50
 
51
51
  # Other Optional Parameters.
52
52
  mb_obj.add_campaign_id("My-Awesome-Campaign")
53
- mb_obj.add_custom_parameter("h:Customer-Id", "12345")
54
- mb_obj.add_attachment("@/tron.jpg")
53
+ mb_obj.header("Customer-Id", "12345")
54
+ mb_obj.add_attachment("./tron.jpg")
55
55
  mb_obj.set_delivery_time("tomorrow 8:00AM PST")
56
56
  mb_obj.set_click_tracking(true)
57
57
 
@@ -79,7 +79,7 @@ mb_obj.set_text_body("Hello %recipient.first%,
79
79
  This is the text body of the message
80
80
  using recipient variables!
81
81
  If you need to include custom data,
82
- you could do it like this: %account-id%.")
82
+ you could do it like this: %recipient.account-id%.")
83
83
 
84
84
  mb_obj.add_recipient(:to, "john.doe@example.com", {"first" => "John",
85
85
  "last" => "Doe",
File without changes
@@ -41,8 +41,7 @@ mg_client.send_message "sending_domain.com", data
41
41
 
42
42
  ```ruby
43
43
  # Don't include a file, pull the file to a string
44
- mime_string = '
45
- From: Bob Sample <example@example.com>
44
+ mime_string = 'From: Bob Sample <example@example.com>
46
45
  MIME-Version: 1.0
47
46
  Content-Type: multipart/mixed;
48
47
  boundary="--boundary-goes-here--"
@@ -76,6 +75,26 @@ mb_obj.set_text_body "This is the text body."
76
75
  mg_client.send_message "sending_domain.com", mb_obj
77
76
  ```
78
77
 
78
+ **Build a message with attachments, part by part, with Message Builder:**
79
+
80
+ ```ruby
81
+ mb_obj = Mailgun::MessageBuilder.new
82
+
83
+ mb_obj.set_from_address "sender@example.com", {'first' => 'Sending', 'last' => 'User'}
84
+ mb_obj.add_recipient :to, "recipient@example.com", {'first' => 'Recipient', 'last' => 'User'}
85
+ mb_obj.set_subject "This is the subject!"
86
+ mb_obj.set_text_body "This is the text body."
87
+
88
+ # Add separate attachments
89
+ mb_obj.add_attachment "/path/to/file/invoice_8675309.pdf", "Order Invoice - 8675309.pdf"
90
+ mb_obj.add_attachment "/path/to/file/datasheet_00001.pdf", "Product Datasheet - 00001.pdf"
91
+
92
+ # Attach inline image to message
93
+ mb_obj.add_inline_image "/path/to/file/product_image_00001.png"
94
+
95
+ mg_client.send_message "sending_domain.com", mb_obj
96
+ ```
97
+
79
98
  **Send batches of 1000 messages per post:**
80
99
 
81
100
  ```ruby
@@ -0,0 +1,82 @@
1
+ Mailgun - Suppressions
2
+ ====================
3
+
4
+ This is the Mailgun Ruby *Suppressions* utilities.
5
+
6
+ The below assumes you've already installed the Mailgun Ruby SDK in to your
7
+ project. If not, go back to the master README for instructions. It currently supports
8
+ all calls except credentials.
9
+
10
+ ----
11
+
12
+ The Suppressions client lets you manage bounces, unsubscribes, and complaints for a
13
+ single domain.
14
+
15
+ You can view additional samples in the [suppressions_spec.rb](/spec/integration/suppressions_spec.rb)
16
+ or the Suppressions client API in [suppressions.rb](/lib/mailgun/suppressions.rb).
17
+
18
+
19
+ Usage
20
+ -----
21
+
22
+ To get an instance of the Suppressions client:
23
+
24
+ ```ruby
25
+ mg_client = Mailgun::Client.new('api_key')
26
+ supp_client = mg_client.suppressions('yourdomain.com')
27
+ ```
28
+
29
+ ----
30
+
31
+ To get a list of bounces, unsubscribes, and/or complaints:
32
+
33
+ ```ruby
34
+ supp_client.list_bounces
35
+ supp_client.list_unsubscribes
36
+ supp_client.list_complaints
37
+ ```
38
+
39
+ ----
40
+
41
+ To batch-add a set of bounces:
42
+
43
+ ```ruby
44
+ @addresses = <load or generate some addresses...>
45
+
46
+ bounces = []
47
+ @addresses.each do |addr|
48
+ bounces.push({
49
+ :address => addr,
50
+ :code => 500,
51
+ :error => 'some bounce because reasons',
52
+ })
53
+ end
54
+
55
+ response, addt_responses = @supp_client.create_bounces bounces
56
+ ```
57
+
58
+ `create_bounces`, `create_unsubscribes`, and `create_complaints` will all
59
+ return two values - first, a simple `Mailgun::Response` object. Second,
60
+ a list containing any `Mailgun::Response` objects created recursively, if over 998
61
+ bounces were provided to `create_*`.
62
+
63
+ ----
64
+
65
+ To delete bounces:
66
+
67
+ ```ruby
68
+ @addresses = <load addresses...>
69
+
70
+ @addresses.each do |addr|
71
+ @supp_client.delete_bounce addr
72
+ end
73
+ ```
74
+
75
+ Or, alternatively, to remove *all* bounces:
76
+
77
+ ```ruby
78
+ @supp_client.delete_all_bounces
79
+ ```
80
+
81
+ The `delete_*` methods are similar for `bounces`, `unsubscribe`, and `complaints` -
82
+ they all will return a `Mailgun::Response` object.
File without changes
@@ -1,4 +1,5 @@
1
1
  require 'mailgun/chains'
2
+ require 'mailgun/suppressions'
2
3
  require 'mailgun/exceptions/exceptions'
3
4
 
4
5
  module Mailgun
@@ -44,6 +45,13 @@ module Mailgun
44
45
  @test_mode
45
46
  end
46
47
 
48
+ # Provides a store of all the emails sent in test mode so you can check them.
49
+ #
50
+ # @return [Hash]
51
+ def self.deliveries
52
+ @@deliveries ||= []
53
+ end
54
+
47
55
  # Simple Message Sending
48
56
  #
49
57
  # @param [String] working_domain This is the domain you wish to send from.
@@ -52,6 +60,7 @@ module Mailgun
52
60
  # @return [Mailgun::Response] A Mailgun::Response object.
53
61
  def send_message(working_domain, data)
54
62
  if test_mode? then
63
+ Mailgun::Client.deliveries << data
55
64
  return Response.from_hash(
56
65
  {
57
66
  :body => '{"id": "test-mode-mail@localhost", "message": "Queued. Thank you."}',
@@ -62,6 +71,11 @@ module Mailgun
62
71
 
63
72
  case data
64
73
  when Hash
74
+ # Remove nil values from the data hash
75
+ # Submitting nils to the API will likely cause an error.
76
+ # See also: https://github.com/mailgun/mailgun-ruby/issues/32
77
+ data = data.select { |k, v| v != nil }
78
+
65
79
  if data.key?(:message)
66
80
  if data[:message].is_a?(String)
67
81
  data[:message] = convert_string_to_file(data[:message])
@@ -82,9 +96,10 @@ module Mailgun
82
96
  # with. Be sure to include your domain, where necessary.
83
97
  # @param [Hash] data This should be a standard Hash
84
98
  # containing required parameters for the requested resource.
99
+ # @param [Hash] headers Additional headers to pass to the resource.
85
100
  # @return [Mailgun::Response] A Mailgun::Response object.
86
- def post(resource_path, data)
87
- response = @http_client[resource_path].post(data)
101
+ def post(resource_path, data, headers = {})
102
+ response = @http_client[resource_path].post(data, headers)
88
103
  Response.new(response)
89
104
  rescue => err
90
105
  raise communication_error err
@@ -94,8 +109,9 @@ module Mailgun
94
109
  #
95
110
  # @param [String] resource_path This is the API resource you wish to interact
96
111
  # with. Be sure to include your domain, where necessary.
97
- # @param [Hash] query_string This should be a standard Hash
112
+ # @param [Hash] params This should be a standard Hash
98
113
  # containing required parameters for the requested resource.
114
+ # @param [String] accept Acceptable Content-Type of the response body.
99
115
  # @return [Mailgun::Response] A Mailgun::Response object.
100
116
  def get(resource_path, params = nil, accept = '*/*')
101
117
  if params
@@ -134,6 +150,14 @@ module Mailgun
134
150
  raise communication_error err
135
151
  end
136
152
 
153
+ # Constructs a Suppressions client for the given domain.
154
+ #
155
+ # @param [String] domain Domain which suppressions requests will be made for
156
+ # @return [Mailgun::Suppressions]
157
+ def suppressions(domain)
158
+ Suppressions.new(self, domain)
159
+ end
160
+
137
161
  private
138
162
 
139
163
  # Converts MIME string to file for easy uploading to API
@@ -11,6 +11,7 @@ module Mailgun
11
11
  #
12
12
  # See the Github documentation for full examples.
13
13
  class Events
14
+ include Enumerable
14
15
 
15
16
  # Public: event initializer
16
17
  #
@@ -23,31 +24,47 @@ module Mailgun
23
24
  @paging_previous = nil
24
25
  end
25
26
 
26
- # Public: Issues a simple get against the client.
27
+ # Public: Issues a simple get against the client. Alias of `next`.
27
28
  #
28
29
  # params - a Hash of query options and/or filters.
29
30
  #
30
31
  # Returns a Mailgun::Response object.
31
32
  def get(params = nil)
32
- get_events(params)
33
+ self.next(params)
33
34
  end
34
35
 
35
36
  # Public: Using built in paging, obtains the next set of data.
36
37
  # If an events request hasn't been sent previously, this will send one
37
38
  # without parameters
38
39
  #
40
+ # params - a Hash of query options and/or filters.
41
+ #
39
42
  # Returns a Mailgun::Response object.
40
- def next
41
- get_events(nil, @paging_next)
43
+ def next(params = nil)
44
+ get_events(params, @paging_next)
42
45
  end
43
46
 
44
47
  # Public: Using built in paging, obtains the previous set of data.
45
48
  # If an events request hasn't been sent previously, this will send one
46
49
  # without parameters
47
50
  #
51
+ # params - a Hash of query options and/or filters.
52
+ #
48
53
  # Returns Mailgun::Response object.
49
- def previous
50
- get_events(nil, @paging_previous)
54
+ def previous(params = nil)
55
+ get_events(params, @paging_previous)
56
+ end
57
+
58
+ # Public: Allows iterating through all events and performs automatic paging.
59
+ #
60
+ # &block - Block to execute on items.
61
+ def each(&block)
62
+ items = self.next.to_h['items']
63
+
64
+ until items.empty?
65
+ items.each(&block)
66
+ items = self.next.to_h['items']
67
+ end
51
68
  end
52
69
 
53
70
  private
@@ -48,7 +48,7 @@ module Mailgun
48
48
  send_message if @counters[:recipients][recipient_type] == Mailgun::Chains::MAX_RECIPIENTS
49
49
 
50
50
  compiled_address = parse_address(address, variables)
51
- complex_setter(recipient_type, compiled_address)
51
+ set_multi_complex(recipient_type, compiled_address)
52
52
 
53
53
  store_recipient_variables(recipient_type, address, variables) if recipient_type != :from
54
54
 
@@ -84,7 +84,7 @@ module Mailgun
84
84
  # @return [Boolean]
85
85
  def send_message
86
86
  rkey = 'recipient-variables'
87
- simple_setter rkey, JSON.generate(@recipient_variables)
87
+ set_multi_simple rkey, JSON.generate(@recipient_variables)
88
88
  @message[rkey] = @message[rkey].first if @message.key?(rkey)
89
89
 
90
90
  response = @client.send_message(@domain, @message).to_h!