From 342fbba1f950dfef5f83d6371aca06d8914bc726 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Sun, 3 Nov 2013 14:23:06 -0500 Subject: [PATCH 01/17] Add fetch/delete email methods --- lib/mailgun/message.rb | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/mailgun/message.rb b/lib/mailgun/message.rb index 68fa8ef..2c9b4a1 100644 --- a/lib/mailgun/message.rb +++ b/lib/mailgun/message.rb @@ -15,14 +15,34 @@ 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, send_messages_url, parameters) end - #private + # receive email + def fetch_email( key ) + # options: + # key is the identifier returned in the events call + # for a stored email + Mailgun.submit(:get, fetch_messages_url+"/"+key) + end + + # delete email + def delete_email( key ) + # options: + # key is the identifier returned in the events call + # for a stored email + Mailgun.submit(:delete, fetch_messages_url+"/"+key) + end + + private # Helper method to generate the proper url for Mailgun message API calls - def messages_url + def send_messages_url "#{@mailgun.base_url}/#{@domain}/messages" end + + def fetch_messages_url + "#{@mailgun.base_url}/domains/#{@domain}/messages" + end end end From 49616e83a4d3ab6aa4137452802509507fa2602d Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Sun, 3 Nov 2013 14:24:13 -0500 Subject: [PATCH 02/17] Add support for Mailgun Events API --- lib/mailgun/event.rb | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 lib/mailgun/event.rb diff --git a/lib/mailgun/event.rb b/lib/mailgun/event.rb new file mode 100644 index 0000000..355f8de --- /dev/null +++ b/lib/mailgun/event.rb @@ -0,0 +1,23 @@ +module Mailgun + class Events + # Used internally, called from Mailgun::Base + def initialize(mailgun, domain) + @mailgun = mailgun + @domain = domain + end + + # List all events for a given domain + # * domain the domain for which all events will listed + def list(options={}) + Mailgun.submit(:get, events_url, options)['items'] || [] + end + + private + + # Helper method to generate the proper url for Mailgun events API calls + def events_url + "#{@mailgun.base_url}/#{@domain}/events" + end + + end +end \ No newline at end of file From 0788485fd0a34e6ed0f84c20bf9a41b897a0b400 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Sun, 3 Nov 2013 14:25:02 -0500 Subject: [PATCH 03/17] Add support for Mailgun Events API --- lib/mailgun.rb | 1 + lib/mailgun/base.rb | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib/mailgun.rb b/lib/mailgun.rb index e833631..99604f6 100644 --- a/lib/mailgun.rb +++ b/lib/mailgun.rb @@ -11,6 +11,7 @@ require "mailgun/unsubscribe" require "mailgun/complaint" require "mailgun/log" +require "mailgun/event" require "mailgun/list" require "mailgun/list/member" require "mailgun/message" diff --git a/lib/mailgun/base.rb b/lib/mailgun/base.rb index efe7734..805b43a 100644 --- a/lib/mailgun/base.rb +++ b/lib/mailgun/base.rb @@ -54,6 +54,10 @@ def log(domain=Mailgun.domain) Mailgun::Log.new(self, domain) end + def events(domain=Mailgun.domain) + Mailgun::Events.new(self, domain) + end + def lists @lists ||= Mailgun::MailingList.new(self) end From 7092246082e39f077ace5b531e791da7e302a016 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Sun, 3 Nov 2013 14:25:58 -0500 Subject: [PATCH 04/17] Add support for store() action --- lib/mailgun/route.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/mailgun/route.rb b/lib/mailgun/route.rb index a819c3b..84beda2 100644 --- a/lib/mailgun/route.rb +++ b/lib/mailgun/route.rb @@ -4,7 +4,7 @@ class Route def initialize(mailgun) @mailgun = mailgun end - + def list(options={}) Mailgun.submit(:get, route_url, options)["items"] || [] end @@ -49,11 +49,11 @@ def update(route_id, params) Mailgun.submit(:put, route_url(route_id), data) end - + def destroy(route_id) Mailgun.submit(:delete, route_url(route_id))["id"] end - + private def route_url(route_id=nil) @@ -67,6 +67,12 @@ def build_actions(actions) case action.first.to_sym when :forward _actions << "forward(\"#{action.last}\")" + when :store + if action.length > 1 + _actions << "store(notify=#{action.last})" + else + _actions << "store()" + end when :stop _actions << "stop()" else From 8ce8496e1097b6a17277293f2da8db761659fea6 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Sun, 3 Nov 2013 15:07:20 -0500 Subject: [PATCH 05/17] Add tests for new functions --- mailgun.gemspec | 2 +- spec/event_spec.rb | 67 +++++++++++++++++++++++++++++++++++++++ spec/list/message_spec.rb | 38 ++++++++++++++++++++-- 3 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 spec/event_spec.rb diff --git a/mailgun.gemspec b/mailgun.gemspec index e33f365..c194731 100644 --- a/mailgun.gemspec +++ b/mailgun.gemspec @@ -13,7 +13,7 @@ Gem::Specification.new do |gem| gem.name = "mailgun" gem.require_paths = ["lib"] gem.version = "0.7" - + gem.add_dependency(%q, [">= 0"]) gem.add_dependency(%q, [">= 0"]) diff --git a/spec/event_spec.rb b/spec/event_spec.rb new file mode 100644 index 0000000..66d8d57 --- /dev/null +++ b/spec/event_spec.rb @@ -0,0 +1,67 @@ +require 'spec_helper' + +describe Mailgun::Events do + + before :each do + @mailgun = Mailgun({:api_key => "api-key"}) # used to get the default values + end + + describe "get events" do + it "should make a GET request with the right params" do + sample_response = <", + "message-id":"CAC8xyJxAO7Y0sr=3r-rJ4C6ULZs3cSVPPqYEXLHtarKOKaOCKw@mail.gmail.com", + "from":"Someone ", + "subject":"Re: A TEST" + }, + "attachments":[ + + ], + "recipients":[ + "satshabad@mailgun.com" + ], + "size":2566 + }, + "storage":{ + "url":"https://api.mailgun.net/v2/domains/ninomail.com/messages/WyI3MDhjODgwZTZlIiwgIjF6", + "key":"WyI3MDhjODgwZTZlIiwgIjF6" + }, + "event":"stored" + } + ] +} +EOF + + parameters = { + :end => "Wed, 15 Feb 2012 13:03:31 GMT", + :event => 'stored' + } + + Mailgun.should_receive(:submit). + with(:get, @mailgun.events.send('events_url'), parameters). + and_return(sample_response) + + @mailgun.events.list parameters + 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..3117f02 100644 --- a/spec/list/message_spec.rb +++ b/spec/list/message_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Mailgun::Log do +describe Mailgun::Message do before :each do @mailgun = Mailgun({:api_key => "api-key"}) # used to get the default values @@ -10,6 +10,8 @@ :name => "test", :domain => "sample.mailgun.org" } + + @sample_message_key = "WyI3MDhjODgwZTZlIiwgIjF6" end describe "send email" do @@ -30,11 +32,43 @@ :from => "lumberg.bill@initech.mailgun.domain" } Mailgun.should_receive(:submit) \ - .with(:post, @mailgun.messages.messages_url, parameters) \ + .with(:post, @mailgun.messages.send('send_messages_url'), parameters) \ .and_return(sample_response) @mailgun.messages.send_email(parameters) end end + describe "get email" do + it "should make a GET request with the right params" do + sample_response = <{ + "to"=>"lumberg.bill@initech.mailgun.domain", + "message-id"=>"20111114174239.25659.5817@samples.mailgun.org", + "from"=>"cooldev@your.mailgun.domain", + "subject"=>"RE: missing tps reports" + } +} +EOF + + Mailgun.should_receive(:submit). + with(:get, @mailgun.messages.send('fetch_messages_url')+'/'+@sample_message_key). + and_return(sample_response) + + @mailgun.messages.fetch_email @sample_message_key + end + end + + describe "delete email" do + it "should make a DELETE request with the right params" do + + Mailgun.should_receive(:submit). + with(:delete, @mailgun.messages.send('fetch_messages_url')+'/'+@sample_message_key). + and_return({}) + + @mailgun.messages.delete_email @sample_message_key + end + end + end \ No newline at end of file From 59ec8c9953ee9281ae9f2fd4d211ed9c7e22ee60 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Sun, 3 Nov 2013 15:38:39 -0500 Subject: [PATCH 06/17] Update README --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 1b460c2..36fe855 100644 --- a/README.md +++ b/README.md @@ -181,6 +181,23 @@ Supported route actions are: `:forward`, and `:stop` @mailbox.domains.delete "example.com" ``` + +#### Events +```ruby +# Initialize your Mailgun object: +@mailgun = Mailgun(:api_key => 'your-api-key') + +# Setup some paramters +parameters = { + :end => "Wed, 15 Feb 2012 13:03:31 GMT", + :event => 'stored' +} + +# Send the request +@mailgun.events.list parameters +``` + + ## Making Your Changes * Fork the project (Github has really good step-by-step directions) From 95c95307e0d00c7d260b3e2cd5bb081b87069e22 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Mon, 20 Jan 2014 15:22:05 -0500 Subject: [PATCH 07/17] Allow global domain to change --- lib/mailgun.rb | 2 +- lib/mailgun/message.rb | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/mailgun.rb b/lib/mailgun.rb index 99604f6..ada0522 100644 --- a/lib/mailgun.rb +++ b/lib/mailgun.rb @@ -20,6 +20,6 @@ def Mailgun(options={}) options[:api_key] = Mailgun.api_key if Mailgun.api_key - options[:domain] = Mailgun.domain if Mailgun.domain + #options[:domain] = Mailgun.domain if Mailgun.domain Mailgun::Base.new(options) end diff --git a/lib/mailgun/message.rb b/lib/mailgun/message.rb index 2c9b4a1..1e6869a 100644 --- a/lib/mailgun/message.rb +++ b/lib/mailgun/message.rb @@ -15,6 +15,13 @@ def send_email(parameters={}) # :in_test_mode BOOL. override the @use_test_mode setting # :tags to add tags to the email # :track BOOL + + # TODO: check addresses for proper format: + # display-name + # display-name should be enclosed in quotes + # to escape these characters ()<>[]:;,@\ + # and not contain any control characters + Mailgun.submit(:post, send_messages_url, parameters) end From 87eef993ba20c8650c056b11996a2d437fe247d0 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Fri, 26 Sep 2014 10:47:25 -0400 Subject: [PATCH 08/17] file downloads --- lib/mailgun/message.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/mailgun/message.rb b/lib/mailgun/message.rb index 1e6869a..632da1f 100644 --- a/lib/mailgun/message.rb +++ b/lib/mailgun/message.rb @@ -41,6 +41,17 @@ def delete_email( key ) Mailgun.submit(:delete, fetch_messages_url+"/"+key) end + def fetch_email_attachment( key, fidx ) + # options: + # key is the identifier returned in the events call + # for a stored email + # fidx is the index of the attachment (from the + # original message + + # There is no JSON response here ... just the file + RestClient.send(:get, fetch_messages_url+"/"+key+"/attachments/#{fidx}") + end + private # Helper method to generate the proper url for Mailgun message API calls From 26ff34cadb99c43830ca2e7177fce7001cecd385 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Wed, 15 Jul 2015 12:50:11 +0000 Subject: [PATCH 09/17] Pin resetclient --- mailgun.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mailgun.gemspec b/mailgun.gemspec index c194731..c96cc6d 100644 --- a/mailgun.gemspec +++ b/mailgun.gemspec @@ -14,7 +14,7 @@ Gem::Specification.new do |gem| gem.require_paths = ["lib"] gem.version = "0.7" - gem.add_dependency(%q, [">= 0"]) + gem.add_dependency(%q, ["< 1.8"]) gem.add_dependency(%q, [">= 0"]) gem.add_development_dependency(%q, [">= 2"]) From e215d70e57d6b56294c6ed129add72f3ed41bf7f Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Wed, 15 Jul 2015 13:03:19 +0000 Subject: [PATCH 10/17] Pin rest-client at 1.7.3 --- mailgun.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mailgun.gemspec b/mailgun.gemspec index c96cc6d..1cd35be 100644 --- a/mailgun.gemspec +++ b/mailgun.gemspec @@ -14,7 +14,7 @@ Gem::Specification.new do |gem| gem.require_paths = ["lib"] gem.version = "0.7" - gem.add_dependency(%q, ["< 1.8"]) + gem.add_dependency(%q, ["= 1.7.3"]) gem.add_dependency(%q, [">= 0"]) gem.add_development_dependency(%q, [">= 2"]) From e2875c653f5cd8fa5ca7e1dc4b62e91db46605e4 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Thu, 3 Dec 2015 12:52:12 +0000 Subject: [PATCH 11/17] Bump to new rest client --- mailgun.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mailgun.gemspec b/mailgun.gemspec index 1cd35be..e489f3c 100644 --- a/mailgun.gemspec +++ b/mailgun.gemspec @@ -14,7 +14,7 @@ Gem::Specification.new do |gem| gem.require_paths = ["lib"] gem.version = "0.7" - gem.add_dependency(%q, ["= 1.7.3"]) + gem.add_dependency(%q, ["~> 2.0.0.rc2"]) gem.add_dependency(%q, [">= 0"]) gem.add_development_dependency(%q, [">= 2"]) From eb9cf693ffaf8e67adb77d8fe55d782721c460b1 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Wed, 3 Aug 2016 19:58:58 +0000 Subject: [PATCH 12/17] Move to v3 and fetch mail per docs --- lib/mailgun/base.rb | 2 +- lib/mailgun/message.rb | 5 +++-- mailgun.gemspec | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/mailgun/base.rb b/lib/mailgun/base.rb index 805b43a..2afd2b2 100644 --- a/lib/mailgun/base.rb +++ b/lib/mailgun/base.rb @@ -10,7 +10,7 @@ class Base def initialize(options) Mailgun.mailgun_host = options.fetch(:mailgun_host) {"api.mailgun.net"} Mailgun.protocol = options.fetch(:protocol) { "https" } - Mailgun.api_version = options.fetch(:api_version) { "v2" } + Mailgun.api_version = options.fetch(:api_version) { "v3" } 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 } diff --git a/lib/mailgun/message.rb b/lib/mailgun/message.rb index 632da1f..83e480d 100644 --- a/lib/mailgun/message.rb +++ b/lib/mailgun/message.rb @@ -26,11 +26,12 @@ def send_email(parameters={}) end # receive email - def fetch_email( key ) + def fetch_email( url ) # options: # key is the identifier returned in the events call # for a stored email - Mailgun.submit(:get, fetch_messages_url+"/"+key) + parts = url.split( '//' ) + Mailgun.submit(:get, parts[0] + "//api:#{Mailgun.api_key}@" + parts[1]) end # delete email diff --git a/mailgun.gemspec b/mailgun.gemspec index e489f3c..602d634 100644 --- a/mailgun.gemspec +++ b/mailgun.gemspec @@ -12,7 +12,7 @@ Gem::Specification.new do |gem| gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") gem.name = "mailgun" gem.require_paths = ["lib"] - gem.version = "0.7" + gem.version = "0.8" gem.add_dependency(%q, ["~> 2.0.0.rc2"]) gem.add_dependency(%q, [">= 0"]) From 8dcfa240314dea911ce6495c058d52a31b87fe3f Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Sun, 13 Aug 2017 18:51:07 +0000 Subject: [PATCH 13/17] different server --- lib/mailgun/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mailgun/base.rb b/lib/mailgun/base.rb index 2afd2b2..b94f8a1 100644 --- a/lib/mailgun/base.rb +++ b/lib/mailgun/base.rb @@ -8,7 +8,7 @@ class Base # * Test mode - if enabled, doesn't actually send emails (see http://documentation.mailgun.net/user_manual.html#sending-in-test-mode) # * Domain - domain to use def initialize(options) - Mailgun.mailgun_host = options.fetch(:mailgun_host) {"api.mailgun.net"} + Mailgun.mailgun_host = options.fetch(:mailgun_host) { "sw.api.mailgun.net" } Mailgun.protocol = options.fetch(:protocol) { "https" } Mailgun.api_version = options.fetch(:api_version) { "v3" } Mailgun.test_mode = options.fetch(:test_mode) { false } From ae706918c70c39b4b56ee49d9c24772b320d9d3e Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Mon, 21 Aug 2017 10:56:11 +0000 Subject: [PATCH 14/17] URL no worky --- lib/mailgun/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mailgun/base.rb b/lib/mailgun/base.rb index b94f8a1..6d5f79a 100644 --- a/lib/mailgun/base.rb +++ b/lib/mailgun/base.rb @@ -8,7 +8,7 @@ class Base # * Test mode - if enabled, doesn't actually send emails (see http://documentation.mailgun.net/user_manual.html#sending-in-test-mode) # * Domain - domain to use def initialize(options) - Mailgun.mailgun_host = options.fetch(:mailgun_host) { "sw.api.mailgun.net" } + Mailgun.mailgun_host = options.fetch(:mailgun_host) { "api.mailgun.net" } Mailgun.protocol = options.fetch(:protocol) { "https" } Mailgun.api_version = options.fetch(:api_version) { "v3" } Mailgun.test_mode = options.fetch(:test_mode) { false } From 9156c543b1c24ea90dfd0498b7ccaab99f1b8a16 Mon Sep 17 00:00:00 2001 From: Ben Olson Date: Mon, 4 Sep 2017 22:34:05 +0000 Subject: [PATCH 15/17] Use uri to fetch attachments --- lib/mailgun/message.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/mailgun/message.rb b/lib/mailgun/message.rb index 83e480d..6201033 100644 --- a/lib/mailgun/message.rb +++ b/lib/mailgun/message.rb @@ -42,7 +42,7 @@ def delete_email( key ) Mailgun.submit(:delete, fetch_messages_url+"/"+key) end - def fetch_email_attachment( key, fidx ) + def fetch_email_attachment( url ) # options: # key is the identifier returned in the events call # for a stored email @@ -50,7 +50,8 @@ def fetch_email_attachment( key, fidx ) # original message # There is no JSON response here ... just the file - RestClient.send(:get, fetch_messages_url+"/"+key+"/attachments/#{fidx}") + parts = url.split( '//' ) + RestClient.send(:get, parts[0] + "//api:#{Mailgun.api_key}@" + parts[1]) end private From fe666afd280d5004721181e44c80a09aceb541cb Mon Sep 17 00:00:00 2001 From: bseth99 Date: Sat, 9 Dec 2023 09:10:32 -0500 Subject: [PATCH 16/17] Update mailgun.gemspec Remove multimap? --- mailgun.gemspec | 1 - 1 file changed, 1 deletion(-) diff --git a/mailgun.gemspec b/mailgun.gemspec index 602d634..12140b5 100644 --- a/mailgun.gemspec +++ b/mailgun.gemspec @@ -15,7 +15,6 @@ Gem::Specification.new do |gem| gem.version = "0.8" gem.add_dependency(%q, ["~> 2.0.0.rc2"]) - gem.add_dependency(%q, [">= 0"]) gem.add_development_dependency(%q, [">= 2"]) gem.add_development_dependency(%q, [">= 0"]) From 1ae60e1a563e8981bec1e9fed3280f85a30e1740 Mon Sep 17 00:00:00 2001 From: bseth99 Date: Sat, 9 Dec 2023 09:14:51 -0500 Subject: [PATCH 17/17] Update mailgun.rb Remove multimap --- lib/mailgun.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/mailgun.rb b/lib/mailgun.rb index ada0522..68b1b01 100644 --- a/lib/mailgun.rb +++ b/lib/mailgun.rb @@ -1,6 +1,5 @@ require "rest-client" require "json" -require "multimap" require "mailgun/mailgun_error" require "mailgun/base"