mailthis 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.log
3
+ *.rbc
4
+ .rbx/
5
+ .bundle
6
+ .config
7
+ .yardoc
8
+ Gemfile.lock
9
+ InstalledFiles
10
+ _yardoc
11
+ coverage
12
+ doc/
13
+ lib/bundler/man
14
+ pkg
15
+ rdoc
16
+ spec/reports
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
20
+
21
+ test/unit/private_*
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rake'
6
+ gem 'pry'
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2009-Present Kelly Redding
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # Mailthis
2
+
3
+ ## Description
4
+
5
+ Configure and send email using Mail (https://github.com/mikel/mail) over Net:SMTP.
6
+
7
+ ## Usage
8
+
9
+ ### A basic example
10
+
11
+ ```ruby
12
+ require 'mailthis'
13
+
14
+ GMAIL = Mailthis.mailer do
15
+ smtp_helo "example.com"
16
+ smtp_server "smtp.gmail.com"
17
+ smtp_port 587
18
+ smtp_user "test@example.com"
19
+ smtp_pw 'secret'
20
+ end
21
+
22
+ GMAIL.deliver do
23
+ subject 'a message for you'
24
+ to 'you@example.com'
25
+ body 'here is a message for you'
26
+ end
27
+ ```
28
+
29
+ ### A more complex example
30
+
31
+ ```ruby
32
+ require 'mailthis'
33
+
34
+ GMAIL = Mailthis.mailer do
35
+ smtp_helo "example.com"
36
+ smtp_server "smtp.gmail.com"
37
+ smtp_port 587
38
+ smtp_user "test@example.com"
39
+ smtp_pw 'secret'
40
+
41
+ smtp_auth "plain" # (optional) default: "login"
42
+ from "me@example.com" # (optional) default: config.smtp_username (if valid)
43
+ logger Logger.new("log/email.log") # (optional) default: no logger, no logging
44
+ end
45
+
46
+ msg = Mail.new
47
+ msg.from = 'bob@example.com', # (optional) default: mailer #from
48
+ msg.reply_to = 'bob@me.com', # (optional) default: self #from
49
+ msg.to = "you@example.com",
50
+ msg.cc = "Another <another@example.com>",
51
+ msg.bcc = ["one@example.com", "Two <two@example.com>"],
52
+ msg.subject = "a message",
53
+ msg.body = "a message body"
54
+
55
+ GMAIL.deliver(msg)
56
+ ```
57
+
58
+ ## Installation
59
+
60
+ Add this line to your application's Gemfile:
61
+
62
+ gem 'mailthis'
63
+
64
+ And then execute:
65
+
66
+ $ bundle
67
+
68
+ Or install it yourself as:
69
+
70
+ $ gem install mailthis
71
+
72
+ ## Contributing
73
+
74
+ 1. Fork it
75
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
76
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
77
+ 4. Push to the branch (`git push origin my-new-feature`)
78
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/lib/mailthis.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'mailthis/version'
2
+ require 'mailthis/exceptions'
3
+ require 'mailthis/mailer'
4
+
5
+ module Mailthis
6
+
7
+ def self.mailer(*args, &block)
8
+ Mailer.new(*args, &block).validate!
9
+ end
10
+
11
+ end
@@ -0,0 +1,7 @@
1
+ module Mailthis
2
+
3
+ MailthisError = Class.new(StandardError)
4
+ MailerError = Class.new(MailthisError)
5
+ MessageError = Class.new(MailthisError)
6
+
7
+ end
@@ -0,0 +1,50 @@
1
+ require 'ns-options/proxy'
2
+ require 'mail'
3
+ require 'mailthis/exceptions'
4
+ require 'mailthis/outgoing_email'
5
+
6
+ module Mailthis
7
+
8
+ class Mailer
9
+ include NsOptions::Proxy
10
+
11
+ option :smtp_helo, String, :required => true
12
+ option :smtp_server, String, :required => true
13
+ option :smtp_port, Integer, :required => true
14
+ option :smtp_user, String, :required => true
15
+ option :smtp_pw, String, :required => true
16
+ option :smtp_auth, String, :required => true, :default => proc{ "login" }
17
+
18
+ option :from, String, :required => true
19
+ option :logger, :required => true, :default => proc{ NullLogger.new }
20
+
21
+ def initialize(values=nil, &block)
22
+ # this is defaulted here because we want to use the Configuration instance
23
+ # `smtp_user`. If we define a proc above, we will be using the Configuration
24
+ # class `smtp_user`, which will not update the option as expected.
25
+ super((values || {}).merge(:from => proc{ self.smtp_user }))
26
+ self.define(&block)
27
+ end
28
+
29
+ def validate!
30
+ raise(MailerError, "missing required settings") if !valid?
31
+ self # for chaining
32
+ end
33
+
34
+ def deliver(message = nil, &block)
35
+ (message || ::Mail.new).tap do |msg|
36
+ msg.instance_eval(&block) if block
37
+ OutgoingEmail.new(self, msg).deliver
38
+ end
39
+ end
40
+
41
+ class NullLogger
42
+ require 'logger'
43
+ ::Logger::Severity.constants.each do |name|
44
+ define_method(name.downcase){ |*args| } # no-op
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -0,0 +1,75 @@
1
+ require 'openssl'
2
+
3
+ # Note: This is a complete rip of http://github.com/ambethia/smtp-tls/tree/master
4
+ # => I chose to copy the source in here instead of add yet another gem depencency
5
+ # => I take no credit for this work, check out the link for more info.
6
+
7
+ require 'net/smtp'
8
+
9
+ Net::SMTP.class_eval do
10
+ private
11
+ def do_start(helodomain, user, secret, authtype)
12
+ raise IOError, 'SMTP session already started' if @started
13
+
14
+ if RUBY_VERSION > "1.8.6"
15
+ check_auth_args user, secret if user or secret
16
+ else
17
+ check_auth_args user, secret, authtype if user or secret
18
+ end
19
+
20
+ sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
21
+ @socket = Net::InternetMessageIO.new(sock)
22
+ @socket.read_timeout = 60 #@read_timeout
23
+
24
+ check_response(critical { recv_response() })
25
+ do_helo(helodomain)
26
+
27
+ if starttls
28
+ raise 'openssl library not installed' unless defined?(OpenSSL)
29
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
30
+ ssl.sync_close = true
31
+ ssl.connect
32
+ @socket = Net::InternetMessageIO.new(ssl)
33
+ @socket.read_timeout = 60 #@read_timeout
34
+ do_helo(helodomain)
35
+ end
36
+
37
+ authenticate user, secret, authtype if user
38
+ @started = true
39
+ ensure
40
+ unless @started
41
+ # authentication failed, cancel connection.
42
+ @socket.close if not @started and @socket and not @socket.closed?
43
+ @socket = nil
44
+ end
45
+ end
46
+
47
+ def do_helo(helodomain)
48
+ begin
49
+ if @esmtp
50
+ ehlo helodomain
51
+ else
52
+ helo helodomain
53
+ end
54
+ rescue Net::ProtocolError
55
+ if @esmtp
56
+ @esmtp = false
57
+ @error_occured = false
58
+ retry
59
+ end
60
+ raise
61
+ end
62
+ end
63
+
64
+ def starttls
65
+ getok('STARTTLS') rescue return false
66
+ return true
67
+ end
68
+
69
+ def quit
70
+ begin
71
+ getok('QUIT')
72
+ rescue EOFError
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,98 @@
1
+ require 'mail'
2
+ require 'mailthis/exceptions'
3
+ require 'mailthis/net_smtp_tls'
4
+
5
+ module Mailthis
6
+
7
+ class OutgoingEmail
8
+
9
+ # deliver a message using using Net::SMTP with TLS encryption
10
+ # it is recommended to use Mail (https://github.com/mikel/mail) messages
11
+ # to disable delivery, set `ENV['MAILTHIS_DISABLE_SEND'] = 'yes'`
12
+
13
+ REQUIRED_FIELDS = [:from, :subject]
14
+ ADDRESS_FIELDS = [:to, :cc, :bcc]
15
+
16
+ attr_reader :mailer, :message
17
+
18
+ def initialize(mailer, message)
19
+ @mailer, @message = mailer, message
20
+ @message.from ||= @mailer.from if @message.respond_to?(:from=)
21
+ @message.reply_to ||= @message.from if @message.respond_to?(:reply_to=)
22
+ end
23
+
24
+ def validate!
25
+ if !valid_message?
26
+ raise Mailthis::MessageError, "invalid message"
27
+ end
28
+
29
+ REQUIRED_FIELDS.each do |field|
30
+ if @message.send(field).nil?
31
+ raise Mailthis::MessageError, "missing `#{field}` field"
32
+ end
33
+ end
34
+
35
+ if !address_exists?
36
+ raise Mailthis::MessageError, "no #{ADDRESS_FIELDS.join('/')} specified"
37
+ end
38
+ end
39
+
40
+ def deliver
41
+ self.validate!
42
+ @mailer.validate!
43
+ deliver_smtp if ENV['MAILTHIS_DISABLE_SEND'].nil?
44
+
45
+ log_message # and return it
46
+ end
47
+
48
+ private
49
+
50
+ def valid_message?
51
+ (REQUIRED_FIELDS + ADDRESS_FIELDS + [:to_s]).inject(true) do |invalid, meth|
52
+ invalid && @message.respond_to?(meth)
53
+ end
54
+ end
55
+
56
+ def address_exists?
57
+ ADDRESS_FIELDS.inject(false) do |exists, field|
58
+ exists || (!@message.send(field).nil? && !@message.send(field).empty?)
59
+ end
60
+ end
61
+
62
+ def deliver_smtp
63
+ smtp_start_args = [
64
+ @mailer.smtp_server,
65
+ @mailer.smtp_port,
66
+ @mailer.smtp_helo,
67
+ @mailer.smtp_user,
68
+ @mailer.smtp_pw,
69
+ @mailer.smtp_auth
70
+ ]
71
+
72
+ Net::SMTP.start(*smtp_start_args) do |smtp|
73
+ ADDRESS_FIELDS.each do |field|
74
+ if (recipients = @message.send(field))
75
+ recipients.each{ |r| smtp.send_message(@message.to_s, @message.from, r) }
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ def log_message
82
+ @message.tap do |msg|
83
+ log "Sent '#{msg.subject}' to #{msg.to ? msg.to.join(', ') : "''"}"
84
+
85
+ log "\n"\
86
+ "==============================================================\n"\
87
+ "#{msg}\n"\
88
+ "==============================================================\n", :debug
89
+ end
90
+ end
91
+
92
+ def log(msg, level = nil)
93
+ @mailer.logger.send(level || :info, msg)
94
+ end
95
+
96
+ end
97
+
98
+ end
@@ -0,0 +1,3 @@
1
+ module Mailthis
2
+ VERSION = "0.1.0"
3
+ end
data/log/.gitkeep ADDED
File without changes
data/mailthis.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "mailthis/version"
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "mailthis"
8
+ gem.version = Mailthis::VERSION
9
+ gem.authors = ["Kelly Redding"]
10
+ gem.email = ["kelly@kellyredding.com"]
11
+ gem.description = %q{a simple mailer for ruby}
12
+ gem.summary = %q{a simple mailer for ruby}
13
+ gem.homepage = "http://github.com/kellyredding/mailthis"
14
+ gem.license = 'MIT'
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.add_development_dependency("assert", ["~> 2.0"])
22
+
23
+ gem.add_dependency("ns-options", ["~> 1.1", ">= 1.1.4"])
24
+ gem.add_dependency("mail", ["~> 2.5"])
25
+
26
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,11 @@
1
+ # this file is automatically required when you run `assert`
2
+ # put any test helpers here
3
+
4
+ # add the root dir to the load path
5
+ $LOAD_PATH.unshift(File.expand_path("../..", __FILE__))
6
+
7
+ # require pry for debugging (`binding.pry`)
8
+ require 'pry'
9
+
10
+ # disable actually delivering emails for testing purposes
11
+ ENV['MAILTHIS_DISABLE_SEND'] = 'yes'
@@ -0,0 +1,35 @@
1
+ module Factory
2
+
3
+ def self.mailer
4
+ require 'mailthis/mailer'
5
+ Mailthis::Mailer.new do
6
+ smtp_helo "example.com"
7
+ smtp_server "smtp.example.com"
8
+ smtp_port 25
9
+ smtp_user "test@example.com"
10
+ smtp_pw "secret"
11
+ smtp_auth :plain
12
+ from "me@example.com"
13
+ end
14
+ end
15
+
16
+ def self.message(settings = nil)
17
+ require 'mail'
18
+ message = Mail.new do
19
+ to 'you@example.com'
20
+ subject 'a message'
21
+ end
22
+ (settings || {}).inject(message) do |msg, (setting, value)|
23
+ msg[setting] = value
24
+ msg
25
+ end
26
+ end
27
+
28
+ def self.logger(string_val)
29
+ require 'logger'
30
+ require 'stringio'
31
+ Logger.new(StringIO.new(string_val))
32
+ end
33
+
34
+ end
35
+
@@ -0,0 +1,182 @@
1
+ require 'assert'
2
+ require 'mailthis/mailer'
3
+
4
+ require 'test/support/factory'
5
+ require 'mailthis/exceptions'
6
+
7
+ class Mailthis::Mailer
8
+
9
+ class UnitTests < Assert::Context
10
+ desc "Mailthis::Mailer"
11
+ setup do
12
+ @mailer = Mailthis::Mailer.new
13
+ end
14
+ subject{ @mailer }
15
+
16
+ should have_imeths :smtp_helo, :smtp_server, :smtp_port
17
+ should have_imeths :smtp_user, :smtp_pw, :smtp_auth
18
+ should have_imeths :from, :logger
19
+ should have_imeths :validate!, :deliver
20
+
21
+ should "know its smtp settings" do
22
+ { :smtp_helo => 'example.com',
23
+ :smtp_server => 'smtp.example.com',
24
+ :smtp_port => 25,
25
+ :smtp_user => 'test@example.com',
26
+ :smtp_pw => 'secret'
27
+ }.each do |setting, val|
28
+ assert_nil subject.send(setting)
29
+
30
+ subject.send(setting, val)
31
+ assert_equal val, subject.send(setting)
32
+ end
33
+ end
34
+
35
+ should "use `\"login\"` as the auth by default" do
36
+ assert_equal "login", subject.smtp_auth
37
+
38
+ subject.smtp_auth 'plain'
39
+ assert_equal 'plain', subject.smtp_auth
40
+ end
41
+
42
+ should "use smtp_user as the from by default" do
43
+ assert_nil subject.from
44
+
45
+ subject.smtp_user 'user'
46
+ assert_equal 'user', subject.from
47
+ end
48
+
49
+ should "allow overriding the from" do
50
+ subject.from 'a-user'
51
+ assert_equal 'a-user', subject.from
52
+ end
53
+
54
+ should "know its logger" do
55
+ assert_kind_of Mailthis::Mailer::NullLogger, subject.logger
56
+ end
57
+
58
+ end
59
+
60
+ class ValidationTests < UnitTests
61
+ desc "when validating"
62
+ setup do
63
+ @invalid = Mailthis::Mailer.new do
64
+ smtp_helo "example.com"
65
+ smtp_server "smtp.example.com"
66
+ smtp_port 25
67
+ smtp_user "test@example.com"
68
+ smtp_pw "secret"
69
+ smtp_auth :plain
70
+ end
71
+ end
72
+ subject{ @invalid }
73
+
74
+ should "not complain if all settings are in place" do
75
+ assert_valid
76
+ end
77
+
78
+ should "return itself when validating" do
79
+ assert_same subject, subject.validate!
80
+ end
81
+
82
+ should "be invalid if missing the helo domain" do
83
+ subject.smtp_helo = nil
84
+ assert_invalid
85
+ end
86
+
87
+ should "be invalid if missing the server" do
88
+ subject.smtp_server = nil
89
+ assert_invalid
90
+ end
91
+
92
+ should "be invalid if missing the port" do
93
+ subject.smtp_port = nil
94
+ assert_invalid
95
+ end
96
+
97
+ should "be invalid if missing the user" do
98
+ subject.smtp_user = nil
99
+ assert_invalid
100
+ end
101
+
102
+ should "be invalid if missing the pw" do
103
+ subject.smtp_pw = nil
104
+ assert_invalid
105
+ end
106
+
107
+ should "be invalid if missing the auth" do
108
+ subject.smtp_auth = nil
109
+ assert_invalid
110
+ end
111
+
112
+ should "be invalid if missing the from" do
113
+ subject.from = nil
114
+ assert_invalid
115
+ end
116
+
117
+ should "be invalid if missing the logger" do
118
+ subject.logger = nil
119
+ assert_invalid
120
+ end
121
+
122
+ private
123
+
124
+ def assert_valid
125
+ assert_nothing_raised do
126
+ subject.validate!
127
+ end
128
+ end
129
+
130
+ def assert_invalid
131
+ assert_raises(Mailthis::MailerError) do
132
+ subject.validate!
133
+ end
134
+ end
135
+
136
+ end
137
+
138
+ class SendMailTests < UnitTests
139
+ desc "when sending mail"
140
+ setup do
141
+ @message = Factory.message(:from => "me@example.com")
142
+ @mailer = Factory.mailer
143
+ @mailer.logger = Factory.logger(@out = "")
144
+
145
+ @sent_msg = @mailer.deliver(@message)
146
+ end
147
+
148
+ should "return the message that was sent" do
149
+ assert_same @message, @sent_msg
150
+ end
151
+
152
+ should "log that the message was sent" do
153
+ assert_not_empty @out
154
+ end
155
+
156
+ should "build the message from the given block" do
157
+ built_msg = @mailer.deliver do
158
+ from 'me@example.com'
159
+ to 'you@example.com'
160
+ subject 'a message'
161
+ end
162
+
163
+ assert_kind_of ::Mail::Message, built_msg
164
+ assert_equal ['me@example.com'], built_msg.from
165
+ assert_equal ['you@example.com'], built_msg.to
166
+ assert_equal 'a message', built_msg.subject
167
+ end
168
+
169
+ should "task a message and apply the given block" do
170
+ built_msg = @mailer.deliver(Factory.message) do
171
+ from 'me@example.com'
172
+ end
173
+
174
+ assert_kind_of ::Mail::Message, built_msg
175
+ assert_equal ['me@example.com'], built_msg.from
176
+ assert_equal ['you@example.com'], built_msg.to
177
+ assert_equal 'a message', built_msg.subject
178
+ end
179
+
180
+ end
181
+
182
+ end
@@ -0,0 +1,42 @@
1
+ require 'assert'
2
+ require 'mailthis'
3
+
4
+ require 'mailthis/mailer'
5
+ require 'mailthis/exceptions'
6
+
7
+ module Mailthis
8
+
9
+ class UnitTests < Assert::Context
10
+ desc "Mailthis"
11
+ subject{ Mailthis }
12
+
13
+ should have_imeth :mailer
14
+
15
+ should "build a mailer with given args" do
16
+ mailer = Mailthis.mailer do
17
+ smtp_helo "example.com"
18
+ smtp_server "smtp.example.com"
19
+ smtp_port 25
20
+ smtp_user "test@example.com"
21
+ smtp_pw "secret"
22
+ smtp_auth :plain
23
+ end
24
+
25
+ assert_kind_of Mailer, mailer
26
+ assert_equal "example.com", mailer.smtp_helo
27
+ assert_equal "smtp.example.com", mailer.smtp_server
28
+ assert_equal 25, mailer.smtp_port
29
+ assert_equal "test@example.com", mailer.smtp_user
30
+ assert_equal "secret", mailer.smtp_pw
31
+ assert_equal 'plain', mailer.smtp_auth
32
+ end
33
+
34
+ should "complain if building a mailer with missing settings" do
35
+ assert_raises(MailerError) do
36
+ mailer = Mailthis.mailer
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,115 @@
1
+ require 'assert'
2
+ require 'mailthis/outgoing_email'
3
+
4
+ require 'test/support/factory'
5
+ require 'mailthis/exceptions'
6
+
7
+ class Mailthis::OutgoingEmail
8
+
9
+ class UnitTests < Assert::Context
10
+ desc "Mailthis::OutgoingEmail"
11
+ setup do
12
+ @mailer = Factory.mailer
13
+ @message = Factory.message
14
+ @email = Mailthis::OutgoingEmail.new(@mailer, @message)
15
+ end
16
+ subject{ @email }
17
+
18
+ should have_readers :mailer, :message
19
+ should have_imeths :validate!, :deliver
20
+
21
+ should "know its mailer and message" do
22
+ assert_same @mailer, subject.mailer
23
+ assert_same @message, subject.message
24
+ end
25
+
26
+ should "set the message's from to the mailer's from if message has no from" do
27
+ assert_nil Factory.message.from
28
+ assert_not_nil subject.message.from
29
+ assert_equal [@mailer.from], subject.message.from
30
+ end
31
+
32
+ should "set the message's reply_to to the message's from if message has no reply_to" do
33
+ assert_nil Factory.message.reply_to
34
+ assert_not_nil subject.message.reply_to
35
+ assert_equal subject.message.from, subject.message.reply_to
36
+ end
37
+
38
+ should "complain if delivering with an invalid mailer" do
39
+ @mailer.smtp_server = nil
40
+ assert_not @mailer.valid?
41
+
42
+ assert_raises(Mailthis::MailerError) do
43
+ subject.deliver
44
+ end
45
+ end
46
+
47
+ should "complain if delivering an invalid message" do
48
+ msg = Factory.message
49
+ msg.to = nil
50
+
51
+ assert_raises(Mailthis::MessageError) do
52
+ Mailthis::OutgoingEmail.new(@mailer, msg).deliver
53
+ end
54
+ end
55
+
56
+ should "log when delivering a message" do
57
+ @mailer.logger = Factory.logger(out = "")
58
+ assert_empty out
59
+
60
+ subject.deliver
61
+
62
+ assert_not_empty out
63
+ assert_includes "Sent '#{@message.subject}'", out
64
+ assert_includes @message.to_s, out
65
+ end
66
+
67
+ should "return the delivered message" do
68
+ assert_same @message, subject.deliver
69
+ end
70
+
71
+ end
72
+
73
+ class ValidationTests < UnitTests
74
+ desc "when validating"
75
+
76
+ should "not complain if all settings are in place" do
77
+ assert_valid_with @message
78
+ end
79
+
80
+ should "complain if using an invalid message" do
81
+ assert_invalid_with "not-a-valid-msg-obj"
82
+ end
83
+
84
+ should "complain if the message is missing required fields" do
85
+ msg = Factory.message
86
+ msg.subject = nil
87
+ assert_invalid_with msg
88
+ end
89
+
90
+ should "complain if the message is not addressed to anyone" do
91
+ msg = Factory.message
92
+
93
+ msg.to = msg.cc = msg.bcc = nil
94
+ assert_invalid_with msg
95
+ end
96
+
97
+ private
98
+
99
+ def assert_valid_with(msg)
100
+ assert_nothing_raised do
101
+ Mailthis::OutgoingEmail.new(@mailer, msg).validate!
102
+ end
103
+ end
104
+
105
+ def assert_invalid_with(msg)
106
+ with_backtrace(caller) do
107
+ assert_raises(Mailthis::MessageError) do
108
+ Mailthis::OutgoingEmail.new(@mailer, msg).validate!
109
+ end
110
+ end
111
+ end
112
+
113
+ end
114
+
115
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mailthis
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Kelly Redding
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2013-07-22 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: assert
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 2
31
+ - 0
32
+ version: "2.0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: ns-options
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 13
44
+ segments:
45
+ - 1
46
+ - 1
47
+ version: "1.1"
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ hash: 27
51
+ segments:
52
+ - 1
53
+ - 1
54
+ - 4
55
+ version: 1.1.4
56
+ type: :runtime
57
+ version_requirements: *id002
58
+ - !ruby/object:Gem::Dependency
59
+ name: mail
60
+ prerelease: false
61
+ requirement: &id003 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ~>
65
+ - !ruby/object:Gem::Version
66
+ hash: 9
67
+ segments:
68
+ - 2
69
+ - 5
70
+ version: "2.5"
71
+ type: :runtime
72
+ version_requirements: *id003
73
+ description: a simple mailer for ruby
74
+ email:
75
+ - kelly@kellyredding.com
76
+ executables: []
77
+
78
+ extensions: []
79
+
80
+ extra_rdoc_files: []
81
+
82
+ files:
83
+ - .gitignore
84
+ - Gemfile
85
+ - LICENSE.txt
86
+ - README.md
87
+ - Rakefile
88
+ - lib/mailthis.rb
89
+ - lib/mailthis/exceptions.rb
90
+ - lib/mailthis/mailer.rb
91
+ - lib/mailthis/net_smtp_tls.rb
92
+ - lib/mailthis/outgoing_email.rb
93
+ - lib/mailthis/version.rb
94
+ - log/.gitkeep
95
+ - mailthis.gemspec
96
+ - test/helper.rb
97
+ - test/support/factory.rb
98
+ - test/unit/mailer_tests.rb
99
+ - test/unit/mailthis_tests.rb
100
+ - test/unit/outgoing_email_tests.rb
101
+ - tmp/.gitkeep
102
+ homepage: http://github.com/kellyredding/mailthis
103
+ licenses:
104
+ - MIT
105
+ post_install_message:
106
+ rdoc_options: []
107
+
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ hash: 3
116
+ segments:
117
+ - 0
118
+ version: "0"
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ hash: 3
125
+ segments:
126
+ - 0
127
+ version: "0"
128
+ requirements: []
129
+
130
+ rubyforge_project:
131
+ rubygems_version: 1.8.24
132
+ signing_key:
133
+ specification_version: 3
134
+ summary: a simple mailer for ruby
135
+ test_files:
136
+ - test/helper.rb
137
+ - test/support/factory.rb
138
+ - test/unit/mailer_tests.rb
139
+ - test/unit/mailthis_tests.rb
140
+ - test/unit/outgoing_email_tests.rb