mail-mad_mimi 1.0.0
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.
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/README.md +70 -0
- data/Rakefile +6 -0
- data/lib/mail/mad_mimi/version.rb +5 -0
- data/lib/mail/mad_mimi.rb +60 -0
- data/mail-mad_mimi.gemspec +26 -0
- data/spec/mail/action_mailer_spec.rb +18 -0
- data/spec/mail/mad_mimi_spec.rb +135 -0
- data/spec/spec_helper.rb +2 -0
- metadata +139 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# Mail::MadMimi
|
2
|
+
|
3
|
+
`Mail::MadMimi` is a delivery method for `Mail`.
|
4
|
+
It uses the `MadMimi` library to send mail via [Mad Mimi][1].
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add to your `Gemfile`:
|
9
|
+
|
10
|
+
gem "mail-mad_mimi", :require => "mail/mad_mimi"
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
require "mail"
|
15
|
+
require "mail/mad_mimi"
|
16
|
+
|
17
|
+
mail = Mail.new do
|
18
|
+
to "user@example.com"
|
19
|
+
from "sender@example.com"
|
20
|
+
subject "test"
|
21
|
+
delivery_method Mail::MadMimi, :email => "sender@example.com", :api_key => "1234"
|
22
|
+
end
|
23
|
+
|
24
|
+
mail.deliver
|
25
|
+
|
26
|
+
## Headers and options
|
27
|
+
|
28
|
+
The `:to`, `:from`, `:bcc`, and `:subject`
|
29
|
+
headers are taken from the `Mail` object passed to
|
30
|
+
`deliver!`
|
31
|
+
|
32
|
+
In addition, any hash values given as a `:mad_mimi` header are
|
33
|
+
passed on to Mad Mimi. That means if you use the `Mail` object with
|
34
|
+
a different delivery method, you'll get an ugly `mad_mimi` header.
|
35
|
+
|
36
|
+
You can see other available options on the [Mad Mimi developer site][2].
|
37
|
+
|
38
|
+
HTML (`:raw_html`) and plain text (`:raw_plain_text`) bodies are extracted
|
39
|
+
from the `Mail` object.
|
40
|
+
|
41
|
+
Use `:list_name => "beta users"` to send to a list or `:to_all => true`
|
42
|
+
to send to all subscribers.
|
43
|
+
|
44
|
+
## Mad Mimi macros
|
45
|
+
|
46
|
+
If you are sending to an individual email address, the body must
|
47
|
+
include `[[tracking_beacon]]` or `[[peek_image]]`.
|
48
|
+
|
49
|
+
If you are sending to a list or everyone, the body must include
|
50
|
+
`[[opt_out]]` or `unsubscribe`.
|
51
|
+
|
52
|
+
An exception will be raised if you don't include a macro. When debugging,
|
53
|
+
you may want to make sure that you set `raise_delivery_errors = true`
|
54
|
+
on your `Mail` object.
|
55
|
+
|
56
|
+
## Rails 3 support
|
57
|
+
|
58
|
+
If `ActionMailer` is loaded, `Mail::MadMimi` registers itself as a
|
59
|
+
delivery method.
|
60
|
+
|
61
|
+
You can then configure it in an environment file:
|
62
|
+
|
63
|
+
config.action_mailer.delivery_method = :mad_mimi
|
64
|
+
config.action_mailer.mad_mimi_settings = {
|
65
|
+
:email => "user@example.com",
|
66
|
+
:api_key => "a1b9892611956aa13a5ab9ccf01f4966",
|
67
|
+
}
|
68
|
+
|
69
|
+
[1]: http://madmimi.com
|
70
|
+
[2]: http://madmimi.com/developer/mailer/transactional
|
data/Rakefile
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require "madmimi"
|
2
|
+
|
3
|
+
module Mail #:nodoc:
|
4
|
+
# Mail::MadMimi is a delivery method for <tt>Mail</tt>.
|
5
|
+
# It uses the <tt>MadMimi</tt> library to send mail via Mad Mimi.
|
6
|
+
|
7
|
+
class MadMimi
|
8
|
+
class Error < StandardError; end
|
9
|
+
attr_accessor :settings, :mimi
|
10
|
+
|
11
|
+
# Any settings given here will be passed to Mad Mimi.
|
12
|
+
#
|
13
|
+
# <tt>:email</tt> and <tt>:api_key</tt> are required.
|
14
|
+
def initialize(settings = {})
|
15
|
+
unless settings[:email] && settings[:api_key]
|
16
|
+
raise Error, "Missing :email and :api_key settings"
|
17
|
+
end
|
18
|
+
|
19
|
+
self.settings = settings
|
20
|
+
self.mimi = ::MadMimi.new settings[:email], settings[:api_key]
|
21
|
+
end
|
22
|
+
|
23
|
+
def options_from_mail(mail)
|
24
|
+
settings.merge(
|
25
|
+
:recipients => mail[:to].to_s,
|
26
|
+
:from => mail[:from].to_s,
|
27
|
+
:bcc => mail[:bcc].to_s,
|
28
|
+
:subject => mail.subject
|
29
|
+
).tap do |options|
|
30
|
+
options[:raw_html] = mail.html_part.body.to_s if mail.html_part
|
31
|
+
options[:raw_plain_text] = mail.text_part.body.to_s if mail.text_part
|
32
|
+
|
33
|
+
if mail.respond_to? :mailer_action
|
34
|
+
options[:promotion_name] = mail.mailer_action
|
35
|
+
end
|
36
|
+
|
37
|
+
options.merge!(mail[:mad_mimi].value) if mail[:mad_mimi]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def deliver!(mail)
|
42
|
+
mimi.send_mail(options_from_mail(mail), {}).tap do |response|
|
43
|
+
raise Error, response if response.to_i.zero? # no transaction id
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if defined? ActionMailer::Base
|
48
|
+
ActionMailer::Base.add_delivery_method :mad_mimi, Mail::MadMimi
|
49
|
+
|
50
|
+
module SetMailerAction
|
51
|
+
def wrap_delivery_behavior!(*args)
|
52
|
+
super
|
53
|
+
message.class_eval { attr_accessor :mailer_action }
|
54
|
+
message.mailer_action = "#{self.class}.#{action_name}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
ActionMailer::Base.send :include, SetMailerAction
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "mail/mad_mimi/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "mail-mad_mimi"
|
7
|
+
s.version = Mail::MadMimi::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Grant Hollingworth"]
|
10
|
+
s.email = ["grant@antiflux.org"]
|
11
|
+
s.homepage = "https://github.com/granth/mail-mad_mimi"
|
12
|
+
s.summary = "A Mad Mimi delivery method for the Ruby Mail library, with Rails 3 support."
|
13
|
+
s.description = s.summary
|
14
|
+
|
15
|
+
s.rubyforge_project = "mail-mad_mimi"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_runtime_dependency "madmimi", "~> 1.0.15"
|
23
|
+
s.add_runtime_dependency "mail", "~> 2.2"
|
24
|
+
s.add_development_dependency "rspec", "~> 2.6"
|
25
|
+
s.add_development_dependency "actionmailer", "~> 3.0"
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "action_mailer"
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
class TestMailer < ActionMailer::Base
|
5
|
+
def testo
|
6
|
+
mail :to => "testo@example.com"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe Mail::MadMimi, "when ActionMailer is loaded" do
|
11
|
+
it "should register itself as a delivery_method" do
|
12
|
+
ActionMailer::Base.delivery_methods[:mad_mimi].should == Mail::MadMimi
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should add a mailer_action method to messages for the promotion name" do
|
16
|
+
TestMailer.testo.mailer_action.should == "TestMailer.testo"
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mail::MadMimi do
|
4
|
+
let(:required_settings) { {:email => "joe@example.com", :api_key => "123"} }
|
5
|
+
|
6
|
+
context "when created without an email address or API key" do
|
7
|
+
it "should raise an error" do
|
8
|
+
expect { Mail::MadMimi.new }.to raise_error Mail::MadMimi::Error
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "when created with an email address and API key" do
|
13
|
+
subject { Mail::MadMimi.new required_settings }
|
14
|
+
|
15
|
+
it "should pass the email address and API key to MadMimi" do
|
16
|
+
subject.mimi.should be_a ::MadMimi
|
17
|
+
subject.mimi.username.should == "joe@example.com"
|
18
|
+
subject.mimi.api_key.should == "123"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should have a settings accessor" do
|
22
|
+
subject.settings.should == required_settings
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "getting options from a Mail::Message" do
|
27
|
+
subject { Mail::MadMimi.new required_settings }
|
28
|
+
|
29
|
+
let(:mail) do
|
30
|
+
Mail.new do
|
31
|
+
to "Andrew <andrew@example.com>"
|
32
|
+
from "Bob <bob@example.com>"
|
33
|
+
bcc "charlie@example.com"
|
34
|
+
subject "test mail"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
let(:options) { subject.options_from_mail(mail) }
|
39
|
+
|
40
|
+
it "should create a hash of options" do
|
41
|
+
options[:recipients].should == "Andrew <andrew@example.com>"
|
42
|
+
options[:from].should == "Bob <bob@example.com>"
|
43
|
+
options[:bcc].should == "charlie@example.com"
|
44
|
+
options[:subject].should == "test mail"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should merge in the class settings" do
|
48
|
+
subject.settings[:hidden] = true # hide in Mad Mimi interface
|
49
|
+
options[:hidden].should be_true
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should merge in :mad_mimi settings in mail object" do
|
53
|
+
mail[:mad_mimi] = {:promotion_name => "custom"}
|
54
|
+
options[:promotion_name].should == "custom"
|
55
|
+
end
|
56
|
+
|
57
|
+
context "with a text part" do
|
58
|
+
before(:each) do
|
59
|
+
mail.text_part do
|
60
|
+
body "text body"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should set :raw_plain_text" do
|
65
|
+
options[:raw_plain_text].should == "text body"
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should not set :raw_html to ensure plain text from Mad Mimi" do
|
69
|
+
options.should_not have_key :raw_html
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "with an HTML part" do
|
74
|
+
before(:each) do
|
75
|
+
mail.html_part do
|
76
|
+
content_type "text/html"
|
77
|
+
body "html body"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should set :raw_html" do
|
82
|
+
options[:raw_html].should == "html body"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "with a mailer_action method" do
|
87
|
+
before(:each) do
|
88
|
+
mail.stub :mailer_action => "Mailer.method"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should set the promotion name" do
|
92
|
+
options[:promotion_name].should == "Mailer.method"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "delivering" do
|
98
|
+
subject { Mail::MadMimi.new required_settings }
|
99
|
+
|
100
|
+
let(:mail) do
|
101
|
+
Mail.new do
|
102
|
+
to "Andrew <andrew@example.com>"
|
103
|
+
from "bob@example.com"
|
104
|
+
bcc "charlie@example.com"
|
105
|
+
subject "test mail"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
let(:options) { subject.options_from_mail mail }
|
110
|
+
|
111
|
+
before(:each) do
|
112
|
+
subject.mimi.stub :send_mail => "1234" # returns transaction id
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should call MadMimi#send_mail" do
|
116
|
+
subject.mimi.should_receive(:send_mail).with(options, {})
|
117
|
+
subject.deliver! mail
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should return the transaction id" do
|
121
|
+
subject.deliver!(mail).should == "1234"
|
122
|
+
end
|
123
|
+
|
124
|
+
context "with an error response" do
|
125
|
+
before(:each) do
|
126
|
+
subject.mimi.stub :send_mail => "oh no"
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should raise the error" do
|
130
|
+
expect { subject.deliver! mail }.
|
131
|
+
to raise_error Mail::MadMimi::Error, "oh no"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mail-mad_mimi
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Grant Hollingworth
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-06-06 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: madmimi
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 9
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 0
|
32
|
+
- 15
|
33
|
+
version: 1.0.15
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: mail
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 7
|
45
|
+
segments:
|
46
|
+
- 2
|
47
|
+
- 2
|
48
|
+
version: "2.2"
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: rspec
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ~>
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 15
|
60
|
+
segments:
|
61
|
+
- 2
|
62
|
+
- 6
|
63
|
+
version: "2.6"
|
64
|
+
type: :development
|
65
|
+
version_requirements: *id003
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
name: actionmailer
|
68
|
+
prerelease: false
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ~>
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 7
|
75
|
+
segments:
|
76
|
+
- 3
|
77
|
+
- 0
|
78
|
+
version: "3.0"
|
79
|
+
type: :development
|
80
|
+
version_requirements: *id004
|
81
|
+
description: A Mad Mimi delivery method for the Ruby Mail library, with Rails 3 support.
|
82
|
+
email:
|
83
|
+
- grant@antiflux.org
|
84
|
+
executables: []
|
85
|
+
|
86
|
+
extensions: []
|
87
|
+
|
88
|
+
extra_rdoc_files: []
|
89
|
+
|
90
|
+
files:
|
91
|
+
- .gitignore
|
92
|
+
- .rspec
|
93
|
+
- Gemfile
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- lib/mail/mad_mimi.rb
|
97
|
+
- lib/mail/mad_mimi/version.rb
|
98
|
+
- mail-mad_mimi.gemspec
|
99
|
+
- spec/mail/action_mailer_spec.rb
|
100
|
+
- spec/mail/mad_mimi_spec.rb
|
101
|
+
- spec/spec_helper.rb
|
102
|
+
homepage: https://github.com/granth/mail-mad_mimi
|
103
|
+
licenses: []
|
104
|
+
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
hash: 3
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
version: "0"
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
none: false
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
hash: 3
|
125
|
+
segments:
|
126
|
+
- 0
|
127
|
+
version: "0"
|
128
|
+
requirements: []
|
129
|
+
|
130
|
+
rubyforge_project: mail-mad_mimi
|
131
|
+
rubygems_version: 1.7.2
|
132
|
+
signing_key:
|
133
|
+
specification_version: 3
|
134
|
+
summary: A Mad Mimi delivery method for the Ruby Mail library, with Rails 3 support.
|
135
|
+
test_files:
|
136
|
+
- spec/mail/action_mailer_spec.rb
|
137
|
+
- spec/mail/mad_mimi_spec.rb
|
138
|
+
- spec/spec_helper.rb
|
139
|
+
has_rdoc:
|