Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ tmp
startup.rb
Guardfile
.DS_Store
lib/startup.rb
lib/startup.rb
.rvmrc
3 changes: 3 additions & 0 deletions lib/mailgun.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
require "mailgun/mailgun_error"
require "mailgun/base"
require "mailgun/domain"
require "mailgun/campaign"
require "mailgun/route"
require "mailgun/mailbox"
require "mailgun/bounce"
Expand All @@ -14,10 +15,12 @@
require "mailgun/list"
require "mailgun/list/member"
require "mailgun/message"
require "mailgun/event"

#require "startup"

def Mailgun(options={})
options[:api_key] = Mailgun.api_key if Mailgun.api_key
options[:domain] = Mailgun.domain if Mailgun.domain
Mailgun::Base.new(options)
end
28 changes: 18 additions & 10 deletions lib/mailgun/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def initialize(options)
Mailgun.api_version = options.fetch(:api_version) { "v2" }
Mailgun.test_mode = options.fetch(:test_mode) { false }
Mailgun.api_key = options.fetch(:api_key) { raise ArgumentError.new(":api_key is a required argument to initialize Mailgun") if Mailgun.api_key.nil?}
Mailgun.domain = options.fetch(:domain) { nil }
@domain = options.fetch(:domain)
end

# Returns the base url used in all Mailgun API calls
Expand All @@ -22,35 +22,43 @@ def base_url
end

# Returns an instance of Mailgun::Mailbox configured for the current API user
def mailboxes(domain = Mailgun.domain)
def mailboxes(domain = @domain)
Mailgun::Mailbox.new(self, domain)
end

def messages(domain = Mailgun.domain)
def messages(domain = @domain)
@messages ||= Mailgun::Message.new(self, domain)
end


def events(domain = @domain)
@events ||= Mailgun::Event.new(self, domain)
end

def routes
@routes ||= Mailgun::Route.new(self)
end
def bounces(domain = Mailgun.domain)

def bounces(domain = @domain)
Mailgun::Bounce.new(self, domain)
end

def domains
Mailgun::Domain.new(self)
end

def unsubscribes(domain = Mailgun.domain)
def campaigns(domain = @domain)
Mailgun::Campaign.new(self, domain)
end

def unsubscribes(domain = @domain)
Mailgun::Unsubscribe.new(self, domain)
end

def complaints(domain = Mailgun.domain)
def complaints(domain = @domain)
Mailgun::Complaint.new(self, domain)
end

def log(domain=Mailgun.domain)
def log(domain=@domain)
Mailgun::Log.new(self, domain)
end

Expand Down
40 changes: 40 additions & 0 deletions lib/mailgun/campaign.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
module Mailgun

# Interface to manage campaigns
class Campaign

def initialize(mailgun, domain)
@mailgun = mailgun
@domain = domain
end

# List all campaigns on the account
def list(options={})
Mailgun.submit(:get, campaign_url, options)["items"] || []
end

# Find campaign by name
def find(campaign)
Mailgun.submit :get, campaign_url(campaign)
end

# Add campaign to account
def create(campaign, opts = {})
opts = {name: campaign}.merge(opts)
Mailgun.submit :post, campaign_url, opts
end

# Remves a campaign from account
def delete(campaign)
Mailgun.submit :delete, campaign_url(campaign)
end

private

# Helper method to generate the proper url for Mailgun campaign API calls
def campaign_url(campaign = nil)
"#{@mailgun.base_url}/#{@domain}/campaigns#{'/' + campaign if campaign}"
end

end
end
41 changes: 41 additions & 0 deletions lib/mailgun/event.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
require 'uri'

module Mailgun
class Event
attr_accessor :items, :page

def initialize(mailgun, domain)
@mailgun = mailgun
@domain = domain
end

# list events
def list(options={})
@stored_options = options.dup
@response = Mailgun.submit(:get, events_url(options[:address]), options)
@items = @response["items"] || []
@page = @response["paging"] || {}
self
end

def next
return unless next?
@mailgun.events.list(@stored_options.merge(address: address(@page["next"])))
end

def next?
@stored_options[:address] != address(@page["next"])
end

private

def address(uri)
URI.parse(uri).path.split("/").last if uri
end

# Helper method to generate the proper url for Mailgun event API calls
def events_url(address=nil)
"#{@mailgun.base_url}/#{@domain}/events#{'/' + address if address}"
end
end
end
4 changes: 4 additions & 0 deletions lib/mailgun/list.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ def delete(address)
Mailgun.submit :delete, list_url(address)
end

def create_members(address, members, options={})
params = {:members => members.to_json}
Mailgun.submit :post, list_url(address) + '/members.json', params.merge(options)
end

private

Expand Down
17 changes: 14 additions & 3 deletions lib/mailgun/message.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,25 @@ def send_email(parameters={})
# :in_test_mode BOOL. override the @use_test_mode setting
# :tags to add tags to the email
# :track BOOL
Mailgun.submit(:post, messages_url, parameters)
Mailgun.submit(:post, publish_messages_url, parameters)
end

def find(address, parameters={})
response = Mailgun.submit(:get, messages_url(address), parameters)
end

#private
# Removes a stored message from account
def delete(message_id)
Mailgun.submit :delete, messages_url(message_id)
end

# Helper method to generate the proper url for Mailgun message API calls
def messages_url
def publish_messages_url(address=nil)
"#{@mailgun.base_url}/#{@domain}/messages"
end

def messages_url(address=nil)
"#{@mailgun.base_url}/domains/#{@domain}/messages#{'/' + address if address}"
end
end
end
24 changes: 24 additions & 0 deletions spec/event_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
require 'spec_helper'

describe Mailgun::Event do

before :each do
@mailgun = Mailgun({:api_key => "api-key"}) # used to get the default values

@sample = {
:email => "test@sample.mailgun.org",
:list_email => "dev@samples.mailgun.org",
:name => "test",
:domain => "sample.mailgun.org"
}
end

describe "list events" do
it "should make a GET request with the right params" do
Mailgun.should_receive(:submit)
.with(:get, "#{@mailgun.events.send(:events_url)}", {:"event"=>'stored'}).and_return("dummy response")

@mailgun.events.list(:"event"=>'stored')
end
end
end
26 changes: 25 additions & 1 deletion spec/list/message_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,35 @@
:from => "lumberg.bill@initech.mailgun.domain"
}
Mailgun.should_receive(:submit) \
.with(:post, @mailgun.messages.messages_url, parameters) \
.with(:post, @mailgun.messages.publish_messages_url, parameters) \
.and_return(sample_response)

@mailgun.messages.send_email(parameters)
end
end

describe "find message" do
it "should make a GET request to find a message" do
sample_response = "{\"Received\": \"by foo bar\", \"From\": \"foobar@example.com\", \"To\":\"Foo Bar<foo@example.com>\", \"subject\":\"Hi\", \"stripped-html\": \"<html><body>Hi</body></html>\"}"
message_id = "WyJhMGU2YTFiZjIzIiwgImFV"
Mailgun.should_receive(:submit)
.with(:get, "#{@mailgun.messages.send(:messages_url, message_id)}", {})
.and_return(sample_response)

@mailgun.messages.find(message_id)
end
end

describe "delete message" do
it "should make a DELETE request with correct params" do
sample_response = "{\"message\": \"Message has been deleted\"}"
message_id = "WyJhMGU2YTFiZjIzIiwgImFV"

Mailgun.should_receive(:submit).
with(:delete, @mailgun.messages.send(:messages_url, message_id)).
and_return(sample_response)

@mailgun.messages.delete(message_id)
end
end
end