letter_opener 1.0.0 → 1.1.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/CHANGELOG.md +16 -9
- data/README.rdoc +18 -0
- data/lib/letter_opener/delivery_method.rb +1 -1
- data/lib/letter_opener/message.html.erb +12 -2
- data/lib/letter_opener/message.rb +6 -0
- data/spec/letter_opener/delivery_method_spec.rb +31 -10
- data/spec/letter_opener/message_spec.rb +12 -0
- metadata +14 -11
data/CHANGELOG.md
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
1
|
+
## 1.1.0 ##
|
|
2
|
+
|
|
3
|
+
* Update Launchy dependency to `~> 2.2.0` (thanks [webdevotion](https://github.com/webdevotion))
|
|
4
|
+
* Handle `sender` field (thanks [sjtipton](https://github.com/sjtipton))
|
|
5
|
+
* Show subject only if it's present (thanks [jadehyper](https://github.com/jadehyper))
|
|
6
|
+
* Show subject as title of web page (thanks [statique](https://github.com/statique))
|
|
7
|
+
|
|
1
8
|
## 1.0.0 ##
|
|
2
9
|
|
|
3
|
-
* Attachment Support (thanks David Cornu)
|
|
10
|
+
* Attachment Support (thanks [David Cornu](https://github.com/davidcornu))
|
|
4
11
|
* Escape HTML in subject and other fields
|
|
5
12
|
* Raise an exception if the :location option is not present instead of using a default
|
|
6
|
-
* Open rich version by default (thanks Damir)
|
|
7
|
-
* Override margin on dt and dd elements in CSS (thanks Edgars Beigarts)
|
|
8
|
-
* Autolink URLs in plain version (thanks Matt Burke)
|
|
13
|
+
* Open rich version by default (thanks [Damir](https://github.com/sidonath))
|
|
14
|
+
* Override margin on dt and dd elements in CSS (thanks [Edgars Beigarts](https://github.com/ebeigarts))
|
|
15
|
+
* Autolink URLs in plain version (thanks [Matt Burke](https://github.com/spraints))
|
|
9
16
|
|
|
10
17
|
## 0.1.0 ##
|
|
11
18
|
|
|
12
19
|
* From and To show name and Email when specified
|
|
13
20
|
* Fix bug when letter_opener couldn't open email in Windows
|
|
14
|
-
* Handle spaces in the application path (thanks Mike Boone)
|
|
15
|
-
* As letter_opener doesn't work with Launchy < 2.0.4 let's depend on >= 2.0.4 (thanks Samnang Chhun)
|
|
16
|
-
* Handle `reply_to` field (thanks Wes Gibbs)
|
|
17
|
-
* Set the charset in email preview (thanks Bruno Michel)
|
|
21
|
+
* Handle spaces in the application path (thanks [Mike Boone](https://github.com/boone))
|
|
22
|
+
* As letter_opener doesn't work with Launchy < 2.0.4 let's depend on >= 2.0.4 (thanks [Samnang Chhun](https://github.com/samnang))
|
|
23
|
+
* Handle `reply_to` field (thanks [Wes Gibbs](https://github.com/wgibbs))
|
|
24
|
+
* Set the charset in email preview (thanks [Bruno Michel](https://github.com/nono))
|
|
18
25
|
|
|
19
26
|
## 0.0.2 ##
|
|
20
27
|
|
|
21
|
-
* Fixing launchy requirement (thanks Bruno Michel)
|
|
28
|
+
* Fixing launchy requirement (thanks [Bruno Michel](https://github.com/nono))
|
|
22
29
|
|
|
23
30
|
## 0.0.1 ##
|
|
24
31
|
|
data/README.rdoc
CHANGED
|
@@ -15,6 +15,9 @@ Then set the delivery method in <tt>config/environments/development.rb</tt>
|
|
|
15
15
|
|
|
16
16
|
Now any email will pop up in your browser instead of being sent. The messages are stored in <tt>tmp/letter_opener</tt>.
|
|
17
17
|
|
|
18
|
+
==== For Rails 2.3.x support
|
|
19
|
+
|
|
20
|
+
There is a fork that add support for Rails 2.3.x, in order to use that or just check it out you should go to https://github.com/cavi21/letter_opener
|
|
18
21
|
|
|
19
22
|
== Non Rails Setup
|
|
20
23
|
|
|
@@ -25,6 +28,14 @@ If you aren't using Rails, this can be easily set up with the Mail gem. Just set
|
|
|
25
28
|
delivery_method LetterOpener::DeliveryMethod, :location => File.expand_path('../tmp/letter_opener', __FILE__)
|
|
26
29
|
end
|
|
27
30
|
|
|
31
|
+
The method is similar if you're using the Pony gem:
|
|
32
|
+
|
|
33
|
+
require "letter_opener"
|
|
34
|
+
Pony.options = {
|
|
35
|
+
:via => LetterOpener::DeliveryMethod,
|
|
36
|
+
:via_options => {:location => File.expand_path('../tmp/letter_opener', __FILE__)}
|
|
37
|
+
}
|
|
38
|
+
|
|
28
39
|
Alternatively, if you are using ActionMailer directly (without Rails) you will need to add the delivery method.
|
|
29
40
|
|
|
30
41
|
require "letter_opener"
|
|
@@ -32,6 +43,13 @@ Alternatively, if you are using ActionMailer directly (without Rails) you will n
|
|
|
32
43
|
ActionMailer::Base.delivery_method = :letter_opener
|
|
33
44
|
|
|
34
45
|
|
|
46
|
+
== Remote Alternatives
|
|
47
|
+
|
|
48
|
+
Letter Opener uses {Launchy}[https://github.com/copiousfreetime/launchy] to open sent mail in the browser. This assumes the Ruby process is running on the local development machine. If you are using a separate staging server or VM this will not work. In that case consider using {Mailtrap}[http://mailtrap.io/] or {MailCatcher}[http://mailcatcher.me/].
|
|
49
|
+
|
|
50
|
+
In order to keep this project simple, I don't have plans to turn it into a Rails engine with an interface for browsing the sent mail but there is a work in progress gem being developed at https://github.com/fgrehm/letter_opener_web
|
|
51
|
+
|
|
52
|
+
|
|
35
53
|
== Development & Feedback
|
|
36
54
|
|
|
37
55
|
Questions or problems? Please use the {issue tracker}[https://github.com/ryanb/letter_opener/issues]. If you would like to contribute to this project, fork this repository and run +bundle+ and +rake+ to run the tests. Pull requests appreciated.
|
|
@@ -12,7 +12,7 @@ module LetterOpener
|
|
|
12
12
|
def deliver!(mail)
|
|
13
13
|
location = File.join(settings[:location], "#{Time.now.to_i}_#{Digest::SHA1.hexdigest(mail.encoded)[0..6]}")
|
|
14
14
|
messages = Message.rendered_messages(location, mail)
|
|
15
|
-
Launchy.open(URI.
|
|
15
|
+
Launchy.open(URI.escape(messages.first.filepath))
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
end
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
<meta http-equiv="Content-Type" content="text/html; charset=<%= encoding %>">
|
|
2
|
+
<% if mail.subject %>
|
|
3
|
+
<title><%= h mail.subject %></title>
|
|
4
|
+
<% end %>
|
|
2
5
|
|
|
3
6
|
<style type="text/css">
|
|
4
7
|
#message_headers {
|
|
@@ -53,13 +56,20 @@
|
|
|
53
56
|
<dt>From:</dt>
|
|
54
57
|
<dd><%= h from %></dd>
|
|
55
58
|
|
|
59
|
+
<% unless sender.empty? %>
|
|
60
|
+
<dt>Sender:</dt>
|
|
61
|
+
<dd><%= h sender %></dd>
|
|
62
|
+
<% end %>
|
|
63
|
+
|
|
56
64
|
<% unless reply_to.empty? %>
|
|
57
65
|
<dt>Reply-To:</dt>
|
|
58
66
|
<dd><%= h reply_to %></dd>
|
|
59
67
|
<% end %>
|
|
60
68
|
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
<% if mail.subject %>
|
|
70
|
+
<dt>Subject:</dt>
|
|
71
|
+
<dd><strong><%= h mail.subject %></strong></dd>
|
|
72
|
+
<% end %>
|
|
63
73
|
|
|
64
74
|
<dt>Date:</dt>
|
|
65
75
|
<dd><%= Time.now.strftime("%b %e, %Y %I:%M:%S %p %Z") %></dd>
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require "erb"
|
|
2
|
+
|
|
1
3
|
module LetterOpener
|
|
2
4
|
class Message
|
|
3
5
|
attr_reader :mail
|
|
@@ -68,6 +70,10 @@ module LetterOpener
|
|
|
68
70
|
@from ||= Array(@mail.from).join(", ")
|
|
69
71
|
end
|
|
70
72
|
|
|
73
|
+
def sender
|
|
74
|
+
@sender ||= Array(@mail.sender).join(", ")
|
|
75
|
+
end
|
|
76
|
+
|
|
71
77
|
def to
|
|
72
78
|
@to ||= Array(@mail.to).join(", ")
|
|
73
79
|
end
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
require "spec_helper"
|
|
2
2
|
|
|
3
3
|
describe LetterOpener::DeliveryMethod do
|
|
4
|
-
let(:location)
|
|
4
|
+
let(:location) { File.expand_path('../../../tmp/letter_opener', __FILE__) }
|
|
5
|
+
|
|
6
|
+
let(:plain_file) { Dir["#{location}/*/plain.html"].first }
|
|
7
|
+
let(:plain) { File.read(plain_file) }
|
|
5
8
|
|
|
6
9
|
before do
|
|
7
10
|
Launchy.stub(:open)
|
|
@@ -19,15 +22,13 @@ describe LetterOpener::DeliveryMethod do
|
|
|
19
22
|
end
|
|
20
23
|
|
|
21
24
|
context 'content' do
|
|
22
|
-
let(:plain_file) { Dir["#{location}/*/plain.html"].first }
|
|
23
|
-
let(:plain) { File.read(plain_file) }
|
|
24
|
-
|
|
25
25
|
context 'plain' do
|
|
26
26
|
before do
|
|
27
27
|
Launchy.should_receive(:open)
|
|
28
28
|
|
|
29
29
|
Mail.deliver do
|
|
30
30
|
from 'Foo foo@example.com'
|
|
31
|
+
sender 'Baz baz@example.com'
|
|
31
32
|
reply_to 'No Reply no-reply@example.com'
|
|
32
33
|
to 'Bar bar@example.com'
|
|
33
34
|
subject 'Hello'
|
|
@@ -43,6 +44,10 @@ describe LetterOpener::DeliveryMethod do
|
|
|
43
44
|
plain.should include("Foo foo@example.com")
|
|
44
45
|
end
|
|
45
46
|
|
|
47
|
+
it 'saves Sender field' do
|
|
48
|
+
plain.should include("Baz baz@example.com")
|
|
49
|
+
end
|
|
50
|
+
|
|
46
51
|
it 'saves Reply-to field' do
|
|
47
52
|
plain.should include("No Reply no-reply@example.com")
|
|
48
53
|
end
|
|
@@ -104,13 +109,15 @@ describe LetterOpener::DeliveryMethod do
|
|
|
104
109
|
it 'saves escaped Subject field' do
|
|
105
110
|
plain.should include("Many parts with <html>")
|
|
106
111
|
end
|
|
112
|
+
|
|
113
|
+
it 'shows subject as title' do
|
|
114
|
+
rich.should include("<title>Many parts with <html></title>")
|
|
115
|
+
end
|
|
107
116
|
end
|
|
108
117
|
end
|
|
109
118
|
|
|
110
119
|
context 'document with spaces in name' do
|
|
111
120
|
let(:location) { File.expand_path('../../../tmp/letter_opener with space', __FILE__) }
|
|
112
|
-
let(:file) { Dir["#{location}/*/plain.html"].first }
|
|
113
|
-
let(:plain) { File.read(file) }
|
|
114
121
|
|
|
115
122
|
before do
|
|
116
123
|
Launchy.should_receive(:open)
|
|
@@ -124,7 +131,7 @@ describe LetterOpener::DeliveryMethod do
|
|
|
124
131
|
end
|
|
125
132
|
|
|
126
133
|
it 'creates plain html document' do
|
|
127
|
-
File.exist?(
|
|
134
|
+
File.exist?(plain_file)
|
|
128
135
|
end
|
|
129
136
|
|
|
130
137
|
it 'saves From filed' do
|
|
@@ -133,9 +140,6 @@ describe LetterOpener::DeliveryMethod do
|
|
|
133
140
|
end
|
|
134
141
|
|
|
135
142
|
context 'using deliver! method' do
|
|
136
|
-
let(:plain_file) { Dir["#{location}/*/plain.html"].first }
|
|
137
|
-
let(:plain) { File.read(plain_file) }
|
|
138
|
-
|
|
139
143
|
before do
|
|
140
144
|
Launchy.should_receive(:open)
|
|
141
145
|
Mail.new do
|
|
@@ -220,4 +224,21 @@ describe LetterOpener::DeliveryMethod do
|
|
|
220
224
|
text.should include("attachments/#{File.basename(__FILE__)}")
|
|
221
225
|
end
|
|
222
226
|
end
|
|
227
|
+
|
|
228
|
+
context 'subjectless mail' do
|
|
229
|
+
before do
|
|
230
|
+
Launchy.should_receive(:open)
|
|
231
|
+
|
|
232
|
+
Mail.deliver do
|
|
233
|
+
from 'Foo foo@example.com'
|
|
234
|
+
reply_to 'No Reply no-reply@example.com'
|
|
235
|
+
to 'Bar bar@example.com'
|
|
236
|
+
body 'World! http://example.com'
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it 'creates plain html document' do
|
|
241
|
+
File.exist?(plain_file).should be_true
|
|
242
|
+
end
|
|
243
|
+
end
|
|
223
244
|
end
|
|
@@ -27,6 +27,18 @@ describe LetterOpener::Message do
|
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
describe '#sender' do
|
|
31
|
+
it 'handles one email as a string' do
|
|
32
|
+
message = described_class.new(location, mock(sender: 'sender@example.com'))
|
|
33
|
+
message.sender.should eq('sender@example.com')
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'handles array of emails' do
|
|
37
|
+
message = described_class.new(location, mock(sender: ['sender1@example.com', 'sender2@example.com']))
|
|
38
|
+
message.sender.should eq('sender1@example.com, sender2@example.com')
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
30
42
|
describe '#<=>' do
|
|
31
43
|
it 'sorts rich type before plain type' do
|
|
32
44
|
plain = described_class.new(location, mock(content_type: 'text/plain'))
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: letter_opener
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,24 +9,24 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2013-02-08 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: launchy
|
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
|
-
- -
|
|
19
|
+
- - ~>
|
|
20
20
|
- !ruby/object:Gem::Version
|
|
21
|
-
version: 2.0
|
|
21
|
+
version: 2.2.0
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
25
|
none: false
|
|
26
26
|
requirements:
|
|
27
|
-
- -
|
|
27
|
+
- - ~>
|
|
28
28
|
- !ruby/object:Gem::Version
|
|
29
|
-
version: 2.0
|
|
29
|
+
version: 2.2.0
|
|
30
30
|
- !ruby/object:Gem::Dependency
|
|
31
31
|
name: rspec
|
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -34,7 +34,7 @@ dependencies:
|
|
|
34
34
|
requirements:
|
|
35
35
|
- - ~>
|
|
36
36
|
- !ruby/object:Gem::Version
|
|
37
|
-
version: 2.
|
|
37
|
+
version: 2.12.0
|
|
38
38
|
type: :development
|
|
39
39
|
prerelease: false
|
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -42,7 +42,7 @@ dependencies:
|
|
|
42
42
|
requirements:
|
|
43
43
|
- - ~>
|
|
44
44
|
- !ruby/object:Gem::Version
|
|
45
|
-
version: 2.
|
|
45
|
+
version: 2.12.0
|
|
46
46
|
- !ruby/object:Gem::Dependency
|
|
47
47
|
name: mail
|
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -50,7 +50,7 @@ dependencies:
|
|
|
50
50
|
requirements:
|
|
51
51
|
- - ~>
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: 2.
|
|
53
|
+
version: 2.5.0
|
|
54
54
|
type: :development
|
|
55
55
|
prerelease: false
|
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -58,7 +58,7 @@ dependencies:
|
|
|
58
58
|
requirements:
|
|
59
59
|
- - ~>
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 2.
|
|
61
|
+
version: 2.5.0
|
|
62
62
|
description: When mail is sent from your application, Letter Opener will open a preview
|
|
63
63
|
in the browser instead of sending.
|
|
64
64
|
email: ryan@railscasts.com
|
|
@@ -91,6 +91,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
91
91
|
- - ! '>='
|
|
92
92
|
- !ruby/object:Gem::Version
|
|
93
93
|
version: '0'
|
|
94
|
+
segments:
|
|
95
|
+
- 0
|
|
96
|
+
hash: 4310965530759568709
|
|
94
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
98
|
none: false
|
|
96
99
|
requirements:
|
|
@@ -99,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
99
102
|
version: 1.3.4
|
|
100
103
|
requirements: []
|
|
101
104
|
rubyforge_project: letter_opener
|
|
102
|
-
rubygems_version: 1.8.
|
|
105
|
+
rubygems_version: 1.8.24
|
|
103
106
|
signing_key:
|
|
104
107
|
specification_version: 3
|
|
105
108
|
summary: Preview mail in browser instead of sending.
|