From 505cec7aaa752aa5a81b4e2adb44321516c623bf Mon Sep 17 00:00:00 2001 From: Suresh Harikrishnan Date: Tue, 17 Sep 2013 20:27:28 +0530 Subject: [PATCH 1/8] list and find methods for message and events --- .gitignore | 3 ++- lib/mailgun.rb | 1 + lib/mailgun/base.rb | 4 ++++ lib/mailgun/event.rb | 19 +++++++++++++++++++ lib/mailgun/message.rb | 14 ++++++++++---- spec/event_spec.rb | 24 ++++++++++++++++++++++++ spec/list/message_spec.rb | 13 ++++++++++++- 7 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 lib/mailgun/event.rb create mode 100644 spec/event_spec.rb diff --git a/.gitignore b/.gitignore index dbedfe1..41ac185 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,5 @@ tmp startup.rb Guardfile .DS_Store -lib/startup.rb \ No newline at end of file +lib/startup.rb +.rvmrc \ No newline at end of file diff --git a/lib/mailgun.rb b/lib/mailgun.rb index 20592ff..7c1a7bf 100644 --- a/lib/mailgun.rb +++ b/lib/mailgun.rb @@ -14,6 +14,7 @@ require "mailgun/list" require "mailgun/list/member" require "mailgun/message" +require "mailgun/event" #require "startup" diff --git a/lib/mailgun/base.rb b/lib/mailgun/base.rb index b4632db..38521ff 100644 --- a/lib/mailgun/base.rb +++ b/lib/mailgun/base.rb @@ -29,6 +29,10 @@ def mailboxes(domain = Mailgun.domain) def messages(domain = Mailgun.domain) @messages ||= Mailgun::Message.new(self, domain) end + + def events(domain = Mailgun.domain) + @events ||= Mailgun::Event.new(self, domain) + end def routes @routes ||= Mailgun::Route.new(self) diff --git a/lib/mailgun/event.rb b/lib/mailgun/event.rb new file mode 100644 index 0000000..11b9106 --- /dev/null +++ b/lib/mailgun/event.rb @@ -0,0 +1,19 @@ +module Mailgun + class Event + def initialize(mailgun, domain) + @mailgun = mailgun + @domain = domain + end + + # list events + def list(parameters={}) + Mailgun.submit(:get, events_url, parameters) + end + + # Helper method to generate the proper url for Mailgun event API calls + def events_url(address=nil) + puts "#{@mailgun.base_url}/#{@domain}/events#{'/' + address if address}" + "#{@mailgun.base_url}/#{@domain}/events#{'/' + address if address}" + end + end +end diff --git a/lib/mailgun/message.rb b/lib/mailgun/message.rb index 8de6d8b..d7366e9 100644 --- a/lib/mailgun/message.rb +++ b/lib/mailgun/message.rb @@ -15,14 +15,20 @@ 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 # 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 diff --git a/spec/event_spec.rb b/spec/event_spec.rb new file mode 100644 index 0000000..374f815 --- /dev/null +++ b/spec/event_spec.rb @@ -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 \ No newline at end of file diff --git a/spec/list/message_spec.rb b/spec/list/message_spec.rb index e58641a..ef082cb 100644 --- a/spec/list/message_spec.rb +++ b/spec/list/message_spec.rb @@ -30,11 +30,22 @@ :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\", \"subject\":\"Hi\", \"stripped-html\": \"Hi\"}" + 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 end \ No newline at end of file From c6a3a8a43eea2b3c872f4232a8eb8e2fdfa704fa Mon Sep 17 00:00:00 2001 From: Suresh Harikrishnan Date: Wed, 18 Sep 2013 14:43:42 +0530 Subject: [PATCH 2/8] Support for stored message delete --- lib/mailgun/message.rb | 5 +++++ spec/list/message_spec.rb | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/mailgun/message.rb b/lib/mailgun/message.rb index d7366e9..d058d67 100644 --- a/lib/mailgun/message.rb +++ b/lib/mailgun/message.rb @@ -22,6 +22,11 @@ def find(address, parameters={}) response = Mailgun.submit(:get, messages_url(address), parameters) end + # 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 publish_messages_url(address=nil) "#{@mailgun.base_url}/#{@domain}/messages" diff --git a/spec/list/message_spec.rb b/spec/list/message_spec.rb index ef082cb..bc1a8d3 100644 --- a/spec/list/message_spec.rb +++ b/spec/list/message_spec.rb @@ -48,4 +48,17 @@ @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 \ No newline at end of file From 104414531be32c65050dedb26f2c2ee63cad2dfb Mon Sep 17 00:00:00 2001 From: Suresh Harikrishnan Date: Tue, 8 Oct 2013 11:39:56 +0530 Subject: [PATCH 3/8] support for bulk email upload --- lib/mailgun/list.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/mailgun/list.rb b/lib/mailgun/list.rb index f60564a..7544a99 100644 --- a/lib/mailgun/list.rb +++ b/lib/mailgun/list.rb @@ -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 From 0be25926084e4516947d46ce2d4fac8a39bc190f Mon Sep 17 00:00:00 2001 From: Mayank Kohaley Date: Tue, 25 Feb 2014 11:34:59 +0530 Subject: [PATCH 4/8] Adds method to fetch next page of events --- lib/mailgun/event.rb | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/mailgun/event.rb b/lib/mailgun/event.rb index 11b9106..132e855 100644 --- a/lib/mailgun/event.rb +++ b/lib/mailgun/event.rb @@ -1,15 +1,38 @@ +require 'uri' + module Mailgun class Event + attr_accessor :items, :page + def initialize(mailgun, domain) @mailgun = mailgun @domain = domain end # list events - def list(parameters={}) - Mailgun.submit(:get, events_url, parameters) + 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? + @items.count > 0 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) puts "#{@mailgun.base_url}/#{@domain}/events#{'/' + address if address}" From 02f668c6db873bbd84beeae9be05892c7170c2c1 Mon Sep 17 00:00:00 2001 From: Lewis Buckley Date: Fri, 14 Mar 2014 12:52:57 +0000 Subject: [PATCH 5/8] fixed events domain issue --- lib/mailgun.rb | 3 ++- lib/mailgun/event.rb | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/mailgun.rb b/lib/mailgun.rb index 7c1a7bf..502461d 100644 --- a/lib/mailgun.rb +++ b/lib/mailgun.rb @@ -20,5 +20,6 @@ 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 +end \ No newline at end of file diff --git a/lib/mailgun/event.rb b/lib/mailgun/event.rb index 132e855..492e676 100644 --- a/lib/mailgun/event.rb +++ b/lib/mailgun/event.rb @@ -3,7 +3,7 @@ module Mailgun class Event attr_accessor :items, :page - + def initialize(mailgun, domain) @mailgun = mailgun @domain = domain @@ -27,7 +27,7 @@ def next? @items.count > 0 end - private + #private def address(uri) URI.parse(uri).path.split("/").last if uri @@ -35,7 +35,6 @@ def address(uri) # Helper method to generate the proper url for Mailgun event API calls def events_url(address=nil) - puts "#{@mailgun.base_url}/#{@domain}/events#{'/' + address if address}" "#{@mailgun.base_url}/#{@domain}/events#{'/' + address if address}" end end From 92a8af061cb06985f789fdf70a7fbf20018f90ef Mon Sep 17 00:00:00 2001 From: Lewis Buckley Date: Fri, 14 Mar 2014 12:57:30 +0000 Subject: [PATCH 6/8] Made methods private again --- lib/mailgun/event.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mailgun/event.rb b/lib/mailgun/event.rb index 492e676..ee2c265 100644 --- a/lib/mailgun/event.rb +++ b/lib/mailgun/event.rb @@ -27,7 +27,7 @@ def next? @items.count > 0 end - #private + private def address(uri) URI.parse(uri).path.split("/").last if uri @@ -38,4 +38,4 @@ def events_url(address=nil) "#{@mailgun.base_url}/#{@domain}/events#{'/' + address if address}" end end -end +end \ No newline at end of file From 8b836e0c2cb29e2c4daa4f74bbd4f910d84458b7 Mon Sep 17 00:00:00 2001 From: Mayank Kohaley Date: Wed, 26 Mar 2014 11:08:54 +0530 Subject: [PATCH 7/8] Bug Fix: Only fetch next set of events if the next page address is different --- lib/mailgun/event.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mailgun/event.rb b/lib/mailgun/event.rb index ee2c265..ff3f8ba 100644 --- a/lib/mailgun/event.rb +++ b/lib/mailgun/event.rb @@ -24,7 +24,7 @@ def next end def next? - @items.count > 0 + @stored_options[:address] != address(@page["next"]) end private From bb97b12aa207f05dd5783df59005608a461ba802 Mon Sep 17 00:00:00 2001 From: Suresh Date: Wed, 23 Jul 2014 11:10:52 +0530 Subject: [PATCH 8/8] Support for multiple domains, campaigns --- lib/mailgun.rb | 3 ++- lib/mailgun/base.rb | 26 +++++++++++++++----------- lib/mailgun/campaign.rb | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 lib/mailgun/campaign.rb diff --git a/lib/mailgun.rb b/lib/mailgun.rb index 502461d..f068f4e 100644 --- a/lib/mailgun.rb +++ b/lib/mailgun.rb @@ -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" @@ -22,4 +23,4 @@ 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 \ No newline at end of file +end diff --git a/lib/mailgun/base.rb b/lib/mailgun/base.rb index 38521ff..63a1110 100644 --- a/lib/mailgun/base.rb +++ b/lib/mailgun/base.rb @@ -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 @@ -22,39 +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 = Mailgun.domain) + 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 diff --git a/lib/mailgun/campaign.rb b/lib/mailgun/campaign.rb new file mode 100644 index 0000000..82002d8 --- /dev/null +++ b/lib/mailgun/campaign.rb @@ -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