pew_pew 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/.yardopts +1 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +84 -0
- data/Rakefile +3 -0
- data/lib/pew_pew.rb +32 -0
- data/lib/pew_pew/client.rb +90 -0
- data/lib/pew_pew/config.rb +15 -0
- data/lib/pew_pew/domain.rb +9 -0
- data/lib/pew_pew/resource.rb +52 -0
- data/lib/pew_pew/resources/bounces.rb +41 -0
- data/lib/pew_pew/resources/campaigns.rb +141 -0
- data/lib/pew_pew/resources/complaints.rb +40 -0
- data/lib/pew_pew/resources/lists.rb +121 -0
- data/lib/pew_pew/resources/logs.rb +12 -0
- data/lib/pew_pew/resources/mailboxes.rb +41 -0
- data/lib/pew_pew/resources/messages.rb +37 -0
- data/lib/pew_pew/resources/routes.rb +57 -0
- data/lib/pew_pew/resources/stats.rb +12 -0
- data/lib/pew_pew/resources/unsubscribes.rb +43 -0
- data/lib/pew_pew/response.rb +11 -0
- data/lib/pew_pew/version.rb +3 -0
- data/pew_pew.gemspec +20 -0
- data/spec/fixtures/bounces.yml +144 -0
- data/spec/fixtures/campaigns.yml +368 -0
- data/spec/fixtures/complaints.yml +142 -0
- data/spec/fixtures/image.png +0 -0
- data/spec/fixtures/lists.yml +403 -0
- data/spec/fixtures/logs.yml +133 -0
- data/spec/fixtures/mailboxes.yml +141 -0
- data/spec/fixtures/messages.yml +196 -0
- data/spec/fixtures/mime.eml +34 -0
- data/spec/fixtures/routes.yml +225 -0
- data/spec/fixtures/stats.yml +61 -0
- data/spec/fixtures/unsubscribes.yml +219 -0
- data/spec/pew_pew/client_spec.rb +51 -0
- data/spec/pew_pew/config_spec.rb +38 -0
- data/spec/pew_pew/resource_spec.rb +46 -0
- data/spec/pew_pew/resources/bounces_spec.rb +78 -0
- data/spec/pew_pew/resources/campaigns_spec.rb +228 -0
- data/spec/pew_pew/resources/complaints_spec.rb +69 -0
- data/spec/pew_pew/resources/lists_spec.rb +283 -0
- data/spec/pew_pew/resources/logs_spec.rb +28 -0
- data/spec/pew_pew/resources/mailboxes_spec.rb +59 -0
- data/spec/pew_pew/resources/messages_spec.rb +53 -0
- data/spec/pew_pew/resources/routes_spec.rb +135 -0
- data/spec/pew_pew/resources/stats_spec.rb +26 -0
- data/spec/pew_pew/resources/unsubscribes_spec.rb +99 -0
- data/spec/pew_pew/response_spec.rb +21 -0
- data/spec/pew_pew_spec.rb +13 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/support/contexts/api_requests.rb +23 -0
- data/spec/support/contexts/domain_resource.rb +17 -0
- data/spec/support/vcr.rb +6 -0
- metadata +211 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--markup markdown
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Tyler Hunt
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
# Pew Pew
|
2
|
+
|
3
|
+
A Ruby client library for using the [Mailgun] web service.
|
4
|
+
|
5
|
+
[mailgun]: https://mailgun.net/
|
6
|
+
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add this line to your application's `Gemfile`:
|
11
|
+
|
12
|
+
``` ruby
|
13
|
+
gem 'pew_pew'
|
14
|
+
```
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
Or install it yourself as:
|
21
|
+
|
22
|
+
$ gem install pew_pew
|
23
|
+
|
24
|
+
|
25
|
+
## Configuration
|
26
|
+
|
27
|
+
You must have a valid API key to use the Mailgun API. If you don't yet have
|
28
|
+
one, you can [sign up here][api-key].
|
29
|
+
|
30
|
+
[api-key]: http://www.mailgun.net/signup
|
31
|
+
|
32
|
+
You can use the following method to configure your API key and domain:
|
33
|
+
|
34
|
+
``` ruby
|
35
|
+
PewPew.configure do |config|
|
36
|
+
config.api_key = ENV['MAILGUN_API_KEY']
|
37
|
+
config.domain = ENV['MAILGUN_DOMAIN'] # optional
|
38
|
+
end
|
39
|
+
```
|
40
|
+
|
41
|
+
If you'd like to use multiple instances of the API with different keys, you can
|
42
|
+
instantiate `PewPew::Client` directly and treat those instances the same as you
|
43
|
+
would the `PewPew` module:
|
44
|
+
|
45
|
+
``` ruby
|
46
|
+
pew_pew = PewPew::Client.new
|
47
|
+
|
48
|
+
pew_pew.configure do |config|
|
49
|
+
config.api_key = ENV['MAILGUN_API_KEY']
|
50
|
+
config.domain = ENV['MAILGUN_DOMAIN'] # optional
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
|
55
|
+
## Usage
|
56
|
+
|
57
|
+
Once the API key has been configured, resources can be called on the `PewPew`
|
58
|
+
module directly or off your client instances:
|
59
|
+
|
60
|
+
``` ruby
|
61
|
+
PewPew.messages.send_email(
|
62
|
+
to: 'to@example.com',
|
63
|
+
from: 'from@example.com',
|
64
|
+
subject: 'Test',
|
65
|
+
text: 'This is a test message.'
|
66
|
+
)
|
67
|
+
```
|
68
|
+
|
69
|
+
For resources that require a domain, you may pass it as an option when calling
|
70
|
+
the resource. If a domain has been configured, it will be used as the default.
|
71
|
+
|
72
|
+
``` ruby
|
73
|
+
PewPew.stats.all # uses the configured domain
|
74
|
+
PewPew.stats(domain: 'example.com').all # uses example.com
|
75
|
+
```
|
76
|
+
|
77
|
+
|
78
|
+
## Contributing
|
79
|
+
|
80
|
+
1. Fork it
|
81
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
82
|
+
3. Commit your changes (`git commit -am 'Add some feature.'`)
|
83
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
84
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/lib/pew_pew.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'pew_pew/version'
|
2
|
+
require 'relax'
|
3
|
+
|
4
|
+
module PewPew
|
5
|
+
extend Relax::Delegator[:client]
|
6
|
+
|
7
|
+
autoload :Client, 'pew_pew/client'
|
8
|
+
autoload :Config, 'pew_pew/config'
|
9
|
+
autoload :Domain, 'pew_pew/domain'
|
10
|
+
autoload :Resource, 'pew_pew/resource'
|
11
|
+
autoload :Response, 'pew_pew/response'
|
12
|
+
|
13
|
+
module Resources
|
14
|
+
autoload :Bounces, 'pew_pew/resources/bounces'
|
15
|
+
autoload :Campaigns, 'pew_pew/resources/campaigns'
|
16
|
+
autoload :Complaints, 'pew_pew/resources/complaints'
|
17
|
+
autoload :Lists, 'pew_pew/resources/lists'
|
18
|
+
autoload :Logs, 'pew_pew/resources/logs'
|
19
|
+
autoload :Mailboxes, 'pew_pew/resources/mailboxes'
|
20
|
+
autoload :Messages, 'pew_pew/resources/messages'
|
21
|
+
autoload :Routes, 'pew_pew/resources/routes'
|
22
|
+
autoload :Stats, 'pew_pew/resources/stats'
|
23
|
+
autoload :Unsubscribes, 'pew_pew/resources/unsubscribes'
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return a memoized instance of the client
|
27
|
+
# @!visibility private
|
28
|
+
def self.client
|
29
|
+
@client ||= Client.new
|
30
|
+
end
|
31
|
+
private_class_method :client
|
32
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module PewPew
|
2
|
+
class Client
|
3
|
+
include Relax::Client
|
4
|
+
|
5
|
+
# Returns a new client instance and configures its default values.
|
6
|
+
def initialize
|
7
|
+
config.base_uri = Config::BASE_URI
|
8
|
+
config.user_agent = Config::USER_AGENT
|
9
|
+
config.extend(Config)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Builds a new instance of the bounces resource for the given domain.
|
13
|
+
#
|
14
|
+
# @option options [String] :domain the domain name
|
15
|
+
# @return <Resources::Bounces> an instance of the bounces resource
|
16
|
+
def bounces(options={})
|
17
|
+
Resources::Bounces.new(self, options)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Builds a new instance of the campaigns resource for the given domain.
|
21
|
+
#
|
22
|
+
# @option options [String] :domain the domain name
|
23
|
+
# @return <Resources::Campaigns> an instance of the complaints resource
|
24
|
+
def campaigns(options={})
|
25
|
+
Resources::Campaigns.new(self, options)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Builds a new instance of the complaints resource for the given domain.
|
29
|
+
#
|
30
|
+
# @option options [String] :domain the domain name
|
31
|
+
# @return <Resources::Complaints> an instance of the complaints resource
|
32
|
+
def complaints(options={})
|
33
|
+
Resources::Complaints.new(self, options)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Builds a new instance of the lists resource.
|
37
|
+
#
|
38
|
+
# @return <Resources::Lists> an instance of the lists resource
|
39
|
+
def lists
|
40
|
+
Resources::Lists.new(self)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Builds a new instance of the logs resource for the given domain.
|
44
|
+
#
|
45
|
+
# @option options [String] :domain the domain name
|
46
|
+
# @return <Resources::Logs> an instance of the logs resource
|
47
|
+
def logs(options={})
|
48
|
+
Resources::Logs.new(self, options)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Builds a new instance of the mailboxes resource for the given domain.
|
52
|
+
#
|
53
|
+
# @option options [String] :domain the domain name
|
54
|
+
# @return <Resources::Mailboxes> an instance of the mailboxes resource
|
55
|
+
def mailboxes(options={})
|
56
|
+
Resources::Mailboxes.new(self, options)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Builds a new instance of the messages resource for the given domain.
|
60
|
+
#
|
61
|
+
# @option options [String] :domain the domain name
|
62
|
+
# @return <Resources::Messages> an instance of the messages resource
|
63
|
+
def messages(options={})
|
64
|
+
Resources::Messages.new(self, options)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Builds a new instance of the routes resource.
|
68
|
+
#
|
69
|
+
# @return <Resources::Routes> an instance of the routes resource
|
70
|
+
def routes
|
71
|
+
Resources::Routes.new(self)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Builds a new instance of the stats resource for the given domain.
|
75
|
+
#
|
76
|
+
# @option options [String] :domain the domain name
|
77
|
+
# @return <Resources::Stats> an instance of the stats resource
|
78
|
+
def stats(options={})
|
79
|
+
Resources::Stats.new(self, options)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Builds a new instance of the unsubscribes resource for the given domain.
|
83
|
+
#
|
84
|
+
# @option options [String] :domain the domain name
|
85
|
+
# @return <Resources::Unsubscribes> an instance of the unsubscribes resource
|
86
|
+
def unsubscribes(options={})
|
87
|
+
Resources::Unsubscribes.new(self, options)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module PewPew
|
2
|
+
module Config
|
3
|
+
BASE_URI = 'https://api.mailgun.net/v2'
|
4
|
+
USER_AGENT = "PewPew Ruby Gem #{PewPew::VERSION}"
|
5
|
+
USERNAME = 'api'
|
6
|
+
|
7
|
+
# The Mailgun API key used to authenticate requests.
|
8
|
+
# @return [String]
|
9
|
+
attr :api_key, true
|
10
|
+
|
11
|
+
# The default domain to use for resources that require a domain.
|
12
|
+
# @return [String]
|
13
|
+
attr :domain, true
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'faraday_middleware'
|
2
|
+
|
3
|
+
module PewPew
|
4
|
+
module Resource
|
5
|
+
include Relax::Resource
|
6
|
+
|
7
|
+
class ResponseDecorator < Faraday::Response::Middleware
|
8
|
+
def on_complete(env)
|
9
|
+
if env[:body].is_a?(Array)
|
10
|
+
items = env[:body]
|
11
|
+
env[:body] = Response.new(items: items, total_count: items.length)
|
12
|
+
end
|
13
|
+
|
14
|
+
env[:body].status = env[:status]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def get(*)
|
19
|
+
super.body
|
20
|
+
end
|
21
|
+
private :get
|
22
|
+
|
23
|
+
def post(*)
|
24
|
+
super.body
|
25
|
+
end
|
26
|
+
private :post
|
27
|
+
|
28
|
+
def put(*)
|
29
|
+
super.body
|
30
|
+
end
|
31
|
+
private :put
|
32
|
+
|
33
|
+
def delete(*)
|
34
|
+
super.body
|
35
|
+
end
|
36
|
+
private :delete
|
37
|
+
|
38
|
+
def connection
|
39
|
+
super do |builder|
|
40
|
+
builder.basic_auth(Config::USERNAME, config.api_key)
|
41
|
+
|
42
|
+
builder.use(ResponseDecorator)
|
43
|
+
builder.response(:mashify, mash_class: Response)
|
44
|
+
builder.response(:json)
|
45
|
+
|
46
|
+
builder.request(:multipart)
|
47
|
+
builder.request(:url_encoded)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
private :connection
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module PewPew
|
2
|
+
module Resources
|
3
|
+
class Bounces
|
4
|
+
include Resource
|
5
|
+
include Domain
|
6
|
+
|
7
|
+
# Fetches all bounces.
|
8
|
+
#
|
9
|
+
# @return [Mash] the response body
|
10
|
+
def all
|
11
|
+
get("#{domain}/bounces")
|
12
|
+
end
|
13
|
+
|
14
|
+
# Fetch all bounces by address.
|
15
|
+
#
|
16
|
+
# @param address [String] the address to fetch bounces for
|
17
|
+
# @return [Mash] the response body
|
18
|
+
def find(address)
|
19
|
+
get("#{domain}/bounces/#{address}")
|
20
|
+
end
|
21
|
+
|
22
|
+
# Creates a new bounce.
|
23
|
+
#
|
24
|
+
# @option params [String] :address the email address to add
|
25
|
+
# @option params [String] :code error code (defaults to 550)
|
26
|
+
# @option params [String] :error error description (defaults to blank)
|
27
|
+
# @return [Mash] the response body
|
28
|
+
def create(params)
|
29
|
+
post("#{domain}/bounces", params)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Removes existing bounces.
|
33
|
+
#
|
34
|
+
# @param address_or_id [String] the address to remove all the bounces for
|
35
|
+
# @return [Mash] the response body
|
36
|
+
def remove(address_or_id)
|
37
|
+
delete("#{domain}/bounces/#{address_or_id}")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
module PewPew
|
2
|
+
module Resources
|
3
|
+
class Campaigns
|
4
|
+
include Resource
|
5
|
+
include Domain
|
6
|
+
|
7
|
+
# Fetches all campaigns for the domain.
|
8
|
+
#
|
9
|
+
# @return [Mash] the response body
|
10
|
+
def all
|
11
|
+
get("#{domain}/campaigns")
|
12
|
+
end
|
13
|
+
|
14
|
+
# Fetch a campaign by ID.
|
15
|
+
#
|
16
|
+
# @param id [String] the ID of the campaign to be fetched
|
17
|
+
# @return [Mash] the response body
|
18
|
+
def find(id)
|
19
|
+
get("#{domain}/campaigns/#{id}")
|
20
|
+
end
|
21
|
+
|
22
|
+
# Creates a new campaign.
|
23
|
+
#
|
24
|
+
# @option params [String] :name the name of the campaign
|
25
|
+
# @option params [String] :id optional campaign identifier (defaults to
|
26
|
+
# an generated ID)
|
27
|
+
# @return [Mash] the response body
|
28
|
+
def create(params)
|
29
|
+
post("#{domain}/campaigns", params)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Removes an existing campaign and all associated data.
|
33
|
+
#
|
34
|
+
# @param id [String] the ID of the campaign to be deleted
|
35
|
+
# @return [Mash] the response body
|
36
|
+
def remove(id)
|
37
|
+
delete("#{domain}/campaigns/#{id}")
|
38
|
+
end
|
39
|
+
|
40
|
+
# Fetch the events for a campaign, including clicks, opens, unsubscribes,
|
41
|
+
# bounces and complaints.
|
42
|
+
#
|
43
|
+
# @param id [String] a campaign ID
|
44
|
+
# @option params [String, Array<String>] :event optional event filter
|
45
|
+
# (clicked, opened, unsubscribed, bounced, or complained)
|
46
|
+
# @option params [String] :address optional recipient email address
|
47
|
+
# @option params [String] :country optional two-letter country code
|
48
|
+
# @option params [String] :region optional region name or code
|
49
|
+
# @option params [Fixnum] :limit number of records to return (maximum 100)
|
50
|
+
# @option params [Fixnum] :page results page number
|
51
|
+
# @option params [Boolean] :count if true, return counts instead of
|
52
|
+
# records
|
53
|
+
# @return [Mash] the response body
|
54
|
+
def events(id, params={})
|
55
|
+
get("#{domain}/campaigns/#{id}/events", params)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Fetches a summary of the results for a given campaign, like numbers of
|
59
|
+
# clicks, opens, etc. Includes unique numbers (e.g. number of unique
|
60
|
+
# recipients who clicked) as well.
|
61
|
+
#
|
62
|
+
# @param id [String] a campaign ID
|
63
|
+
# @option params [String] :group_by optional grouping (domain or
|
64
|
+
# daily_hour)
|
65
|
+
# @return [Mash] the response body
|
66
|
+
def stats(id, params={})
|
67
|
+
params[:groupby] = params.delete(:group_by) if params[:group_by]
|
68
|
+
get("#{domain}/campaigns/#{id}/stats", params)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Fetches clicks aggregated by one or more parameters.
|
72
|
+
#
|
73
|
+
# @param id [String] a campaign ID
|
74
|
+
# @option params [String] :group_by optional grouping (link, recipient,
|
75
|
+
# domain, country, region, city, month, day, hour, minute, daily_hour)
|
76
|
+
# @option params [String] :country optional two-letter country code
|
77
|
+
# @option params [String] :region optional region name or code
|
78
|
+
# @option params [String] :city optional city name
|
79
|
+
# @option params [Fixnum] :limit number of records to return (maximum 100)
|
80
|
+
# @option params [Fixnum] :page results page number
|
81
|
+
# @option params [Boolean] :count if true, return counts instead of
|
82
|
+
# records
|
83
|
+
# @return [Mash] the response body
|
84
|
+
def clicks(id, params={})
|
85
|
+
params[:groupby] = params.delete(:group_by) if params[:group_by]
|
86
|
+
get("#{domain}/campaigns/#{id}/clicks", params)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Fetches opens aggregated by one or more parameters.
|
90
|
+
#
|
91
|
+
# @param id [String] a campaign ID
|
92
|
+
# @option params [String] :group_by optional grouping (recipient, domain,
|
93
|
+
# country, region, city, month, day, hour, minute, daily_hour)
|
94
|
+
# @option params [String] :country optional two-letter country code
|
95
|
+
# @option params [String] :region optional region name or code
|
96
|
+
# @option params [String] :city optional city name
|
97
|
+
# @option params [Fixnum] :limit number of records to return (maximum 100)
|
98
|
+
# @option params [Fixnum] :page results page number
|
99
|
+
# @option params [Boolean] :count if true, return counts instead of
|
100
|
+
# records
|
101
|
+
# @return [Mash] the response body
|
102
|
+
def opens(id, params={})
|
103
|
+
params[:groupby] = params.delete(:group_by) if params[:group_by]
|
104
|
+
get("#{domain}/campaigns/#{id}/opens", params)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Fetches unsubscribes aggregated by one or more parameters.
|
108
|
+
#
|
109
|
+
# @param id [String] a campaign ID
|
110
|
+
# @option params [String] :group_by optional grouping (domain, country,
|
111
|
+
# region, city, month, day, hour, minute, daily_hour)
|
112
|
+
# @option params [String] :country optional two-letter country code
|
113
|
+
# @option params [String] :region optional region name or code
|
114
|
+
# @option params [String] :city optional city name
|
115
|
+
# @option params [Fixnum] :limit number of records to return (maximum 100)
|
116
|
+
# @option params [Fixnum] :page results page number
|
117
|
+
# @option params [Boolean] :count if true, return counts instead of
|
118
|
+
# records
|
119
|
+
# @return [Mash] the response body
|
120
|
+
def unsubscribes(id, params={})
|
121
|
+
params[:groupby] = params.delete(:group_by) if params[:group_by]
|
122
|
+
get("#{domain}/campaigns/#{id}/unsubscribes", params)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Fetches complaints aggregated by one or more parameters.
|
126
|
+
#
|
127
|
+
# @param id [String] a campaign ID
|
128
|
+
# @option params [String] :group_by optional grouping (recipient, domain,
|
129
|
+
# month, day, hour, minute, daily_hour)
|
130
|
+
# @option params [Fixnum] :limit number of records to return (maximum 100)
|
131
|
+
# @option params [Fixnum] :page results page number
|
132
|
+
# @option params [Boolean] :count if true, return counts instead of
|
133
|
+
# records
|
134
|
+
# @return [Mash] the response body
|
135
|
+
def complaints(id, params={})
|
136
|
+
params[:groupby] = params.delete(:group_by) if params[:group_by]
|
137
|
+
get("#{domain}/campaigns/#{id}/complaints", params)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|