malone 0.1.0.rc1 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,21 @@
1
+ 1.0.0
2
+
3
+ - Malone.configure has been replaced with Malone.connect
4
+ Use Malone.current to retrieve the last configured Malone
5
+ instance (using Malone.connect)
6
+
7
+ - Malone.deliver has been replaced with an instance method.
8
+ Call deliver (with the same arguments as before) on the
9
+ return value of Malone.connect or Malone.current.
10
+
11
+ - Malone#deliver now receives :text and :html instead of :body.
12
+
13
+ - No need to pass in TLS. it's tries to do TLS automatically.
14
+
15
+ - Errors during SMTP authentication (and any other error) aren't
16
+ trapped silently now. (via @tizoc, @elpollila)
17
+
18
+ - Configuration parameters are more strict (i.e. passing :password
19
+ would throw a NoMethodError via @tizoc, @elpollila)
20
+
21
+ - malone/sandbox has been renamed to malone/test.
@@ -0,0 +1,71 @@
1
+ Originally taken from my initial draft [here][blogpost].
2
+
3
+ [blogpost]: http://www.pipetodevnull.com/past/2010/11/27/simple_mailer/
4
+
5
+ ## USAGE
6
+
7
+ ```ruby
8
+ $ gem install malone
9
+
10
+ require "malone"
11
+
12
+ # Typically you would do this somewhere in the bootstrapping
13
+ # part of your application
14
+
15
+ m = Malone.connect(url: "smtp://foo%40bar.com:pass1234@smtp.gmail.com:587",
16
+ domain: "mysite.com")
17
+
18
+ m.deliver(from: "me@me.com", to: "you@me.com",
19
+ subject: "Test subject", text: "Great!")
20
+
21
+ # Malone.current will now remember the last configuration you setup.
22
+ Malone.current.config == m.config
23
+
24
+ # Now you can also do Malone.deliver, which is syntactic sugar
25
+ # for Malone.current.deliver
26
+ Malone.deliver(from: "me@me.com", to: "you@me.com",
27
+ subject: "Test subject", text: "Great!")
28
+
29
+ # Also starting with Malone 1.0, you can also pass in :html
30
+ # for multipart emails.
31
+
32
+ m.deliver(from: "me@me.com", to: "you@me.com",
33
+ subject: "Test subject",
34
+ text: "Great!", html: "<b>Great!</b>")
35
+
36
+ ```
37
+
38
+ That's it!
39
+
40
+ ## TESTING
41
+
42
+ ```ruby
43
+ require "malone/test"
44
+
45
+ m = Malone.connect(url: "smtp://foo%40bar.com:pass1234@smtp.gmail.com:587",
46
+ domain: "mysite.com")
47
+
48
+ m.deliver(from: "me@me.com", to: "you@me.com",
49
+ subject: "Test subject", text: "Great!")
50
+
51
+ Malone.deliveries.size == 1
52
+ # => true
53
+
54
+ mail = Malone.deliveries.first
55
+
56
+ "me@me.com" == mail.from
57
+ # => true
58
+
59
+ "you@me.com" == mail.to
60
+ # => true
61
+
62
+ "FooBar" == mail.text
63
+ # => true
64
+
65
+ "Hello World" == envelope.subject
66
+ # => true
67
+ ```
68
+
69
+ ## LICENSE
70
+
71
+ MIT
@@ -1,47 +1,95 @@
1
- require "net/smtp"
2
- require "ostruct"
1
+ require "cgi"
3
2
  require "mailfactory"
3
+ require "net/smtp"
4
+ require "uri"
4
5
 
5
6
  class Malone
6
- attr :envelope
7
+ attr :config
8
+
9
+ def self.connect(options = {})
10
+ @config = Configuration.new(options)
7
11
 
8
- def self.deliver(params = {})
9
- new(params).deliver
12
+ current
10
13
  end
11
-
12
- def self.configure(hash)
13
- @config = OpenStruct.new(hash)
14
+
15
+ def self.current
16
+ unless defined?(@config)
17
+ raise RuntimeError, "Missing configuration: Try doing `Malone.connect`."
18
+ end
19
+
20
+ return new(@config)
14
21
  end
15
22
 
16
- def self.config
17
- @config
23
+ def self.deliver(dict)
24
+ current.deliver(dict)
18
25
  end
19
26
 
20
- def initialize(params = {})
21
- @envelope = MailFactory.new
22
- @envelope.from = params[:from]
23
- @envelope.to = params[:to]
24
- @envelope.text = params[:text]
25
- @envelope.html = params[:html] if params[:html]
26
- @envelope.subject = params[:subject]
27
+ def initialize(config)
28
+ @config = config
27
29
  end
28
30
 
29
- def deliver
30
- smtp = Net::SMTP.new config.host, config.port
31
- smtp.enable_starttls if config.tls
32
-
31
+ def deliver(dict)
32
+ mail = envelope(dict)
33
+
34
+ smtp = Net::SMTP.new(config.host, config.port)
35
+ smtp.enable_starttls_auto
36
+
33
37
  begin
34
- smtp.start(config.domain, config.user, config.pass, config.auth)
35
- smtp.send_message(envelope.to_s, envelope.from.first, envelope.to)
38
+ smtp.start(config.domain, config.user, config.password, config.auth)
39
+ smtp.send_message(mail.to_s, mail.from.first, mail.to)
36
40
  ensure
37
- smtp.finish
41
+ smtp.finish if smtp.started?
38
42
  end
39
43
  end
40
44
 
41
- private
42
- NotConfigured = Class.new(StandardError)
45
+ def envelope(dict)
46
+ envelope = MailFactory.new
47
+ envelope.from = dict[:from]
48
+ envelope.to = dict[:to]
49
+ envelope.text = dict[:text]
50
+ envelope.rawhtml = dict[:html] if dict[:html]
51
+ envelope.subject = dict[:subject]
52
+
53
+ return envelope
54
+ end
55
+
56
+ class Configuration
57
+ attr_accessor :host
58
+ attr_accessor :port
59
+ attr_accessor :user
60
+ attr_accessor :password
61
+ attr_accessor :domain
62
+ attr_accessor :auth
43
63
 
44
- def config
45
- self.class.config or raise(NotConfigured)
64
+ def initialize(options)
65
+ opts = options.dup
66
+
67
+ url = opts.delete(:url) || ENV["MALONE_URL"]
68
+
69
+ if url
70
+ uri = URI(url)
71
+
72
+ opts[:host] ||= uri.host
73
+ opts[:port] ||= uri.port.to_i
74
+ opts[:user] ||= unescaped(uri.user)
75
+ opts[:password] ||= unescaped(uri.password)
76
+ end
77
+
78
+ opts.each do |key, val|
79
+ send(:"#{key}=", val)
80
+ end
81
+ end
82
+
83
+ def auth=(val)
84
+ @auth = val
85
+ @auth = @auth.to_sym if @auth
86
+ end
87
+
88
+ private
89
+ def unescaped(val)
90
+ return if val.to_s.empty?
91
+
92
+ CGI.unescape(val)
93
+ end
46
94
  end
47
95
  end
@@ -5,8 +5,8 @@ class Malone
5
5
  @deliveries ||= []
6
6
  end
7
7
 
8
- def self.deliver(*args)
9
- deliveries << OpenStruct.new(*args)
8
+ def deliver(*args)
9
+ self.class.deliveries << OpenStruct.new(*args)
10
10
  end
11
11
  end
12
12
 
@@ -0,0 +1,23 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'malone'
3
+ s.version = "1.0.0.rc1"
4
+ s.summary = %{Dead-simple Ruby mailing solution which always delivers.}
5
+ s.date = "2011-01-10"
6
+ s.author = "Cyril David"
7
+ s.email = "me@cyrildavid.com"
8
+ s.homepage = "http://github.com/cyx/malone"
9
+
10
+ s.files = Dir[
11
+ "CHANGELOG",
12
+ "LICENSE",
13
+ "README.md",
14
+ "lib/**/*.rb",
15
+ "test/*.*",
16
+ "*.gemspec"
17
+ ]
18
+
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency "mailfactory", "~> 1.4"
22
+ s.add_development_dependency "cutest"
23
+ end
@@ -1,44 +1,4 @@
1
- require "cutest"
2
- require "flexmock/base"
3
-
4
- require File.expand_path("../lib/malone", File.dirname(__FILE__))
5
-
6
- class FlexMock
7
- class CutestFrameworkAdapter
8
- def assert_block(msg, &block)
9
- unless yield
10
- puts msg
11
- flunk(7)
12
- end
13
- end
14
-
15
- def assert_equal(a, b, msg=nil)
16
- flunk unless a == b
17
- end
18
-
19
- class AssertionFailedError < StandardError; end
20
-
21
- def assertion_failed_error
22
- Cutest::AssertionFailed
23
- end
24
- end
1
+ $:.unshift(File.expand_path("../lib", File.dirname(__FILE__)))
25
2
 
26
- @framework_adapter = CutestFrameworkAdapter.new
27
- end
28
-
29
- module Cutest::Flexmocked
30
- def test(*args, &block)
31
- super
32
-
33
- flexmock_verify
34
- ensure
35
- flexmock_close
36
- end
37
- end
38
-
39
- class Cutest::Scope
40
- include FlexMock::ArgumentTypes
41
- include FlexMock::MockContainer
42
-
43
- include Cutest::Flexmocked
44
- end
3
+ require "cutest"
4
+ require "malone"
@@ -1,125 +1,213 @@
1
- require File.expand_path("helper", File.dirname(__FILE__))
1
+ require_relative "helper"
2
2
 
3
- setup do
4
- m = Malone.new(from: "me@me.com", to: "you@me.com",
5
- body: "FooBar", subject: "Hello World")
3
+ test "basic configuration" do
4
+ m = Malone.connect(host: "smtp.gmail.com", port: 587,
5
+ user: "foo@bar.com", password: "pass1234",
6
+ domain: "foo.com", auth: "login")
7
+
8
+ c = m.config
9
+
10
+ assert_equal "smtp.gmail.com", c.host
11
+ assert_equal 587, c.port
12
+ assert_equal "foo@bar.com", c.user
13
+ assert_equal "pass1234", c.password
14
+ assert_equal "foo.com", c.domain
15
+ assert_equal :login, c.auth
6
16
  end
7
17
 
8
- test "envelope" do |m|
9
- assert m.envelope.from == ["me@me.com"]
10
- assert m.envelope.to == ["you@me.com"]
18
+ test "configuration via url" do
19
+ m = Malone.connect(url: "smtp://foo%40bar.com:pass1234@smtp.gmail.com:587")
11
20
 
12
- assert m.envelope.instance_variable_get(:@text) == "FooBar"
13
- assert m.envelope.get_header("subject") == ["=?utf-8?Q?Hello_World?="]
21
+ c = m.config
22
+
23
+ assert_equal "smtp.gmail.com", c.host
24
+ assert_equal 587, c.port
25
+ assert_equal "foo@bar.com", c.user
26
+ assert_equal "pass1234", c.password
14
27
  end
15
28
 
16
- test "delivering with no config" do |m|
17
- assert_raise Malone::NotConfigured do
18
- m.deliver
29
+ test "configuration via url and params" do
30
+ m = Malone.connect(url: "smtp://foo%40bar.com:pass1234@smtp.gmail.com:587",
31
+ domain: "foo.com", auth: "login", password: "barbaz123")
32
+
33
+ c = m.config
34
+
35
+ assert_equal "smtp.gmail.com", c.host
36
+ assert_equal 587, c.port
37
+ assert_equal "foo@bar.com", c.user
38
+ assert_equal "foo.com", c.domain
39
+ assert_equal :login, c.auth
40
+
41
+ # We verify that parameters passed takes precedence over the URL.
42
+ assert_equal "barbaz123", c.password
43
+ end
44
+
45
+ test "configuration via MALONE_URL" do
46
+ ENV["MALONE_URL"] = "smtp://foo%40bar.com:pass1234@smtp.gmail.com:587"
47
+
48
+ m = Malone.connect(domain: "foo.com", auth: "login")
49
+ c = m.config
50
+
51
+ assert_equal "smtp.gmail.com", c.host
52
+ assert_equal 587, c.port
53
+ assert_equal "foo@bar.com", c.user
54
+ assert_equal "foo.com", c.domain
55
+ assert_equal :login, c.auth
56
+ end
57
+
58
+ test "typos in configuration" do
59
+ assert_raise NoMethodError do
60
+ Malone.connect(pass: "pass")
19
61
  end
20
62
  end
21
63
 
22
- test "configuring" do
23
- Malone.configure(
24
- host: "smtp.gmail.com",
25
- port: 587,
26
- domain: "mydomain.com",
27
- tls: true,
28
- user: "me@mydomain.com",
29
- pass: "mypass",
30
- auth: :login
31
- )
32
-
33
- assert Malone.config.host == "smtp.gmail.com"
34
- assert Malone.config.port == 587
35
- assert Malone.config.domain == "mydomain.com"
36
- assert Malone.config.tls == true
37
- assert Malone.config.user == "me@mydomain.com"
38
- assert Malone.config.pass == "mypass"
39
- assert Malone.config.auth == :login
64
+ test "Malone.connect doesn't mutate the options" do
65
+ ex = nil
66
+ begin
67
+ Malone.connect({}.freeze)
68
+ rescue RuntimeError => ex
69
+ end
70
+
71
+ assert_equal nil, ex
72
+ end
73
+
74
+ test "Malone.current" do
75
+ Malone.connect(url: "smtp://foo%40bar.com:pass1234@smtp.gmail.com:587")
76
+
77
+ c = Malone.current.config
78
+
79
+ assert_equal "smtp.gmail.com", c.host
80
+ assert_equal 587, c.port
81
+ assert_equal "foo@bar.com", c.user
82
+ assert_equal "pass1234", c.password
83
+ end
84
+
85
+ test "#envelope" do
86
+ m = Malone.connect
87
+
88
+ mail = m.envelope(to: "recipient@me.com", from: "no-reply@mydomain.com",
89
+ subject: "SUB", text: "TEXT", html: "<h1>TEXT</h1>")
90
+
91
+ assert_equal ["recipient@me.com"], mail.to
92
+ assert_equal ["no-reply@mydomain.com"], mail.from
93
+ assert_equal ["=?utf-8?Q?SUB?="], mail.subject
94
+
95
+ assert_equal "TEXT", mail.instance_variable_get(:@text)
96
+ assert_equal "<h1>TEXT</h1>", mail.instance_variable_get(:@html)
40
97
  end
41
98
 
42
99
  scope do
43
- setup do
44
- Malone.configure(
45
- host: "smtp.gmail.com",
46
- port: 587,
47
- domain: "mydomain.com",
48
- tls: true,
49
- user: "me@mydomain.com",
50
- pass: "mypass",
51
- auth: :login
52
- )
53
- end
100
+ class FakeSMTP < Struct.new(:host, :port)
101
+ def enable_starttls_auto
102
+ @enable_starttls_auto = true
103
+ end
104
+
105
+ def start(domain, user, password, auth)
106
+ @domain, @user, @password, @auth = domain, user, password, auth
107
+
108
+ @started = true
109
+ end
110
+
111
+ def started?
112
+ defined?(@started)
113
+ end
54
114
 
55
- test "delivering successfully" do
56
- malone = Malone.new(to: "you@me.com", from: "me@me.com",
57
- subject: "My subject", body: "My body")
115
+ def finish
116
+ @finish = true
117
+ end
58
118
 
59
- # Let's begin the mocking fun
60
- sender = flexmock("smtp sender")
119
+ def send_message(blob, from, to)
120
+ @blob, @from, @to = blob, from, to
121
+ end
61
122
 
62
- # We start out by capturing the Net::SMTP.new part
63
- flexmock(Net::SMTP).should_receive(:new).with(
64
- "smtp.gmail.com", 587
65
- ).and_return(sender)
123
+ def [](key)
124
+ instance_variable_get(:"@#{key}")
125
+ end
126
+ end
66
127
 
67
- # Since we configured it with tls: true, then enable_starttls
68
- # should be called
69
- sender.should_receive(:enable_starttls).once
128
+ module Net
129
+ def SMTP.new(host, port)
130
+ $smtp = FakeSMTP.new(host, port)
131
+ end
132
+ end
70
133
 
71
- # Now we verify that start was indeed called exactly with the arguments
72
- # we passed in
73
- sender.should_receive(:start).once.with(
74
- "mydomain.com", "me@mydomain.com", "mypass", :login,
75
- )
134
+ setup do
135
+ Malone.connect(url: "smtp://foo%40bar.com:pass1234@smtp.gmail.com:587",
136
+ domain: "mydomain.com", auth: :login)
137
+ end
76
138
 
77
- # This is a bit of a hack, since envelope.to_s changes everytime.
78
- # Specifically, The Message-ID part changes.
79
- envelope_to_s = malone.envelope.to_s
139
+ test "delivering successfully" do |m|
140
+ m.deliver(to: "recipient@me.com", from: "no-reply@mydomain.com",
141
+ subject: "SUB", text: "TEXT")
80
142
 
81
- # So we get one result of envelope.to_s
82
- flexmock(malone.envelope).should_receive(:to_s).and_return(envelope_to_s)
143
+ assert_equal "smtp.gmail.com", $smtp.host
144
+ assert_equal 587, $smtp.port
83
145
 
84
- # And then we make sure that that value of envelope.to_s is used
85
- # instead of making it generate a new Message-ID
86
- sender.should_receive(:send_message).once.with(
87
- envelope_to_s, "me@me.com", ["you@me.com"]
88
- ).and_return("OK")
146
+ assert $smtp[:enable_starttls_auto]
147
+ assert_equal "mydomain.com", $smtp[:domain]
148
+ assert_equal "foo@bar.com", $smtp[:user]
149
+ assert_equal "pass1234", $smtp[:password]
150
+ assert_equal :login, $smtp[:auth]
89
151
 
90
- # I think this is important, otherwise the connection to the
91
- # smtp server won't be closed properly
92
- sender.should_receive(:finish).once
152
+ assert_equal ["recipient@me.com"], $smtp[:to]
153
+ assert_equal "no-reply@mydomain.com", $smtp[:from]
93
154
 
94
- # One important part of the API of malone is that deliver
95
- # should return the result of Net::SMTP#send_message.
96
- assert "OK" == malone.deliver
155
+ assert $smtp[:started]
156
+ assert $smtp[:finish]
97
157
  end
98
158
 
99
- test "delivering and failing" do
100
- malone = Malone.new(to: "you@me.com", from: "me@me.com",
101
- subject: "My subject", body: "My body")
159
+ test "Malone.deliver forwards to Malone.current" do |m|
160
+ Malone.deliver(to: "recipient@me.com", from: "no-reply@mydomain.com",
161
+ subject: "SUB", text: "TEXT")
102
162
 
103
- # This is more or less the same example as above,
104
- # except that here we make send_message fail
105
- # and verify that finish is still called
106
- sender = flexmock("smtp sender")
163
+ assert_equal "smtp.gmail.com", $smtp.host
164
+ assert_equal 587, $smtp.port
107
165
 
108
- flexmock(Net::SMTP).should_receive(:new).with(
109
- "smtp.gmail.com", 587
110
- ).and_return(sender)
166
+ assert $smtp[:enable_starttls_auto]
167
+ assert_equal "mydomain.com", $smtp[:domain]
168
+ assert_equal "foo@bar.com", $smtp[:user]
169
+ assert_equal "pass1234", $smtp[:password]
170
+ assert_equal :login, $smtp[:auth]
111
171
 
112
- sender.should_receive(:enable_starttls).once
172
+ assert_equal ["recipient@me.com"], $smtp[:to]
173
+ assert_equal "no-reply@mydomain.com", $smtp[:from]
113
174
 
114
- sender.should_receive(:start).once.with(
115
- "mydomain.com", "me@mydomain.com", "mypass", :login,
116
- )
175
+ assert $smtp[:started]
176
+ assert $smtp[:finish]
177
+ end
117
178
 
118
- sender.should_receive(:send_message).once.and_raise(StandardError)
119
- sender.should_receive(:finish).once
179
+ test "calls #finish even when it fails during send_message" do |m|
180
+ class FakeSMTP
181
+ def send_message(*args)
182
+ raise
183
+ end
184
+ end
120
185
 
121
- assert_raise StandardError do
122
- assert nil == malone.deliver
186
+ begin
187
+ m.deliver(to: "recipient@me.com", from: "no-reply@mydomain.com",
188
+ subject: "SUB", text: "TEXT")
189
+ rescue
123
190
  end
191
+
192
+ assert $smtp[:started]
193
+ assert $smtp[:finish]
124
194
  end
125
- end
195
+ end
196
+
197
+ test "sandbox" do
198
+ require "malone/test"
199
+
200
+ m = Malone.connect
201
+ m.deliver(to: "recipient@me.com", from: "no-reply@mydomain.com",
202
+ subject: "SUB", text: "TEXT", html: "<h1>TEXT</h1>")
203
+
204
+ assert_equal 1, Malone.deliveries.size
205
+
206
+ mail = Malone.deliveries.first
207
+
208
+ assert_equal "no-reply@mydomain.com", mail.from
209
+ assert_equal "recipient@me.com", mail.to
210
+ assert_equal "SUB", mail.subject
211
+ assert_equal "TEXT", mail.text
212
+ assert_equal "<h1>TEXT</h1>", mail.html
213
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: malone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.rc1
4
+ version: 1.0.0.rc1
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -13,29 +13,18 @@ date: 2011-01-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mailfactory
16
- requirement: &2151851760 !ruby/object:Gem::Requirement
16
+ requirement: &70255670212260 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: '1.4'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2151851760
24
+ version_requirements: *70255670212260
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: cutest
27
- requirement: &2151851120 !ruby/object:Gem::Requirement
28
- none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
33
- type: :development
34
- prerelease: false
35
- version_requirements: *2151851120
36
- - !ruby/object:Gem::Dependency
37
- name: flexmock
38
- requirement: &2151850660 !ruby/object:Gem::Requirement
27
+ requirement: &70255670211520 !ruby/object:Gem::Requirement
39
28
  none: false
40
29
  requirements:
41
30
  - - ! '>='
@@ -43,20 +32,21 @@ dependencies:
43
32
  version: '0'
44
33
  type: :development
45
34
  prerelease: false
46
- version_requirements: *2151850660
35
+ version_requirements: *70255670211520
47
36
  description:
48
- email: cyx@pipetodevnull.com
37
+ email: me@cyrildavid.com
49
38
  executables: []
50
39
  extensions: []
51
40
  extra_rdoc_files: []
52
41
  files:
53
- - lib/malone/sandbox.rb
54
- - lib/malone.rb
55
- - README.markdown
42
+ - CHANGELOG
56
43
  - LICENSE
44
+ - README.md
45
+ - lib/malone/test.rb
46
+ - lib/malone.rb
57
47
  - test/helper.rb
58
48
  - test/malone.rb
59
- - test/sandbox.rb
49
+ - malone.gemspec
60
50
  homepage: http://github.com/cyx/malone
61
51
  licenses: []
62
52
  post_install_message:
@@ -79,6 +69,6 @@ requirements: []
79
69
  rubyforge_project:
80
70
  rubygems_version: 1.8.11
81
71
  signing_key:
82
- specification_version: 2
72
+ specification_version: 3
83
73
  summary: Dead-simple Ruby mailing solution which always delivers.
84
74
  test_files: []
@@ -1,54 +0,0 @@
1
- Originally taken from my initial draft [here][blogpost].
2
-
3
- [blogpost]: http://www.pipetodevnull.com/past/2010/11/27/simple_mailer/
4
-
5
- ## USAGE
6
-
7
- $ gem install malone
8
-
9
- require "malone"
10
-
11
- # typically you would do this somewhere in the bootstrapping
12
- # part of your application
13
-
14
- Malone.configure(
15
- host: "smtp.gmail.com",
16
- port: 587,
17
- tls: true,
18
- domain: "mydomain.com",
19
- user: "me@mydomain.com",
20
- pass: "mypass",
21
- auth: :login,
22
- from: "no-reply@mydomain.com"
23
- )
24
-
25
- Malone.deliver(from: "me@me.com", to: "you@me.com",
26
- subject: "Test subject", body: "Great!")
27
-
28
- That's it!
29
-
30
- ## TESTING
31
-
32
- require "malone/sandbox"
33
-
34
- Malone.deliver(from: "me@me.com", to: "you@me.com",
35
- subject: "Test subject", body: "Great!")
36
-
37
- Malone.deliveries.size == 1
38
- # => true
39
-
40
- envelope = Malone.deliveries.first
41
-
42
- "me@me.com" == envelope.from
43
- # => true
44
-
45
- "you@me.com" == envelope.to
46
- # => true
47
-
48
- "FooBar" == envelope.body
49
- # => true
50
-
51
- "Hello World" == envelope.subject## LICENSE
52
- # => true
53
-
54
- MIT
@@ -1,16 +0,0 @@
1
- require File.expand_path("helper", File.dirname(__FILE__))
2
- require File.expand_path("../lib/malone/sandbox", File.dirname(__FILE__))
3
-
4
- test "deliveries" do
5
- Malone.deliver from: "me@me.com", to: "you@me.com",
6
- body: "FooBar", subject: "Hello World"
7
-
8
- assert_equal 1, Malone.deliveries.size
9
-
10
- envelope = Malone.deliveries.first
11
-
12
- assert_equal "me@me.com", envelope.from
13
- assert_equal "you@me.com", envelope.to
14
- assert_equal "FooBar", envelope.body
15
- assert_equal "Hello World", envelope.subject
16
- end