pony 1.1 → 1.2

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.
Files changed (7) hide show
  1. data/README.rdoc +5 -0
  2. data/lib/pony.rb +115 -119
  3. data/pony.gemspec +17 -16
  4. data/spec/pony_spec.rb +223 -229
  5. metadata +18 -5
  6. data/lib/pony.rb~ +0 -110
  7. data/spec/pony_spec.rb~ +0 -232
@@ -123,6 +123,7 @@ Rick Olson
123
123
  Stephen Celis,
124
124
  Thomas Hurst,
125
125
  Kalin Harvey
126
+ Carl Hörberg
126
127
 
127
128
  Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
128
129
 
@@ -132,6 +133,10 @@ mailing list: ponyrb@googlegroups.com
132
133
 
133
134
  == Releases
134
135
 
136
+ 1.2
137
+ * Remove limitations on :via, and let mail handle it (this means you can say things like :via => test)
138
+ * Add reply-to option and a bundler file
139
+
135
140
  1.1
136
141
  * Add default options
137
142
 
@@ -102,138 +102,134 @@ require 'base64'
102
102
 
103
103
  module Pony
104
104
 
105
- @@options = {}
105
+ @@options = {}
106
106
 
107
107
  # Default options can be set so that they don't have to be repeated.
108
108
  #
109
109
  # Pony.options = { :from => 'noreply@example.com', :via => :smtp, :via_options => { :host => 'smtp.yourserver.com' } }
110
110
  # Pony.mail(:to => 'foo@bar') # Sends mail to foo@bar from noreply@example.com using smtp
111
111
  # Pony.mail(:from => 'pony@example.com', :to => 'foo@bar') # Sends mail to foo@bar from pony@example.com using smtp
112
- def self.options=(value)
113
- @@options = value
114
- end
112
+ def self.options=(value)
113
+ @@options = value
114
+ end
115
115
 
116
- def self.options()
117
- @@options
118
- end
116
+ def self.options()
117
+ @@options
118
+ end
119
119
 
120
120
  # Send an email
121
121
  # Pony.mail(:to => 'you@example.com', :from => 'me@example.com', :subject => 'hi', :body => 'Hello there.')
122
122
  # Pony.mail(:to => 'you@example.com', :html_body => '<h1>Hello there!</h1>', :body => "In case you can't read html, Hello there.")
123
123
  # Pony.mail(:to => 'you@example.com', :cc => 'him@example.com', :from => 'me@example.com', :subject => 'hi', :body => 'Howsit!')
124
- def self.mail(options)
125
- options = @@options.merge options
126
- raise(ArgumentError, ":to is required") unless options[:to]
127
-
128
- options[:via] = default_delivery_method unless options.has_key?(:via)
129
- raise(ArgumentError, ":via must be either smtp or sendmail") unless via_possibilities.include?(options[:via])
130
-
131
- options = cross_reference_depricated_fields(options)
132
-
133
- if options.has_key?(:via) && options[:via] == :sendmail
134
- options[:via_options] ||= {}
135
- options[:via_options][:location] ||= sendmail_binary
136
- end
137
-
138
- deliver build_mail(options)
139
- end
140
-
141
- private
142
-
143
- def self.cross_reference_depricated_fields(options)
144
- if options.has_key?(:smtp)
145
- warn depricated_message(:smtp, :via_options)
146
- options[:via_options] = options.delete(:smtp)
147
- end
148
-
149
- # cross-reference pony options to be compatible with keys mail expects
150
- { :host => :address, :user => :user_name, :auth => :authentication, :tls => :enable_starttls_auto }.each do |key, val|
151
- if options[:via_options] && options[:via_options].has_key?(key)
152
- warn depricated_message(key, val)
153
- options[:via_options][val] = options[:via_options].delete(key)
154
- end
155
- end
156
-
157
- if options[:content_type] && options[:content_type] =~ /html/ && !options[:html_body]
158
- warn depricated_message(:content_type, :html_body)
159
- options[:html_body] = options[:body]
160
- end
161
-
162
- return options
163
- end
164
-
165
- def self.deliver(mail)
166
- mail.deliver!
167
- end
168
-
169
- def self.default_delivery_method
170
- File.executable?(sendmail_binary) ? :sendmail : :smtp
171
- end
172
-
173
- def self.build_mail(options)
174
- mail = Mail.new do
175
- to options[:to]
176
- from options[:from] || 'pony@unknown'
177
- cc options[:cc]
178
- bcc options[:bcc]
179
- subject options[:subject]
180
- date options[:date] || Time.now
181
- message_id options[:message_id]
182
- sender options[:sender] if options[:sender]
183
-
184
- if options[:html_body]
185
- html_part do
186
- content_type 'text/html; charset=UTF-8'
187
- body options[:html_body]
188
- end
189
- end
190
-
191
- # If we're using attachments, the body needs to be a separate part. If not,
124
+ def self.mail(options)
125
+ options = @@options.merge options
126
+ raise(ArgumentError, ":to is required") unless options[:to]
127
+
128
+ options[:via] = default_delivery_method unless options.has_key?(:via)
129
+
130
+ options = cross_reference_depricated_fields(options)
131
+
132
+ if options.has_key?(:via) && options[:via] == :sendmail
133
+ options[:via_options] ||= {}
134
+ options[:via_options][:location] ||= sendmail_binary
135
+ end
136
+
137
+ deliver build_mail(options)
138
+ end
139
+
140
+ private
141
+
142
+ def self.cross_reference_depricated_fields(options)
143
+ if options.has_key?(:smtp)
144
+ warn depricated_message(:smtp, :via_options)
145
+ options[:via_options] = options.delete(:smtp)
146
+ end
147
+
148
+ # cross-reference pony options to be compatible with keys mail expects
149
+ { :host => :address, :user => :user_name, :auth => :authentication, :tls => :enable_starttls_auto }.each do |key, val|
150
+ if options[:via_options] && options[:via_options].has_key?(key)
151
+ warn depricated_message(key, val)
152
+ options[:via_options][val] = options[:via_options].delete(key)
153
+ end
154
+ end
155
+
156
+ if options[:content_type] && options[:content_type] =~ /html/ && !options[:html_body]
157
+ warn depricated_message(:content_type, :html_body)
158
+ options[:html_body] = options[:body]
159
+ end
160
+
161
+ return options
162
+ end
163
+
164
+ def self.deliver(mail)
165
+ mail.deliver!
166
+ end
167
+
168
+ def self.default_delivery_method
169
+ File.executable?(sendmail_binary) ? :sendmail : :smtp
170
+ end
171
+
172
+ def self.build_mail(options)
173
+ mail = Mail.new do
174
+ to options[:to]
175
+ from options[:from] || 'pony@unknown'
176
+ cc options[:cc]
177
+ reply_to options[:reply_to]
178
+ bcc options[:bcc]
179
+ subject options[:subject]
180
+ date options[:date] || Time.now
181
+ message_id options[:message_id]
182
+ sender options[:sender] if options[:sender]
183
+
184
+ if options[:html_body]
185
+ html_part do
186
+ content_type 'text/html; charset=UTF-8'
187
+ body options[:html_body]
188
+ end
189
+ end
190
+
191
+ # If we're using attachments, the body needs to be a separate part. If not,
192
192
  # we can just set the body directly.
193
- if options[:body] && (options[:html_body] || options[:attachments])
194
- text_part do
195
- body options[:body]
196
- end
197
- elsif options[:body]
198
- body options[:body]
199
- end
200
-
201
- delivery_method options[:via], (options.has_key?(:via_options) ? options[:via_options] : {})
193
+ if options[:body] && (options[:html_body] || options[:attachments])
194
+ text_part do
195
+ body options[:body]
196
+ end
197
+ elsif options[:body]
198
+ body options[:body]
199
+ end
200
+
201
+ delivery_method options[:via], (options.has_key?(:via_options) ? options[:via_options] : {})
202
202
  end
203
203
 
204
- (options[:attachments] || []).each do |name, body|
205
- # mime-types wants to send these as "quoted-printable"
206
- if name =~ /\.xlsx$/
207
- mail.attachments[name] = {
208
- :content => Base64.encode64(body),
209
- :transfer_encoding => :base64
210
- }
211
- else
212
- mail.attachments[name] = body
213
- end
214
- end
215
-
216
- (options[:headers] ||= {}).each do |key, value|
217
- mail[key] = value
218
- end
219
-
220
- mail.charset = options[:charset] if options[:charset] # charset must be set after setting content_type
221
-
222
- mail
223
- end
224
-
225
- def self.sendmail_binary
226
- sendmail = `which sendmail`.chomp
227
- sendmail.empty? ? '/usr/sbin/sendmail' : sendmail
228
- end
229
-
230
- def self.via_possibilities
231
- %w(sendmail smtp).map{ |x| x.to_sym }
232
- end
233
-
234
- def self.depricated_message(method, alternative)
235
- warning_message = "warning: '#{method}' is deprecated"
236
- warning_message += "; use '#{alternative}' instead." if alternative
237
- return warning_message
238
- end
204
+ (options[:attachments] || []).each do |name, body|
205
+ # mime-types wants to send these as "quoted-printable"
206
+ if name =~ /\.xlsx$/
207
+ mail.attachments[name] = {
208
+ :content => Base64.encode64(body),
209
+ :transfer_encoding => :base64
210
+ }
211
+ else
212
+ mail.attachments[name] = body
213
+ end
214
+ end
215
+
216
+ (options[:headers] ||= {}).each do |key, value|
217
+ mail[key] = value
218
+ end
219
+
220
+ mail.charset = options[:charset] if options[:charset] # charset must be set after setting content_type
221
+
222
+ mail
223
+ end
224
+
225
+ def self.sendmail_binary
226
+ sendmail = `which sendmail`.chomp
227
+ sendmail.empty? ? '/usr/sbin/sendmail' : sendmail
228
+ end
229
+
230
+ def self.depricated_message(method, alternative)
231
+ warning_message = "warning: '#{method}' is deprecated"
232
+ warning_message += "; use '#{alternative}' instead." if alternative
233
+ return warning_message
234
+ end
239
235
  end
@@ -1,22 +1,23 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |s|
4
- s.name = %q{pony}
5
- s.version = "1.1"
4
+ s.name = %q{pony}
5
+ s.version = "1.2"
6
6
 
7
- s.description = "Send email in one command: Pony.mail(:to => 'someone@example.com', :body => 'hello')"
8
- s.summary = s.description
9
- s.authors = ["Adam Wiggins", "maint: Ben Prew"]
10
- s.email = %q{ben.prew@gmail.com}
11
- s.homepage = %q{http://github.com/benprew/pony}
12
- s.rubyforge_project = "pony"
7
+ s.description = "Send email in one command: Pony.mail(:to => 'someone@example.com', :body => 'hello')"
8
+ s.summary = s.description
9
+ s.authors = ["Adam Wiggins", "maint: Ben Prew"]
10
+ s.email = %q{ben.prew@gmail.com}
11
+ s.homepage = %q{http://github.com/benprew/pony}
12
+ s.rubyforge_project = "pony"
13
13
 
14
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
15
- s.files = ["README.rdoc", "Rakefile", "pony.gemspec" ] + Dir.glob("{lib,spec}/**/*")
16
- s.has_rdoc = false
17
- s.rdoc_options = ["--inline-source", "--charset=UTF-8"]
18
- s.require_paths = ["lib"]
19
- s.rubygems_version = %q{1.3.1}
20
- s.add_dependency( 'mail', '>2.0')
21
- s.platform = Gem::Platform::RUBY
14
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
15
+ s.files = ["README.rdoc", "Rakefile", "pony.gemspec" ] + Dir.glob("{lib,spec}/**/*")
16
+ s.has_rdoc = false
17
+ s.rdoc_options = ["--inline-source", "--charset=UTF-8"]
18
+ s.require_paths = ["lib"]
19
+ s.rubygems_version = %q{1.3.1}
20
+ s.add_dependency 'mail', '>2.0'
21
+ s.add_development_dependency "rspec", ">= 2.0.0"
22
+ s.platform = Gem::Platform::RUBY
22
23
  end
@@ -3,234 +3,228 @@ require File.dirname(__FILE__) + '/base'
3
3
 
4
4
  describe Pony do
5
5
 
6
- before(:each) do
7
- Pony.stub!(:deliver)
8
- end
9
-
10
- it "sends mail" do
11
- Pony.should_receive(:deliver) do |mail|
12
- mail.to.should == [ 'joe@example.com' ]
13
- mail.from.should == [ 'sender@example.com' ]
14
- mail.subject.should == 'hi'
15
- mail.body.should == 'Hello, Joe.'
16
- end
17
- Pony.mail(:to => 'joe@example.com', :from => 'sender@example.com', :subject => 'hi', :body => 'Hello, Joe.')
18
- end
19
-
20
- it "requires :to param" do
21
- lambda { Pony.mail({}) }.should raise_error(ArgumentError)
22
- end
23
-
24
- it "doesn't require any other param" do
25
- lambda { Pony.mail(:to => 'joe@example.com') }.should_not raise_error
26
- end
27
-
28
- it "should handle depricated options gracefully" do
29
- Pony.should_receive(:build_mail).with(hash_including(:via_options => {:address => 'test'}))
30
- Pony.mail(:to => 'foo@bar', :smtp => { :host => 'test' }, :via => :smtp)
31
- end
32
-
33
- it "should handle depricated content-type gracefully" do
34
- Pony.should_receive(:build_mail).with(hash_including(:html_body => "this is <h1>HTML</h1>"))
35
- Pony.mail(:to => 'foo@bar', :content_type => 'text/html', :body => 'this is <h1>HTML</h1>')
36
- end
37
- ####################
38
-
39
- describe "builds a Mail object with field:" do
40
- it "to" do
41
- Pony.build_mail(:to => 'joe@example.com').to.should == [ 'joe@example.com' ]
42
- end
43
-
44
- it "to with multiple recipients" do
45
- Pony.build_mail(:to => 'joe@example.com, friedrich@example.com').to.should == [ 'joe@example.com', 'friedrich@example.com' ]
46
- end
47
-
48
- it "to with multiple recipients and names" do
49
- Pony.build_mail(:to => 'joe@example.com, "Friedrich Hayek" <friedrich@example.com>').to.should == [ 'joe@example.com', 'friedrich@example.com' ]
50
- end
51
-
52
- it "to with multiple recipients and names in an array" do
53
- Pony.build_mail(:to => ['joe@example.com', '"Friedrich Hayek" <friedrich@example.com>']).to.should == [ 'joe@example.com', 'friedrich@example.com' ]
54
- end
55
-
56
- it "cc" do
57
- Pony.build_mail(:cc => 'joe@example.com').cc.should == [ 'joe@example.com' ]
58
- end
59
-
60
- it "cc with multiple recipients" do
61
- Pony.build_mail(:cc => 'joe@example.com, friedrich@example.com').cc.should == [ 'joe@example.com', 'friedrich@example.com' ]
62
- end
63
-
64
- it "from" do
65
- Pony.build_mail(:from => 'joe@example.com').from.should == [ 'joe@example.com' ]
66
- end
67
-
68
- it "bcc" do
69
- Pony.build_mail(:bcc => 'joe@example.com').bcc.should == [ 'joe@example.com' ]
70
- end
71
-
72
- it "bcc with multiple recipients" do
73
- Pony.build_mail(:bcc => 'joe@example.com, friedrich@example.com').bcc.should == [ 'joe@example.com', 'friedrich@example.com' ]
74
- end
75
-
76
- it "charset" do
77
- mail = Pony.build_mail(:charset => 'UTF-8')
78
- mail.charset.should == 'UTF-8'
79
- end
80
-
81
- it "default charset" do
82
- Pony.build_mail(:body => 'body').charset.should == 'UTF-8'
83
- Pony.build_mail(:body => 'body', :content_type => 'text/html').charset.should == 'UTF-8'
84
- end
85
-
86
- it "from (default)" do
87
- Pony.build_mail({}).from.should == [ 'pony@unknown' ]
88
- end
89
-
90
- it "subject" do
91
- Pony.build_mail(:subject => 'hello').subject.should == 'hello'
92
- end
93
-
94
- it "body" do
95
- Pony.build_mail(:body => 'What do you know, Joe?').body.should == 'What do you know, Joe?'
96
- end
97
-
98
- it "html_body" do
99
- Pony.build_mail(:html_body => 'What do you know, Joe?').parts.first.body.should == 'What do you know, Joe?'
100
- Pony.build_mail(:html_body => 'What do you know, Joe?').parts.first.content_type.should == 'text/html; charset=UTF-8'
101
- end
102
-
103
- it "date" do
104
- now = Time.now
105
- Pony.build_mail(:date => now).date.should == DateTime.parse(now.to_s)
106
- end
107
-
108
- it "content_type of html should set html_body" do
109
- Pony.should_receive(:build_mail).with(hash_including(:html_body => '<h1>test</h1>'))
110
- Pony.mail(:to => 'foo@bar', :content_type => 'text/html', :body => '<h1>test</h1>')
111
- end
112
-
113
- it "message_id" do
114
- Pony.build_mail(:message_id => '<abc@def.com>').message_id.should == 'abc@def.com'
115
- end
116
-
117
- it "custom headers" do
118
- Pony.build_mail(:headers => {"List-ID" => "<abc@def.com>"})['List-ID'].to_s.should == '<abc@def.com>'
119
- end
120
-
121
- it "sender" do
122
- Pony.build_mail(:sender => "abc@def.com")['Sender'].to_s.should == 'abc@def.com'
123
- end
124
-
125
- it "utf-8 encoded subject line" do
126
- mail = Pony.build_mail(:to => 'btp@foo', :subject => 'Café', :body => 'body body body')
127
- mail['subject'].encoded.should =~ /^Subject: =\?UTF-8/;
128
- end
129
-
130
- it "attachments" do
131
- mail = Pony.build_mail(:attachments => {"foo.txt" => "content of foo.txt"}, :body => 'test')
132
- mail.parts.length.should == 2
133
- mail.parts.first.to_s.should =~ /Content-Type: text\/plain/
134
- end
135
-
136
- it "suggests mime-type" do
137
- mail = Pony.build_mail(:attachments => {"foo.pdf" => "content of foo.pdf"})
138
- mail.parts.length.should == 1
139
- mail.parts.first.to_s.should =~ /Content-Type: application\/pdf/
140
- mail.parts.first.to_s.should =~ /filename=foo.pdf/
141
- mail.parts.first.content_transfer_encoding.to_s.should == 'base64'
142
- end
143
-
144
- it "encodes xlsx files as base64" do
145
- mail = Pony.build_mail(:attachments => {"foo.xlsx" => "content of foo.xlsx"})
146
- mail.parts.length.should == 1
147
- mail.parts.first.to_s.should =~ /Content-Type: application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet/
148
- mail.parts.first.to_s.should =~ /filename=foo.xlsx/
149
- mail.parts.first.content_transfer_encoding.to_s.should == 'base64'
150
- end
151
-
152
- it "passes cc and bcc as the list of recipients" do
153
- mail = Pony.build_mail(:to => ['to'], :cc => ['cc'], :from => ['from'], :bcc => ['bcc'])
154
- mail.destinations.should == ['to', 'cc', 'bcc']
155
- end
156
- end
157
-
158
- describe "transport" do
159
- it "transports via smtp if no sendmail binary" do
160
- Pony.stub!(:sendmail_binary).and_return('/does/not/exist')
161
- Pony.should_receive(:build_mail).with(hash_including(:via => :smtp))
162
- Pony.mail(:to => 'foo@bar')
163
- end
164
-
165
- it "defaults to sendmail if no via is specified and sendmail exists" do
166
- File.stub!(:executable?).and_return(true)
167
- Pony.should_receive(:build_mail).with(hash_including(:via => :sendmail))
168
- Pony.mail(:to => 'foo@bar')
169
- end
170
-
171
- describe "SMTP transport" do
172
-
173
- it "defaults to localhost as the SMTP server" do
174
- mail = Pony.build_mail(:to => "foo@bar", :enable_starttls_auto => true, :via => :smtp)
175
- mail.delivery_method.settings[:address].should == 'localhost'
176
- end
177
-
178
- it "enable starttls when tls option is true" do
179
- mail = Pony.build_mail(:to => "foo@bar", :enable_starttls_auto => true, :via => :smtp)
180
- mail.delivery_method.settings[:enable_starttls_auto].should == true
181
- end
182
- end
183
- end
184
-
185
- describe ":via option should over-ride the default transport mechanism" do
186
- it "should send via sendmail if :via => sendmail" do
187
- mail = Pony.build_mail(:to => 'joe@example.com', :via => :sendmail)
188
- mail.delivery_method.kind_of?(Mail::Sendmail).should == true
189
- end
190
-
191
- it "should send via smtp if :via => smtp" do
192
- mail = Pony.build_mail(:to => 'joe@example.com', :via => :smtp)
193
- mail.delivery_method.kind_of?(Mail::SMTP).should == true
194
- end
195
-
196
- it "should raise an error if via is neither smtp nor sendmail" do
197
- lambda { Pony.mail(:to => 'joe@plumber.com', :via => :pigeon) }.should raise_error(ArgumentError)
198
- end
199
- end
200
-
201
- describe "via_possibilities" do
202
- it "should contain smtp and sendmail" do
203
- Pony.via_possibilities.should == [:sendmail, :smtp]
204
- end
205
- end
206
-
207
-
208
- describe "sendmail binary location" do
209
- it "should default to /usr/sbin/sendmail if not in path" do
210
- Pony.stub!(:'`').and_return('')
211
- Pony.sendmail_binary.should == '/usr/sbin/sendmail'
212
- end
213
- end
214
-
215
- describe "default options" do
216
- it "should use default options" do
217
- Pony.should_receive(:build_mail).with(hash_including(:from => 'noreply@pony'))
218
- Pony.options = { :from => 'noreply@pony' }
219
- Pony.mail(:to => 'foo@bar')
220
- end
221
-
222
- it "should merge default options with options" do
223
- Pony.should_receive(:build_mail).with(hash_including(:from => 'override@pony'))
224
- Pony.options = { :from => 'noreply@pony' }
225
- Pony.mail(:from => 'override@pony', :to => "foo@bar")
226
- end
227
-
228
- it "should return the default options" do
229
- input = { :from => 'noreply@pony' }
230
- Pony.options = input
231
- output = Pony.options
232
- output.should == input
233
- end
234
- end
6
+ before(:each) do
7
+ Pony.stub!(:deliver)
8
+ end
9
+
10
+ it "sends mail" do
11
+ Pony.should_receive(:deliver) do |mail|
12
+ mail.to.should == [ 'joe@example.com' ]
13
+ mail.from.should == [ 'sender@example.com' ]
14
+ mail.subject.should == 'hi'
15
+ mail.body.should == 'Hello, Joe.'
16
+ end
17
+ Pony.mail(:to => 'joe@example.com', :from => 'sender@example.com', :subject => 'hi', :body => 'Hello, Joe.')
18
+ end
19
+
20
+ it "requires :to param" do
21
+ lambda { Pony.mail({}) }.should raise_error(ArgumentError)
22
+ end
23
+
24
+ it "doesn't require any other param" do
25
+ lambda { Pony.mail(:to => 'joe@example.com') }.should_not raise_error
26
+ end
27
+
28
+ it "should handle depricated options gracefully" do
29
+ Pony.should_receive(:build_mail).with(hash_including(:via_options => {:address => 'test'}))
30
+ Pony.mail(:to => 'foo@bar', :smtp => { :host => 'test' }, :via => :smtp)
31
+ end
32
+
33
+ it "should handle depricated content-type gracefully" do
34
+ Pony.should_receive(:build_mail).with(hash_including(:html_body => "this is <h1>HTML</h1>"))
35
+ Pony.mail(:to => 'foo@bar', :content_type => 'text/html', :body => 'this is <h1>HTML</h1>')
36
+ end
37
+ ####################
38
+
39
+ describe "builds a Mail object with field:" do
40
+ it "to" do
41
+ Pony.build_mail(:to => 'joe@example.com').to.should == [ 'joe@example.com' ]
42
+ end
43
+
44
+ it "to with multiple recipients" do
45
+ Pony.build_mail(:to => 'joe@example.com, friedrich@example.com').to.should == [ 'joe@example.com', 'friedrich@example.com' ]
46
+ end
47
+
48
+ it "to with multiple recipients and names" do
49
+ Pony.build_mail(:to => 'joe@example.com, "Friedrich Hayek" <friedrich@example.com>').to.should == [ 'joe@example.com', 'friedrich@example.com' ]
50
+ end
51
+
52
+ it "to with multiple recipients and names in an array" do
53
+ Pony.build_mail(:to => ['joe@example.com', '"Friedrich Hayek" <friedrich@example.com>']).to.should == [ 'joe@example.com', 'friedrich@example.com' ]
54
+ end
55
+
56
+ it "cc" do
57
+ Pony.build_mail(:cc => 'joe@example.com').cc.should == [ 'joe@example.com' ]
58
+ end
59
+
60
+ it "reply_to" do
61
+ Pony.build_mail(:reply_to => 'joe@example.com').reply_to.should == [ 'joe@example.com' ]
62
+ end
63
+
64
+ it "cc with multiple recipients" do
65
+ Pony.build_mail(:cc => 'joe@example.com, friedrich@example.com').cc.should == [ 'joe@example.com', 'friedrich@example.com' ]
66
+ end
67
+
68
+ it "from" do
69
+ Pony.build_mail(:from => 'joe@example.com').from.should == [ 'joe@example.com' ]
70
+ end
71
+
72
+ it "bcc" do
73
+ Pony.build_mail(:bcc => 'joe@example.com').bcc.should == [ 'joe@example.com' ]
74
+ end
75
+
76
+ it "bcc with multiple recipients" do
77
+ Pony.build_mail(:bcc => 'joe@example.com, friedrich@example.com').bcc.should == [ 'joe@example.com', 'friedrich@example.com' ]
78
+ end
79
+
80
+ it "charset" do
81
+ mail = Pony.build_mail(:charset => 'UTF-8')
82
+ mail.charset.should == 'UTF-8'
83
+ end
84
+
85
+ it "default charset" do
86
+ Pony.build_mail(:body => 'body').charset.should == 'UTF-8'
87
+ Pony.build_mail(:body => 'body', :content_type => 'text/html').charset.should == 'UTF-8'
88
+ end
89
+
90
+ it "from (default)" do
91
+ Pony.build_mail({}).from.should == [ 'pony@unknown' ]
92
+ end
93
+
94
+ it "subject" do
95
+ Pony.build_mail(:subject => 'hello').subject.should == 'hello'
96
+ end
97
+
98
+ it "body" do
99
+ Pony.build_mail(:body => 'What do you know, Joe?').body.should == 'What do you know, Joe?'
100
+ end
101
+
102
+ it "html_body" do
103
+ Pony.build_mail(:html_body => 'What do you know, Joe?').parts.first.body.should == 'What do you know, Joe?'
104
+ Pony.build_mail(:html_body => 'What do you know, Joe?').parts.first.content_type.should == 'text/html; charset=UTF-8'
105
+ end
106
+
107
+ it "date" do
108
+ now = Time.now
109
+ Pony.build_mail(:date => now).date.should == DateTime.parse(now.to_s)
110
+ end
111
+
112
+ it "content_type of html should set html_body" do
113
+ Pony.should_receive(:build_mail).with(hash_including(:html_body => '<h1>test</h1>'))
114
+ Pony.mail(:to => 'foo@bar', :content_type => 'text/html', :body => '<h1>test</h1>')
115
+ end
116
+
117
+ it "message_id" do
118
+ Pony.build_mail(:message_id => '<abc@def.com>').message_id.should == 'abc@def.com'
119
+ end
120
+
121
+ it "custom headers" do
122
+ Pony.build_mail(:headers => {"List-ID" => "<abc@def.com>"})['List-ID'].to_s.should == '<abc@def.com>'
123
+ end
124
+
125
+ it "sender" do
126
+ Pony.build_mail(:sender => "abc@def.com")['Sender'].to_s.should == 'abc@def.com'
127
+ end
128
+
129
+ it "utf-8 encoded subject line" do
130
+ mail = Pony.build_mail(:to => 'btp@foo', :subject => 'Café', :body => 'body body body')
131
+ mail['subject'].encoded.should =~ /^Subject: =\?UTF-8/;
132
+ end
133
+
134
+ it "attachments" do
135
+ mail = Pony.build_mail(:attachments => {"foo.txt" => "content of foo.txt"}, :body => 'test')
136
+ mail.parts.length.should == 2
137
+ mail.parts.first.to_s.should =~ /Content-Type: text\/plain/
138
+ end
139
+
140
+ it "suggests mime-type" do
141
+ mail = Pony.build_mail(:attachments => {"foo.pdf" => "content of foo.pdf"})
142
+ mail.parts.length.should == 1
143
+ mail.parts.first.to_s.should =~ /Content-Type: application\/pdf/
144
+ mail.parts.first.to_s.should =~ /filename=foo.pdf/
145
+ mail.parts.first.content_transfer_encoding.to_s.should == 'base64'
146
+ end
147
+
148
+ it "encodes xlsx files as base64" do
149
+ mail = Pony.build_mail(:attachments => {"foo.xlsx" => "content of foo.xlsx"})
150
+ mail.parts.length.should == 1
151
+ mail.parts.first.to_s.should =~ /Content-Type: application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet/
152
+ mail.parts.first.to_s.should =~ /filename=foo.xlsx/
153
+ mail.parts.first.content_transfer_encoding.to_s.should == 'base64'
154
+ end
155
+
156
+ it "passes cc and bcc as the list of recipients" do
157
+ mail = Pony.build_mail(:to => ['to'], :cc => ['cc'], :from => ['from'], :bcc => ['bcc'])
158
+ mail.destinations.should == ['to', 'cc', 'bcc']
159
+ end
160
+ end
161
+
162
+ describe "transport" do
163
+ it "transports via smtp if no sendmail binary" do
164
+ Pony.stub!(:sendmail_binary).and_return('/does/not/exist')
165
+ Pony.should_receive(:build_mail).with(hash_including(:via => :smtp))
166
+ Pony.mail(:to => 'foo@bar')
167
+ end
168
+
169
+ it "defaults to sendmail if no via is specified and sendmail exists" do
170
+ File.stub!(:executable?).and_return(true)
171
+ Pony.should_receive(:build_mail).with(hash_including(:via => :sendmail))
172
+ Pony.mail(:to => 'foo@bar')
173
+ end
174
+
175
+ describe "SMTP transport" do
176
+
177
+ it "defaults to localhost as the SMTP server" do
178
+ mail = Pony.build_mail(:to => "foo@bar", :enable_starttls_auto => true, :via => :smtp)
179
+ mail.delivery_method.settings[:address].should == 'localhost'
180
+ end
181
+
182
+ it "enable starttls when tls option is true" do
183
+ mail = Pony.build_mail(:to => "foo@bar", :enable_starttls_auto => true, :via => :smtp)
184
+ mail.delivery_method.settings[:enable_starttls_auto].should == true
185
+ end
186
+ end
187
+ end
188
+
189
+ describe ":via option should over-ride the default transport mechanism" do
190
+ it "should send via sendmail if :via => sendmail" do
191
+ mail = Pony.build_mail(:to => 'joe@example.com', :via => :sendmail)
192
+ mail.delivery_method.kind_of?(Mail::Sendmail).should == true
193
+ end
194
+
195
+ it "should send via smtp if :via => smtp" do
196
+ mail = Pony.build_mail(:to => 'joe@example.com', :via => :smtp)
197
+ mail.delivery_method.kind_of?(Mail::SMTP).should == true
198
+ end
199
+
200
+ end
201
+
202
+ describe "sendmail binary location" do
203
+ it "should default to /usr/sbin/sendmail if not in path" do
204
+ Pony.stub!(:'`').and_return('')
205
+ Pony.sendmail_binary.should == '/usr/sbin/sendmail'
206
+ end
207
+ end
208
+
209
+ describe "default options" do
210
+ it "should use default options" do
211
+ Pony.should_receive(:build_mail).with(hash_including(:from => 'noreply@pony'))
212
+ Pony.options = { :from => 'noreply@pony' }
213
+ Pony.mail(:to => 'foo@bar')
214
+ end
215
+
216
+ it "should merge default options with options" do
217
+ Pony.should_receive(:build_mail).with(hash_including(:from => 'override@pony'))
218
+ Pony.options = { :from => 'noreply@pony' }
219
+ Pony.mail(:from => 'override@pony', :to => "foo@bar")
220
+ end
221
+
222
+ it "should return the default options" do
223
+ input = { :from => 'noreply@pony' }
224
+ Pony.options = input
225
+ output = Pony.options
226
+ output.should == input
227
+ end
228
+ end
235
229
 
236
230
  end
metadata CHANGED
@@ -4,8 +4,8 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 1
8
- version: "1.1"
7
+ - 2
8
+ version: "1.2"
9
9
  platform: ruby
10
10
  authors:
11
11
  - Adam Wiggins
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-02 00:00:00 -07:00
17
+ date: 2011-04-20 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -31,6 +31,21 @@ dependencies:
31
31
  version: "2.0"
32
32
  type: :runtime
33
33
  version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rspec
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 2
44
+ - 0
45
+ - 0
46
+ version: 2.0.0
47
+ type: :development
48
+ version_requirements: *id002
34
49
  description: "Send email in one command: Pony.mail(:to => 'someone@example.com', :body => 'hello')"
35
50
  email: ben.prew@gmail.com
36
51
  executables: []
@@ -43,9 +58,7 @@ files:
43
58
  - README.rdoc
44
59
  - Rakefile
45
60
  - pony.gemspec
46
- - lib/pony.rb~
47
61
  - lib/pony.rb
48
- - spec/pony_spec.rb~
49
62
  - spec/base.rb
50
63
  - spec/pony_spec.rb
51
64
  has_rdoc: true
@@ -1,110 +0,0 @@
1
- require 'rubygems'
2
- require 'net/smtp'
3
- require 'mime/types'
4
- begin
5
- require 'smtp_tls'
6
- rescue LoadError
7
- end
8
- require 'base64'
9
- begin
10
- require 'tmail'
11
- rescue LoadError
12
- require 'actionmailer'
13
- end
14
-
15
- module Pony
16
- def self.mail(options)
17
- raise(ArgumentError, ":to is required") unless options[:to]
18
-
19
- via = options.delete(:via)
20
- if via.nil?
21
- transport build_tmail(options)
22
- else
23
- if via_options.include?(via.to_s)
24
- send("transport_via_#{via}", build_tmail(options), options)
25
- else
26
- raise(ArgumentError, ":via must be either smtp or sendmail")
27
- end
28
- end
29
- end
30
-
31
- def self.build_tmail(options)
32
- mail = TMail::Mail.new
33
- mail.to = options[:to]
34
- mail.cc = options[:cc]
35
- mail.bcc = options[:bcc]
36
- mail.from = options[:from] || 'pony@unknown'
37
- mail.subject = options[:subject]
38
- mail.date = options[:date] || Time.now
39
- mail.message_id = options[:message_id]
40
- if options[:attachments]
41
- # If message has attachment, then body must be sent as a message part
42
- # or it will not be interpreted correctly by client.
43
- body = TMail::Mail.new
44
- body.body = options[:body] || ""
45
- body.content_type = options[:content_type] || "text/plain"
46
- mail.parts.push body
47
- (options[:attachments] || []).each do |name, body|
48
- attachment = TMail::Mail.new
49
- attachment.transfer_encoding = "base64"
50
- attachment.body = Base64.encode64(body)
51
- content_type = MIME::Types.type_for(name).to_s
52
- attachment.content_type = content_type unless content_type == ""
53
- attachment.set_content_disposition "attachment", "filename" => name
54
- mail.parts.push attachment
55
- end
56
- else
57
- mail.content_type = options[:content_type] || "text/plain"
58
- mail.body = options[:body] || ""
59
- end
60
- (options[:headers] ||= {}).each do |key, value|
61
- mail[key] = value
62
- end
63
- mail.charset = options[:charset] # charset must be set after setting content_type
64
- mail
65
- end
66
-
67
- def self.sendmail_binary
68
- sendmail = `which sendmail`.chomp
69
- sendmail.empty? ? '/usr/sbin/sendmail' : sendmail
70
- end
71
-
72
- def self.transport(tmail)
73
- if File.executable? sendmail_binary
74
- transport_via_sendmail(tmail)
75
- else
76
- transport_via_smtp(tmail)
77
- end
78
- end
79
-
80
- def self.via_options
81
- %w(sendmail smtp)
82
- end
83
-
84
- def self.transport_via_sendmail(tmail, options={})
85
- IO.popen('-', 'w+') do |pipe|
86
- if pipe
87
- pipe.write(tmail.to_s)
88
- else
89
- exec(sendmail_binary, "-t")
90
- end
91
- end
92
- end
93
-
94
- def self.transport_via_smtp(tmail, options={:smtp => {}})
95
- default_options = {:smtp => { :host => 'localhost', :port => '25', :domain => 'localhost.localdomain' }}
96
- o = default_options[:smtp].merge(options[:smtp])
97
- smtp = Net::SMTP.new(o[:host], o[:port])
98
- if o[:tls]
99
- raise "You may need: gem install smtp_tls" unless smtp.respond_to?(:enable_starttls)
100
- smtp.enable_starttls
101
- end
102
- if o.include?(:auth)
103
- smtp.start(o[:domain], o[:user], o[:password], o[:auth])
104
- else
105
- smtp.start(o[:domain])
106
- end
107
- smtp.send_message tmail.to_s, tmail.from, tmail.destinations
108
- smtp.finish
109
- end
110
- end
@@ -1,232 +0,0 @@
1
- require File.dirname(__FILE__) + '/base'
2
-
3
- describe Pony do
4
- it "sends mail" do
5
- Pony.should_receive(:transport) do |tmail|
6
- tmail.to.should == [ 'joe@example.com' ]
7
- tmail.from.should == [ 'sender@example.com' ]
8
- tmail.subject.should == 'hi'
9
- tmail.body.should == 'Hello, Joe.'
10
- end
11
- Pony.mail(:to => 'joe@example.com', :from => 'sender@example.com', :subject => 'hi', :body => 'Hello, Joe.')
12
- end
13
-
14
- it "requires :to param" do
15
- Pony.stub!(:transport)
16
- lambda { Pony.mail({}) }.should raise_error(ArgumentError)
17
- end
18
-
19
- it "doesn't require any other param" do
20
- Pony.stub!(:transport)
21
- lambda { Pony.mail(:to => 'joe@example.com') }.should_not raise_error
22
- end
23
-
24
- ####################
25
-
26
- describe "builds a TMail object with field:" do
27
- it "to" do
28
- Pony.build_tmail(:to => 'joe@example.com').to.should == [ 'joe@example.com' ]
29
- end
30
-
31
- it "to with multiple recipients" do
32
- Pony.build_tmail(:to => 'joe@example.com, friedrich@example.com').to.should == [ 'joe@example.com', 'friedrich@example.com' ]
33
- end
34
-
35
- it "to with multiple recipients and names" do
36
- Pony.build_tmail(:to => 'joe@example.com, "Friedrich Hayek" <friedrich@example.com>').to.should == [ 'joe@example.com', 'friedrich@example.com' ]
37
- end
38
-
39
- it "to with multiple recipients and names in an array" do
40
- Pony.build_tmail(:to => ['joe@example.com', '"Friedrich Hayek" <friedrich@example.com>']).to.should == [ 'joe@example.com', 'friedrich@example.com' ]
41
- end
42
-
43
- it "cc" do
44
- Pony.build_tmail(:cc => 'joe@example.com').cc.should == [ 'joe@example.com' ]
45
- end
46
-
47
- it "cc with multiple recipients" do
48
- Pony.build_tmail(:cc => 'joe@example.com, friedrich@example.com').cc.should == [ 'joe@example.com', 'friedrich@example.com' ]
49
- end
50
-
51
- it "from" do
52
- Pony.build_tmail(:from => 'joe@example.com').from.should == [ 'joe@example.com' ]
53
- end
54
-
55
- it "bcc" do
56
- Pony.build_tmail(:bcc => 'joe@example.com').bcc.should == [ 'joe@example.com' ]
57
- end
58
-
59
- it "bcc with multiple recipients" do
60
- Pony.build_tmail(:bcc => 'joe@example.com, friedrich@example.com').bcc.should == [ 'joe@example.com', 'friedrich@example.com' ]
61
- end
62
-
63
- it "charset" do
64
- Pony.build_tmail(:charset => 'UTF-8').charset.should == 'UTF-8'
65
- end
66
-
67
- it "default charset" do
68
- Pony.build_tmail(:body => 'body').charset.should == nil
69
- Pony.build_tmail(:body => 'body', :content_type => 'text/html').charset.should == nil
70
- end
71
-
72
- it "from (default)" do
73
- Pony.build_tmail({}).from.should == [ 'pony@unknown' ]
74
- end
75
-
76
- it "subject" do
77
- Pony.build_tmail(:subject => 'hello').subject.should == 'hello'
78
- end
79
-
80
- it "body" do
81
- Pony.build_tmail(:body => 'What do you know, Joe?').body.should == 'What do you know, Joe?'
82
- end
83
-
84
- it "content_type" do
85
- Pony.build_tmail(:content_type => 'text/html').content_type.should == 'text/html'
86
- end
87
-
88
- it "message_id" do
89
- Pony.build_tmail(:message_id => '<abc@def.com>').message_id.should == '<abc@def.com>'
90
- end
91
-
92
- it "custom headers" do
93
- Pony.build_tmail(:headers => {"List-ID" => "<abc@def.com>"})['List-ID'].to_s.should == '<abc@def.com>'
94
- end
95
-
96
- it "attachments" do
97
- tmail = Pony.build_tmail(:attachments => {"foo.txt" => "content of foo.txt"})
98
- tmail.should have(2).parts
99
- tmail.parts.first.to_s.should == "Content-Type: text/plain\n\n"
100
- tmail.parts.last.to_s.should == <<-PART
101
- Content-Type: text/plain
102
- Content-Transfer-Encoding: Base64
103
- Content-Disposition: attachment; filename=foo.txt
104
-
105
- Y29udGVudCBvZiBmb28udHh0
106
- PART
107
- end
108
-
109
- it "suggests mime-type" do
110
- tmail = Pony.build_tmail(:attachments => {"foo.pdf" => "content of foo.pdf"})
111
- tmail.should have(2).parts
112
- tmail.parts.first.to_s.should == "Content-Type: text/plain\n\n"
113
- tmail.parts.last.to_s.should == <<-PART
114
- Content-Type: application/pdf
115
- Content-Transfer-Encoding: Base64
116
- Content-Disposition: attachment; filename=foo.pdf
117
-
118
- Y29udGVudCBvZiBmb28ucGRm
119
- PART
120
- end
121
- end
122
-
123
- describe "transport" do
124
- it "transports via the sendmail binary if it exists" do
125
- File.stub!(:executable?).and_return(true)
126
- Pony.should_receive(:transport_via_sendmail).with(:tmail)
127
- Pony.transport(:tmail)
128
- end
129
-
130
- it "transports via smtp if no sendmail binary" do
131
- Pony.stub!(:sendmail_binary).and_return('/does/not/exist')
132
- Pony.should_receive(:transport_via_smtp).with(:tmail)
133
- Pony.transport(:tmail)
134
- end
135
-
136
- it "transports mail via /usr/sbin/sendmail binary" do
137
- pipe = mock('sendmail pipe')
138
- IO.should_receive(:popen).with('-',"w+").and_yield(pipe)
139
- pipe.should_receive(:write).with('message')
140
- Pony.transport_via_sendmail(mock('tmail', :to => ['to'], :from => ['from'], :to_s => 'message'))
141
- end
142
-
143
- describe "SMTP transport" do
144
- before do
145
- @smtp = mock('net::smtp object')
146
- @smtp.stub!(:start)
147
- @smtp.stub!(:send_message)
148
- @smtp.stub!(:finish)
149
- Net::SMTP.stub!(:new).and_return(@smtp)
150
- end
151
-
152
- it "passes cc and bcc as the list of recipients" do
153
- @smtp.should_receive(:send_message).with("message", ['from'], ['to', 'cc', 'bcc'])
154
- Pony.transport_via_smtp(mock('tmail', :to => ['to'], :cc => ['cc'], :from => ['from'], :to_s => 'message', :bcc => ['bcc'], :destinations => ['to', 'cc', 'bcc']))
155
- @smtp.should_receive(:send_message).with("message", 'from', ['to', 'cc'])
156
- Pony.transport_via_smtp(mock('tmail', :to => 'to', :cc => 'cc', :from => 'from', :to_s => 'message', :bcc => nil, :destinations => ['to', 'cc']))
157
- end
158
-
159
- it "only pass cc as the list of recipients" do
160
- @smtp.should_receive(:send_message).with("message", ['from'], ['to', 'cc' ])
161
- Pony.transport_via_smtp(mock('tmail', :to => ['to'], :cc => ['cc'], :from => ['from'], :to_s => 'message', :bcc => nil, :destinations => ['to', 'cc']))
162
- end
163
-
164
- it "only pass bcc as the list of recipients" do
165
- @smtp.should_receive(:send_message).with("message", ['from'], ['to', 'bcc' ])
166
- Pony.transport_via_smtp(mock('tmail', :to => ['to'], :cc => nil, :from => ['from'], :to_s => 'message', :bcc => ['bcc'], :destinations => ['to', 'bcc']))
167
- end
168
-
169
- it "passes cc and bcc as the list of recipients when there are a few of them" do
170
- @smtp.should_receive(:send_message).with("message", ['from'], ['to', 'to2', 'cc', 'bcc', 'bcc2', 'bcc3'])
171
- Pony.transport_via_smtp(mock('tmail', :to => ['to', 'to2'], :cc => ['cc'], :from => ['from'], :to_s => 'message', :bcc => ['bcc', 'bcc2', 'bcc3'], :destinations => ['to', 'to2', 'cc', 'bcc', 'bcc2', 'bcc3']))
172
- end
173
-
174
- it "defaults to localhost as the SMTP server" do
175
- Net::SMTP.should_receive(:new).with('localhost', '25').and_return(@smtp)
176
- Pony.transport_via_smtp(mock('tmail', :to => ['to'], :from => ['from'], :to_s => 'message', :cc => nil, :bcc => nil, :destinations => ['to']))
177
- end
178
-
179
- it "uses SMTP authorization when auth key is provided" do
180
- o = { :smtp => { :user => 'user', :password => 'password', :auth => 'plain'}}
181
- @smtp.should_receive(:start).with('localhost.localdomain', 'user', 'password', 'plain')
182
- Pony.transport_via_smtp(mock('tmail', :to => ['to'], :from => ['from'], :to_s => 'message', :cc => nil, :bcc => nil, :destinations => ['to']), o)
183
- end
184
-
185
- it "enable starttls when tls option is true" do
186
- o = { :smtp => { :user => 'user', :password => 'password', :auth => 'plain', :tls => true}}
187
- @smtp.should_receive(:enable_starttls)
188
- Pony.transport_via_smtp(mock('tmail', :to => ['to'], :from => ['from'], :to_s => 'message', :cc => nil, :bcc => nil, :destinations => ['to']), o)
189
- end
190
-
191
- it "starts the job" do
192
- @smtp.should_receive(:start)
193
- Pony.transport_via_smtp(mock('tmail', :to => ['to'], :from => ['from'], :to_s => 'message', :cc => nil, :bcc => nil, :destinations => ['to']))
194
- end
195
-
196
- it "sends a tmail message" do
197
- @smtp.should_receive(:send_message)
198
- Pony.transport_via_smtp(mock('tmail', :to => ['to'], :from => ['from'], :to_s => 'message', :cc => nil, :bcc => nil, :destinations => ['to']))
199
- end
200
-
201
- it "finishes the job" do
202
- @smtp.should_receive(:finish)
203
- Pony.transport_via_smtp(mock('tmail', :to => ['to'], :from => ['from'], :to_s => 'message', :cc => nil, :bcc => nil, :destinations => ['to']))
204
- end
205
-
206
- end
207
- end
208
-
209
- describe ":via option should over-ride the default transport mechanism" do
210
- it "should send via sendmail if :via => sendmail" do
211
- Pony.should_receive(:transport_via_sendmail)
212
- Pony.mail(:to => 'joe@example.com', :via => :sendmail)
213
- end
214
-
215
- it "should send via smtp if :via => smtp" do
216
- Pony.should_receive(:transport_via_smtp)
217
- Pony.mail(:to => 'joe@example.com', :via => :smtp)
218
- end
219
-
220
- it "should raise an error if via is neither smtp nor sendmail" do
221
- lambda { Pony.mail(:to => 'joe@plumber.com', :via => :pigeon) }.should raise_error(ArgumentError)
222
- end
223
- end
224
-
225
- describe "sendmail binary location" do
226
- it "should default to /usr/sbin/sendmail if not in path" do
227
- Pony.stub!(:'`').and_return('')
228
- Pony.sendmail_binary.should == '/usr/sbin/sendmail'
229
- end
230
- end
231
-
232
- end