bjornblomqvist-emailer 0.1.5 → 0.1.6
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/VERSION +1 -1
- data/emailer.gemspec +6 -2
- data/lib/emailer.rb +7 -5
- data/lib/emailer/logger_smtp_facade.rb +37 -4
- data/lib/emailer/smtp_facade.rb +1 -1
- data/lib/emailer/tofile_smtp_facade.rb +221 -0
- data/spec/emailer/logger_smtp_facade_spec.rb +55 -10
- data/spec/emailer/tofile_smtp_facade_spec.rb +68 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +1 -9
- metadata +6 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.6
|
data/emailer.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{emailer}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Erik Hansson", "Bjorn Blomqvist"]
|
12
|
-
s.date = %q{2009-09-
|
12
|
+
s.date = %q{2009-09-21}
|
13
13
|
s.description = %q{}
|
14
14
|
s.email = %q{erik@bits2life.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -31,11 +31,14 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/emailer/mock_smtp_facade.rb",
|
32
32
|
"lib/emailer/smtp_facade.rb",
|
33
33
|
"lib/emailer/string_utilities.rb",
|
34
|
+
"lib/emailer/tofile_smtp_facade.rb",
|
34
35
|
"spec/emailer/authsmtp_facade_spec.rb",
|
35
36
|
"spec/emailer/logger_smtp_facade_spec.rb",
|
36
37
|
"spec/emailer/mail_queue_spec.rb",
|
37
38
|
"spec/emailer/mock_smtp_facade_spec.rb",
|
38
39
|
"spec/emailer/smtp_facade_spec.rb",
|
40
|
+
"spec/emailer/tofile_smtp_facade_spec.rb",
|
41
|
+
"spec/spec.opts",
|
39
42
|
"spec/spec_helper.rb"
|
40
43
|
]
|
41
44
|
s.has_rdoc = true
|
@@ -50,6 +53,7 @@ Gem::Specification.new do |s|
|
|
50
53
|
"spec/emailer/mail_queue_spec.rb",
|
51
54
|
"spec/emailer/mock_smtp_facade_spec.rb",
|
52
55
|
"spec/emailer/smtp_facade_spec.rb",
|
56
|
+
"spec/emailer/tofile_smtp_facade_spec.rb",
|
53
57
|
"spec/spec_helper.rb"
|
54
58
|
]
|
55
59
|
|
data/lib/emailer.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
|
2
|
-
require 'emailer/smtp_facade'
|
3
|
-
require 'emailer/authsmtp_facade'
|
4
|
-
require 'emailer/mail_queue'
|
5
|
-
require 'emailer/string_utilities'
|
6
|
-
require 'emailer/mock_smtp_facade
|
2
|
+
require File.join File.dirname(__FILE__), 'emailer/smtp_facade'
|
3
|
+
require File.join File.dirname(__FILE__), 'emailer/authsmtp_facade'
|
4
|
+
require File.join File.dirname(__FILE__), 'emailer/mail_queue'
|
5
|
+
require File.join File.dirname(__FILE__), 'emailer/string_utilities'
|
6
|
+
require File.join File.dirname(__FILE__), 'emailer/mock_smtp_facade'
|
7
|
+
require File.join File.dirname(__FILE__), 'emailer/logger_smtp_facade'
|
8
|
+
require File.join File.dirname(__FILE__), 'emailer/tofile_smtp_facade'
|
@@ -1,12 +1,45 @@
|
|
1
1
|
module Emailer
|
2
|
-
|
2
|
+
|
3
3
|
class LoggerSmtpFacade < MockSmtpFacade
|
4
|
-
|
4
|
+
|
5
|
+
def initialize(settings = {})
|
6
|
+
@logger_settings = settings.clone
|
7
|
+
@logger_settings.keys.each do |key|
|
8
|
+
raise ArgumentError.new("invalid option, {"+key.to_s+" => "+@logger_settings[key].to_s+"}") unless
|
9
|
+
[:log_file, :use].include? key
|
10
|
+
end
|
11
|
+
raise ArgumentError.new(":log_file location is missing") unless @logger_settings[:log_file]
|
12
|
+
settings.clear
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def open
|
17
|
+
if @logger_settings[:use]
|
18
|
+
@logger_settings[:use].open do
|
19
|
+
super
|
20
|
+
end
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
5
26
|
# And save, don't send, write to a singel file
|
6
27
|
def send_mail(options)
|
7
|
-
super
|
28
|
+
super
|
8
29
|
|
30
|
+
@logger_settings[:use].send_mail options if @logger_settings[:use]
|
31
|
+
|
32
|
+
File.open(@logger_settings[:log_file],File::WRONLY|File::APPEND|File::CREAT) do |f|
|
33
|
+
|
34
|
+
f.print "email.add {\n"
|
35
|
+
options.each do |option|
|
36
|
+
f.print "\t:"+option.first.to_s+" => \""+option.last.to_s+"\"\n" unless option.first == :body
|
37
|
+
end
|
38
|
+
f.print "\t:sent_at => \""+Time.now.to_s+"\"\n"
|
39
|
+
f.print "\t:body => \""+options[:body].to_s+"\"\n"
|
40
|
+
f.print "}\n"
|
41
|
+
end
|
9
42
|
end
|
10
|
-
|
43
|
+
|
11
44
|
end
|
12
45
|
end
|
data/lib/emailer/smtp_facade.rb
CHANGED
@@ -15,7 +15,7 @@ module Emailer
|
|
15
15
|
def initialize(settings)
|
16
16
|
@settings = settings
|
17
17
|
@settings.keys.each do |key|
|
18
|
-
raise ArgumentError unless [
|
18
|
+
raise ArgumentError.new("invalid option, {"+key.to_s+" => "+@settings[key].to_s+"}") unless [
|
19
19
|
:host, :port, :username, :password, :authentication, :domain
|
20
20
|
].include?(key)
|
21
21
|
end
|
@@ -0,0 +1,221 @@
|
|
1
|
+
module Emailer
|
2
|
+
|
3
|
+
class ToFileSmtpFacade < MockSmtpFacade
|
4
|
+
|
5
|
+
def initialize(settings = {})
|
6
|
+
@tofile_settings = settings.clone
|
7
|
+
@tofile_settings.keys.each do |key|
|
8
|
+
raise ArgumentError.new("invalid option, {"+key.to_s+" => "+@tofile_settings[key].to_s+"}") unless
|
9
|
+
[:file_dir, :use].include? key
|
10
|
+
end
|
11
|
+
raise ArgumentError.new(":log_file location is missing") unless @tofile_settings[:file_dir]
|
12
|
+
settings.clear
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def open
|
17
|
+
if(@tofile_settings[:use])
|
18
|
+
@tofile_settings[:use].open do
|
19
|
+
super
|
20
|
+
end
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def send_mail options
|
27
|
+
super
|
28
|
+
|
29
|
+
@tofile_settings[:use].send_mail options if @tofile_settings[:use]
|
30
|
+
|
31
|
+
options = options.clone
|
32
|
+
|
33
|
+
options[:sent_at] = Time.now.to_s
|
34
|
+
|
35
|
+
Dir.mkdir @tofile_settings[:file_dir] unless File.exist? @tofile_settings[:file_dir]
|
36
|
+
|
37
|
+
file = @tofile_settings[:file_dir]+"/"+"sent_at("+(options[:sent_at].gsub(" ","_"))+").to("+options[:to]+")"+".from("+options[:from]+").html"
|
38
|
+
body_file = "sent_at("+(options[:sent_at].gsub(" ","_"))+").to("+options[:to]+")"+".from("+options[:from]+")_body.html"
|
39
|
+
latest_file = @tofile_settings[:file_dir]+"/"+"latest.html"
|
40
|
+
|
41
|
+
head = ""
|
42
|
+
body = options[:body]
|
43
|
+
|
44
|
+
options.each do |option|
|
45
|
+
head += "<div class=\"label\">"+option.first.to_s.capitalize.gsub("_"," ")+":</div><div class=\"value\">"+option.last.to_s+"</div>\n" unless option.first == :body
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
if body.downcase.include? "<html>"
|
51
|
+
body = %&<iframe src="#{body_file}"></iframe>&
|
52
|
+
|
53
|
+
File.open(@tofile_settings[:file_dir]+"/"+body_file,File::WRONLY|File::CREAT) do |file|
|
54
|
+
file.print options[:body]
|
55
|
+
end
|
56
|
+
else
|
57
|
+
body = "<pre>"+body+"</pre>"
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
toWrite = <<ANEWHTML
|
62
|
+
<html>
|
63
|
+
<head>
|
64
|
+
<title>#{options[:subject]}</title>
|
65
|
+
<style type="text/css">
|
66
|
+
div.label {
|
67
|
+
clear: left;
|
68
|
+
float: left;
|
69
|
+
width: 80px;
|
70
|
+
}
|
71
|
+
|
72
|
+
div.value {
|
73
|
+
float: left;
|
74
|
+
}
|
75
|
+
|
76
|
+
div.head {
|
77
|
+
background-color: #aaa;
|
78
|
+
border-bottom: solid 1px;
|
79
|
+
float: left;
|
80
|
+
width: 100%;
|
81
|
+
}
|
82
|
+
|
83
|
+
div.head_inner {
|
84
|
+
float: left;
|
85
|
+
padding: 15px;
|
86
|
+
}
|
87
|
+
|
88
|
+
div.head_back {
|
89
|
+
float: left;
|
90
|
+
}
|
91
|
+
|
92
|
+
|
93
|
+
body {
|
94
|
+
padding: 0px;
|
95
|
+
margin: 0px;
|
96
|
+
}
|
97
|
+
|
98
|
+
div.body {
|
99
|
+
float: left;
|
100
|
+
width: 100%;
|
101
|
+
padding: 0px;
|
102
|
+
margin: 0px;
|
103
|
+
}
|
104
|
+
|
105
|
+
iframe {
|
106
|
+
width: 100%;
|
107
|
+
height: 100%;
|
108
|
+
border: none;
|
109
|
+
padding: 0px;
|
110
|
+
margin: 0px;
|
111
|
+
}
|
112
|
+
</style>
|
113
|
+
</head>
|
114
|
+
<body>
|
115
|
+
<div class="head">
|
116
|
+
<div class="head_inner">
|
117
|
+
#{head}
|
118
|
+
</div>
|
119
|
+
<div class="head_back">
|
120
|
+
<a href="index.html"><h1>Back >></h1></a>
|
121
|
+
</div>
|
122
|
+
</div>
|
123
|
+
<div class="body">
|
124
|
+
#{body}
|
125
|
+
</div>
|
126
|
+
</body>
|
127
|
+
</html>
|
128
|
+
ANEWHTML
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
File.open(file,File::WRONLY|File::CREAT) do |f|
|
133
|
+
f.print toWrite
|
134
|
+
end
|
135
|
+
|
136
|
+
File.unlink latest_file if File.exists? latest_file
|
137
|
+
File.symlink file,latest_file
|
138
|
+
|
139
|
+
createIndex
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
def createIndex
|
144
|
+
|
145
|
+
index = @tofile_settings[:file_dir]+"/index.html"
|
146
|
+
|
147
|
+
File.open(index,File::WRONLY|File::CREAT) do |f|
|
148
|
+
|
149
|
+
links = ""
|
150
|
+
|
151
|
+
counter = 0
|
152
|
+
|
153
|
+
Dir.open(@tofile_settings[:file_dir]).sort.each do |fileName|
|
154
|
+
if(fileName.index("sent_at") == 0 && fileName.index("_body") == nil)
|
155
|
+
counter += 1
|
156
|
+
links = %&<div class="number">#{counter}</div><div class="link #{counter % 2 == 0 ? "evan" : "odd"}"><a href="#{fileName}">#{fileName}</a></div>\n& + links
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
f.print <<HTML
|
161
|
+
|
162
|
+
<html>
|
163
|
+
<head>
|
164
|
+
<title></title>
|
165
|
+
<style type="text/css">
|
166
|
+
body {
|
167
|
+
padding: 10px;
|
168
|
+
margin: 0px;
|
169
|
+
width: 900px;
|
170
|
+
margin: auto;
|
171
|
+
}
|
172
|
+
|
173
|
+
div.number {
|
174
|
+
float: left;
|
175
|
+
clear: both;
|
176
|
+
padding: 5px 10px;
|
177
|
+
background-color: #aaa;
|
178
|
+
border-right: solid 1px;
|
179
|
+
width: 30px;
|
180
|
+
}
|
181
|
+
|
182
|
+
div.link {
|
183
|
+
padding: 5px 10px;
|
184
|
+
float: left;
|
185
|
+
width: 800px;
|
186
|
+
}
|
187
|
+
|
188
|
+
a {
|
189
|
+
color: black;
|
190
|
+
}
|
191
|
+
|
192
|
+
a:hover {
|
193
|
+
text-decoration: none;
|
194
|
+
}
|
195
|
+
|
196
|
+
div.evan {
|
197
|
+
background-color: #dddddd;
|
198
|
+
}
|
199
|
+
|
200
|
+
div.evan {
|
201
|
+
background-color: #e5e5e5;
|
202
|
+
}
|
203
|
+
|
204
|
+
div.link:hover {
|
205
|
+
background-color: yellow;
|
206
|
+
}
|
207
|
+
|
208
|
+
</style>
|
209
|
+
</head>
|
210
|
+
<body>
|
211
|
+
#{links}
|
212
|
+
</body>
|
213
|
+
</html>
|
214
|
+
|
215
|
+
HTML
|
216
|
+
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
end
|
221
|
+
end
|
@@ -1,16 +1,19 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "../spec_helper")
|
2
|
+
|
1
3
|
module Emailer
|
2
|
-
|
3
|
-
LOGGER_OPTIONS = {
|
4
|
-
:temp_dir => 'smtp.host.com',
|
5
|
-
:use => MockSmtpFacade.new
|
6
|
-
}
|
7
|
-
|
8
4
|
describe LoggerSmtpFacade do
|
5
|
+
|
6
|
+
LOGGER_OPTIONS = {
|
7
|
+
:log_file => '/tmp/emailLog.txt',
|
8
|
+
:use => MockSmtpFacade.new
|
9
|
+
}
|
10
|
+
|
11
|
+
TEST_LOG_FILE = '/tmp/test_emailLog.txt'
|
9
12
|
|
10
13
|
describe :initialize do
|
11
14
|
it "should accept only known options" do
|
12
15
|
lambda do
|
13
|
-
LoggerSmtpFacade.new :foobar => 'fail'
|
16
|
+
LoggerSmtpFacade.new(:log_file => '/tmp/emailLog.txt', :foobar => 'fail')
|
14
17
|
end.should raise_error
|
15
18
|
end
|
16
19
|
|
@@ -21,11 +24,53 @@ module Emailer
|
|
21
24
|
it "should demand temp_dir option" do
|
22
25
|
lambda do
|
23
26
|
LoggerSmtpFacade.new
|
24
|
-
end.
|
27
|
+
end.should raise_error
|
25
28
|
end
|
26
29
|
end
|
27
|
-
|
28
|
-
|
30
|
+
|
31
|
+
describe :send_mail do
|
32
|
+
|
33
|
+
before(:each) do
|
34
|
+
File.unlink(TEST_LOG_FILE) if File.exist?(TEST_LOG_FILE)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should write the email to the log file" do
|
38
|
+
|
39
|
+
smtp = LoggerSmtpFacade.new :log_file => TEST_LOG_FILE
|
40
|
+
|
41
|
+
smtp.open do
|
42
|
+
smtp.send_mail(
|
43
|
+
:to => "test@bits2life.com",
|
44
|
+
:from => "test2@bits2life.com",
|
45
|
+
:subject => "This is a test 3",
|
46
|
+
:body => "Blabla"
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
((File.read(TEST_LOG_FILE,File::RDONLY|File::CREAT).to_s+"").include? "This is a test 3").should == true
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should log and pass the email on to the supplied SmtpFacade" do
|
54
|
+
|
55
|
+
mock = MockSmtpFacade.new
|
56
|
+
smtp = LoggerSmtpFacade.new :log_file => TEST_LOG_FILE, :use => mock
|
57
|
+
|
58
|
+
email = {
|
59
|
+
:to => "test@bits2life.com",
|
60
|
+
:from => "test2@bits2life.com",
|
61
|
+
:subject => "This is a test 4",
|
62
|
+
:body => "Test body"
|
63
|
+
}
|
64
|
+
|
65
|
+
smtp.open do
|
66
|
+
smtp.send_mail email
|
67
|
+
end
|
68
|
+
|
69
|
+
mock.sent.first.should == email
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
29
74
|
# Should be able to wrap another smtp facade
|
30
75
|
# Should have temp directory configurable
|
31
76
|
# Should be abel to log to one file
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "../spec_helper")
|
2
|
+
|
3
|
+
module Emailer
|
4
|
+
describe ToFileSmtpFacade do
|
5
|
+
|
6
|
+
FILE_DIR = '/tmp/emails/'
|
7
|
+
|
8
|
+
TOFILE_OPTIONS = {
|
9
|
+
:file_dir => FILE_DIR,
|
10
|
+
:use => nil
|
11
|
+
}
|
12
|
+
|
13
|
+
describe :init do
|
14
|
+
it 'Should accept all valid options' do
|
15
|
+
ToFileSmtpFacade.new TOFILE_OPTIONS
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'Should only accept valid options' do
|
19
|
+
lambda do
|
20
|
+
ToFileSmtpFacade.new :file_dir => FILE_DIR, :foo => 'foo'
|
21
|
+
end.should raise_error
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'Should demand that :file_dir option is supplied' do
|
25
|
+
lambda do
|
26
|
+
ToFileSmtpFacade.new
|
27
|
+
end.should raise_error
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe :send_mail do
|
32
|
+
it 'Should create a new file with the name of from and to addresses' do
|
33
|
+
smtp = ToFileSmtpFacade.new :file_dir => FILE_DIR
|
34
|
+
smtp.open do
|
35
|
+
smtp.send_mail(
|
36
|
+
:to => 'test@bits2life.com',
|
37
|
+
:from => 'test2@bits2life.com',
|
38
|
+
:subject => 'a test subject',
|
39
|
+
:body => 'A test message'
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
found = false
|
44
|
+
Dir.entries(FILE_DIR).each do |entry|
|
45
|
+
found = true if entry.include? 'test@bits2life.com'
|
46
|
+
end
|
47
|
+
|
48
|
+
found.should == true
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'Should send an email using the supplied facade' do
|
52
|
+
mockSmtp = MockSmtpFacade.new
|
53
|
+
smtp = ToFileSmtpFacade.new :file_dir => FILE_DIR, :use => mockSmtp
|
54
|
+
smtp.open do
|
55
|
+
smtp.send_mail(
|
56
|
+
:to => "emma@bits2life.com",
|
57
|
+
:from => "bjorn@bits2life.com",
|
58
|
+
:subject => 'A test email to emma',
|
59
|
+
:body => '<html><head></head><body><h1>This is a test</h1></body></html>'
|
60
|
+
)
|
61
|
+
end
|
62
|
+
|
63
|
+
mockSmtp.sent.count.should == 1
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,3 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
-
|
4
|
-
require 'emailer'
|
5
|
-
require 'emailer/mock_smtp_facade'
|
6
1
|
require 'spec'
|
7
2
|
require 'spec/autorun'
|
8
|
-
|
9
|
-
Spec::Runner.configure do |config|
|
10
|
-
|
11
|
-
end
|
3
|
+
require File.join(File.dirname(__FILE__), '../lib/emailer')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bjornblomqvist-emailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erik Hansson
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-09-
|
13
|
+
date: 2009-09-21 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -57,11 +57,14 @@ files:
|
|
57
57
|
- lib/emailer/mock_smtp_facade.rb
|
58
58
|
- lib/emailer/smtp_facade.rb
|
59
59
|
- lib/emailer/string_utilities.rb
|
60
|
+
- lib/emailer/tofile_smtp_facade.rb
|
60
61
|
- spec/emailer/authsmtp_facade_spec.rb
|
61
62
|
- spec/emailer/logger_smtp_facade_spec.rb
|
62
63
|
- spec/emailer/mail_queue_spec.rb
|
63
64
|
- spec/emailer/mock_smtp_facade_spec.rb
|
64
65
|
- spec/emailer/smtp_facade_spec.rb
|
66
|
+
- spec/emailer/tofile_smtp_facade_spec.rb
|
67
|
+
- spec/spec.opts
|
65
68
|
- spec/spec_helper.rb
|
66
69
|
has_rdoc: true
|
67
70
|
homepage: http://github.com/erikhansson/emailer
|
@@ -96,4 +99,5 @@ test_files:
|
|
96
99
|
- spec/emailer/mail_queue_spec.rb
|
97
100
|
- spec/emailer/mock_smtp_facade_spec.rb
|
98
101
|
- spec/emailer/smtp_facade_spec.rb
|
102
|
+
- spec/emailer/tofile_smtp_facade_spec.rb
|
99
103
|
- spec/spec_helper.rb
|