mail-mad_mimi 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|