mail_sandbox 0.0.7
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/.gitignore +18 -0
- data/.travis.yml +7 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +52 -0
- data/Rakefile +2 -0
- data/bin/mail_sandbox +6 -0
- data/lib/mail_sandbox/config.rb +57 -0
- data/lib/mail_sandbox/message.rb +32 -0
- data/lib/mail_sandbox/observer/http.rb +23 -0
- data/lib/mail_sandbox/observer.rb +5 -0
- data/lib/mail_sandbox/runner.rb +62 -0
- data/lib/mail_sandbox/server.rb +38 -0
- data/lib/mail_sandbox/signals.rb +16 -0
- data/lib/mail_sandbox/subscribe.rb +37 -0
- data/lib/mail_sandbox/version.rb +3 -0
- data/lib/mail_sandbox.rb +26 -0
- data/mail_sandbox.gemspec +26 -0
- data/test/config.yml +7 -0
- data/test/mail_sandbox/config_test.rb +33 -0
- data/test/mail_sandbox/server_test.rb +128 -0
- data/test/my_observer.rb +12 -0
- data/test/test_helper.rb +12 -0
- metadata +187 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Rozhnov Alexandr
|
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,52 @@
|
|
1
|
+
# MailSandbox [](http://travis-ci.org/kaize/mail_sandbox)
|
2
|
+
|
3
|
+
Gem has run SMTP server and manipulate letters received. Using the Observer pattern you can subscribe to the event server.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'mail_sandbox'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install mail_sandbox
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
To start the server:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
runner = MailSandbox::Runner.new
|
25
|
+
runner.config.config_file = "config/mail_sandbox.yml"
|
26
|
+
runner.start
|
27
|
+
```
|
28
|
+
|
29
|
+
Cofig.yml
|
30
|
+
|
31
|
+
```yaml
|
32
|
+
staging:
|
33
|
+
http_observe?: true
|
34
|
+
http_observe_url: 'http://my_url.ru/api/mail_messages'
|
35
|
+
listen: '0.0.0.0'
|
36
|
+
log_level: debug
|
37
|
+
development:
|
38
|
+
http_observe?: true
|
39
|
+
http_observe_url: 'http://localhost:8080/api/mail_messages'
|
40
|
+
listen: '0.0.0.0'
|
41
|
+
log_level: debug
|
42
|
+
```
|
43
|
+
|
44
|
+
For more details see ```MailSandbox::Config```
|
45
|
+
|
46
|
+
## Contributing
|
47
|
+
|
48
|
+
1. Fork it
|
49
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
50
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
51
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
52
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/bin/mail_sandbox
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
module MailSandbox
|
2
|
+
class Config
|
3
|
+
|
4
|
+
# @config:Array
|
5
|
+
# :listen:String
|
6
|
+
# :port:Integer
|
7
|
+
# :log_level:Symbol = :info (:info :error :warn :debug)
|
8
|
+
# :server_params:Array
|
9
|
+
# :auth:Boolean - enable smtp authorization, now it's only PLAIN
|
10
|
+
# :config_file:String - path to yaml config file
|
11
|
+
# :http_observe?:Boolean - subscribe Observer::Http to receive new messages and push them by http protocol
|
12
|
+
# :http_observe_url:String - url for push on receive new messages, use by Observer::Http
|
13
|
+
#
|
14
|
+
def initialize
|
15
|
+
@config = {
|
16
|
+
:listen => '127.0.0.1',
|
17
|
+
:port => 2525,
|
18
|
+
:log_level => :info,
|
19
|
+
:server_params => {
|
20
|
+
:auth => true
|
21
|
+
}
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def load_from_yml_file(env, file = nil)
|
26
|
+
file ||= config_file
|
27
|
+
yaml = YAML.load_file(file)[env.to_s]
|
28
|
+
|
29
|
+
merge_config(yaml)
|
30
|
+
end
|
31
|
+
|
32
|
+
def merge_config(hash)
|
33
|
+
symbolize_merge(@config, hash)
|
34
|
+
end
|
35
|
+
|
36
|
+
def symbolize_merge(conf, hash)
|
37
|
+
hash.each do |key, val|
|
38
|
+
if val.kind_of? Hash
|
39
|
+
symbolize_merge(conf[key.to_sym], val)
|
40
|
+
else
|
41
|
+
conf[key.to_sym] = val
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def method_missing(method, val = nil)
|
47
|
+
m = method.to_s
|
48
|
+
if m =~ /=$/
|
49
|
+
key = m.match(/(.*)=$/)[1]
|
50
|
+
@config[key.to_sym] = val
|
51
|
+
else
|
52
|
+
@config[method]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MailSandbox
|
4
|
+
class Message
|
5
|
+
|
6
|
+
attr_accessor :data, :recipient, :sender, :completed_at,
|
7
|
+
:user,
|
8
|
+
:password
|
9
|
+
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@data = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_json
|
16
|
+
to_a.to_json
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def to_a
|
21
|
+
{
|
22
|
+
:password => password,
|
23
|
+
:user => user,
|
24
|
+
:recipient => recipient,
|
25
|
+
:sender => sender,
|
26
|
+
:completed_at => completed_at,
|
27
|
+
:data => data.join("\r\n"),
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'em-http-request'
|
2
|
+
|
3
|
+
module MailSandbox
|
4
|
+
class Observer::Http
|
5
|
+
|
6
|
+
def initialize(url, method = :post)
|
7
|
+
@url = url
|
8
|
+
@method = method
|
9
|
+
end
|
10
|
+
|
11
|
+
def update(message)
|
12
|
+
body = {:message => message.to_a}
|
13
|
+
|
14
|
+
MailSandbox.logger.debug "Observer::Http send to #{@url} method #{@method} body #{body.to_s}"
|
15
|
+
|
16
|
+
http = EventMachine::HttpRequest.new(@url).send @method, :body => body
|
17
|
+
http.errback { MailSandbox.logger.error 'Observer::Http error.' }
|
18
|
+
http.callback { MailSandbox.logger.debug 'Observer::Http sended.' }
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require "eventmachine"
|
2
|
+
require 'optparse'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module MailSandbox
|
6
|
+
class Runner
|
7
|
+
|
8
|
+
attr_accessor :config
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
self.config = MailSandbox::Config.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def option_parse
|
15
|
+
OptionParser.new do |opts|
|
16
|
+
|
17
|
+
opts.on("-c", "--config-file FILE", "Config file") do |f|
|
18
|
+
config.config_file = f
|
19
|
+
end
|
20
|
+
|
21
|
+
opts.on("-E", "--environment", "Environment") do |f|
|
22
|
+
config.environment = f
|
23
|
+
end
|
24
|
+
|
25
|
+
end.parse!
|
26
|
+
end
|
27
|
+
|
28
|
+
def configure
|
29
|
+
config.load_from_yml_file(env) if config.config_file
|
30
|
+
|
31
|
+
if config.http_observe?
|
32
|
+
MailSandbox.subscribe MailSandbox::Observer::Http.new(config.http_observe_url)
|
33
|
+
end
|
34
|
+
|
35
|
+
MailSandbox.logger.level = case config.log_level.to_sym
|
36
|
+
when :info then Logger::INFO
|
37
|
+
when :error then Logger::ERROR
|
38
|
+
when :warn then Logger::WARN
|
39
|
+
when :debug then Logger::DEBUG
|
40
|
+
end
|
41
|
+
STDOUT.sync = true
|
42
|
+
MailSandbox::Signals.trap
|
43
|
+
MailSandbox::Server.parms = config.server_params
|
44
|
+
end
|
45
|
+
|
46
|
+
def start
|
47
|
+
configure
|
48
|
+
|
49
|
+
MailSandbox.logger.info "Start MailSandbox::Server on #{config.listen}:#{config.port}"
|
50
|
+
|
51
|
+
EventMachine::run {
|
52
|
+
EventMachine::start_server config.listen, config.port, MailSandbox::Server
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
def env
|
57
|
+
config.environment || ENV['RAILS_ENV'] || ENV['RACK_ENV'] || :development
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module MailSandbox
|
2
|
+
class Server < EventMachine::Protocols::SmtpServer
|
3
|
+
|
4
|
+
def receive_plain_auth(user, password)
|
5
|
+
message.user = user
|
6
|
+
message.password = password
|
7
|
+
|
8
|
+
true
|
9
|
+
end
|
10
|
+
|
11
|
+
def receive_sender(sender)
|
12
|
+
message.sender = sender
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def receive_recipient(recipient)
|
17
|
+
message.recipient = recipient
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
def receive_message
|
22
|
+
message.completed_at = Time.now
|
23
|
+
Subscribe.notify(message)
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
def process_data_line ln
|
28
|
+
super ln
|
29
|
+
message.data << ln
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
def message
|
34
|
+
@message ||= MailSandbox::Message.new
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module MailSandbox
|
2
|
+
class Subscribe
|
3
|
+
class<<self
|
4
|
+
|
5
|
+
def subscribe(observer)
|
6
|
+
observers[observer] ||= observer
|
7
|
+
end
|
8
|
+
|
9
|
+
def unsubscribe(observer)
|
10
|
+
observers.delete(observer)
|
11
|
+
end
|
12
|
+
|
13
|
+
def notify(message)
|
14
|
+
observers.each_value do |observer|
|
15
|
+
|
16
|
+
thread = Thread.new do
|
17
|
+
mutex.synchronize do
|
18
|
+
observer.update(message)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
thread.abort_on_exception = true
|
23
|
+
#thread.run
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def observers
|
28
|
+
@observers ||= {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def mutex
|
32
|
+
@mutex ||= Mutex.new
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/mail_sandbox.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "mail_sandbox/version"
|
2
|
+
require "eventmachine"
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module MailSandbox
|
6
|
+
autoload :Server, 'mail_sandbox/server'
|
7
|
+
autoload :Message, 'mail_sandbox/message'
|
8
|
+
autoload :Observer, 'mail_sandbox/observer'
|
9
|
+
autoload :Subscribe, 'mail_sandbox/subscribe'
|
10
|
+
autoload :Config, 'mail_sandbox/config'
|
11
|
+
autoload :Runner, 'mail_sandbox/runner'
|
12
|
+
autoload :Signals, 'mail_sandbox/signals'
|
13
|
+
|
14
|
+
def self.subscribe(observer)
|
15
|
+
Subscribe.subscribe observer
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.unsubscribe(observer)
|
19
|
+
Subscribe.unsubscribe observer
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.logger
|
23
|
+
@logger ||= Logger.new(STDOUT)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/mail_sandbox/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Kaize"]
|
6
|
+
gem.email = ["info@kaize.ru"]
|
7
|
+
gem.description = %q{Gem has run SMTP server and manipulate letters received. Using the Observer pattern you can subscribe to the event server.}
|
8
|
+
gem.summary = %q{SMTP server sandbox}
|
9
|
+
gem.homepage = "https://github.com/kaize/mail_sandbox"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "mail_sandbox"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = MailSandbox::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency('eventmachine', '~> 0.12.9')
|
19
|
+
gem.add_dependency('em-http-request', '~> 0.3.0')
|
20
|
+
gem.add_dependency('OptionParser')
|
21
|
+
gem.add_dependency('file-utils')
|
22
|
+
|
23
|
+
gem.add_development_dependency('rake')
|
24
|
+
gem.add_development_dependency('minitest')
|
25
|
+
gem.add_development_dependency('turn')
|
26
|
+
end
|
data/test/config.yml
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ConfigTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@config = MailSandbox::Config.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_set_get_value
|
10
|
+
@config.my_val = :test_val
|
11
|
+
|
12
|
+
assert_equal :test_val, @config.my_val
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_load_from_yml_file
|
16
|
+
@config.load_from_yml_file(:development, 'test/config.yml')
|
17
|
+
|
18
|
+
assert @config.test_key
|
19
|
+
assert_equal 'development value', @config.test_key
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_load_file
|
23
|
+
@config.config_file = 'test/config.yml'
|
24
|
+
|
25
|
+
@config.load_from_yml_file(:production)
|
26
|
+
|
27
|
+
assert @config.test_key
|
28
|
+
assert_equal 'production value', @config.test_key
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ServerTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
EventMachine::MockHttpRequest.reset_registry!
|
7
|
+
EventMachine::MockHttpRequest.reset_counts!
|
8
|
+
EventMachine::MockHttpRequest.pass_through_requests = false
|
9
|
+
|
10
|
+
EventMachine::MockHttpRequest.activate!
|
11
|
+
|
12
|
+
@server = Thread.new do
|
13
|
+
MailSandbox::Runner.new.start
|
14
|
+
end
|
15
|
+
|
16
|
+
@server.abort_on_exception = true
|
17
|
+
@server.run
|
18
|
+
|
19
|
+
@message = <<MESSAGE_END
|
20
|
+
From: Private Person <me@fromdomain.com>
|
21
|
+
To: A Test User <test@todomain.com>
|
22
|
+
Subject: SMTP e-mail test
|
23
|
+
|
24
|
+
1 This is a test e-mail message.
|
25
|
+
2 This is a test e-mail message.
|
26
|
+
3 This is a test e-mail message.
|
27
|
+
MESSAGE_END
|
28
|
+
|
29
|
+
@http_response = <<-RESPONSE.gsub(/^ +/, '')
|
30
|
+
HTTP/1.0 200 OK
|
31
|
+
Date: Mon, 16 Nov 2009 20:39:15 GMT
|
32
|
+
Expires: -1
|
33
|
+
Cache-Control: private, max-age=0
|
34
|
+
Content-Type: text/html; charset=ISO-8859-1
|
35
|
+
Via: 1.0 .:80 (squid)
|
36
|
+
Connection: close
|
37
|
+
|
38
|
+
Success
|
39
|
+
RESPONSE
|
40
|
+
|
41
|
+
@url = 'http://localhost:8080/api/mails'
|
42
|
+
|
43
|
+
#wait run server
|
44
|
+
sleep 0.5
|
45
|
+
end
|
46
|
+
|
47
|
+
def teardown
|
48
|
+
EventMachine::MockHttpRequest.deactivate!
|
49
|
+
MailSandbox::Subscribe.observers.clear
|
50
|
+
@server.terminate
|
51
|
+
sleep 0.5
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_server_run
|
55
|
+
server_run = @server.alive?
|
56
|
+
assert server_run, "Server not alive"
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_server_helo
|
60
|
+
bye, helo = nil
|
61
|
+
Socket.tcp('127.0.0.1', 2525) do |socket|
|
62
|
+
helo = socket.readline
|
63
|
+
socket.print "EHLO localhost.localdomain\r\n"
|
64
|
+
socket.readpartial(65536)
|
65
|
+
socket.print "QUIT\r\n"
|
66
|
+
bye = socket.readline
|
67
|
+
socket.close_write
|
68
|
+
socket.close_read
|
69
|
+
end
|
70
|
+
assert_match /^220 .*/, helo
|
71
|
+
assert_match /^221 .*/, bye
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_subscribe_mailsandox
|
75
|
+
|
76
|
+
observer = MyObserver.new
|
77
|
+
MailSandbox.subscribe observer
|
78
|
+
|
79
|
+
Net::SMTP.start('localhost', 2525) do |smtp|
|
80
|
+
smtp.send_message @message, 'me@fromdomain.com', 'test@todomain.com'
|
81
|
+
end
|
82
|
+
|
83
|
+
sleep 1
|
84
|
+
|
85
|
+
assert observer.message
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_http_observer
|
90
|
+
|
91
|
+
EventMachine::MockHttpRequest.register(@url,:post, nil, @http_response)
|
92
|
+
|
93
|
+
observer = MailSandbox::Observer::Http.new(@url)
|
94
|
+
MailSandbox.subscribe observer
|
95
|
+
|
96
|
+
Net::SMTP.start('localhost', 2525) do |smtp|
|
97
|
+
smtp.send_message @message, 'me@fromdomain.com', 'test@todomain.com'
|
98
|
+
end
|
99
|
+
|
100
|
+
sleep 1
|
101
|
+
|
102
|
+
assert_equal 1, EM::HttpRequest.count(@url, :post)
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_auth
|
107
|
+
user = 'app_user'
|
108
|
+
password = 'KnesSGaF9TQ9wOOdXd2m'
|
109
|
+
|
110
|
+
observer = MyObserver.new
|
111
|
+
MailSandbox.subscribe observer
|
112
|
+
|
113
|
+
smtp = Net::SMTP.new('localhost', 2525)
|
114
|
+
smtp.start do |smtp|
|
115
|
+
smtp.auth_plain(user, password)
|
116
|
+
smtp.send_message @message, 'me@fromdomain.com', 'test@todomain.com'
|
117
|
+
end
|
118
|
+
|
119
|
+
sleep 1
|
120
|
+
|
121
|
+
assert observer.message
|
122
|
+
assert_equal user, observer.message.user
|
123
|
+
assert_equal password, observer.message.password
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
end
|
data/test/my_observer.rb
ADDED
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mail_sandbox
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.7
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Kaize
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: eventmachine
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.12.9
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.12.9
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: em-http-request
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.3.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.3.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: OptionParser
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: file-utils
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rake
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: minitest
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: turn
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
description: Gem has run SMTP server and manipulate letters received. Using the Observer
|
127
|
+
pattern you can subscribe to the event server.
|
128
|
+
email:
|
129
|
+
- info@kaize.ru
|
130
|
+
executables:
|
131
|
+
- mail_sandbox
|
132
|
+
extensions: []
|
133
|
+
extra_rdoc_files: []
|
134
|
+
files:
|
135
|
+
- .gitignore
|
136
|
+
- .travis.yml
|
137
|
+
- Gemfile
|
138
|
+
- LICENSE
|
139
|
+
- README.md
|
140
|
+
- Rakefile
|
141
|
+
- bin/mail_sandbox
|
142
|
+
- lib/mail_sandbox.rb
|
143
|
+
- lib/mail_sandbox/config.rb
|
144
|
+
- lib/mail_sandbox/message.rb
|
145
|
+
- lib/mail_sandbox/observer.rb
|
146
|
+
- lib/mail_sandbox/observer/http.rb
|
147
|
+
- lib/mail_sandbox/runner.rb
|
148
|
+
- lib/mail_sandbox/server.rb
|
149
|
+
- lib/mail_sandbox/signals.rb
|
150
|
+
- lib/mail_sandbox/subscribe.rb
|
151
|
+
- lib/mail_sandbox/version.rb
|
152
|
+
- mail_sandbox.gemspec
|
153
|
+
- test/config.yml
|
154
|
+
- test/mail_sandbox/config_test.rb
|
155
|
+
- test/mail_sandbox/server_test.rb
|
156
|
+
- test/my_observer.rb
|
157
|
+
- test/test_helper.rb
|
158
|
+
homepage: https://github.com/kaize/mail_sandbox
|
159
|
+
licenses: []
|
160
|
+
post_install_message:
|
161
|
+
rdoc_options: []
|
162
|
+
require_paths:
|
163
|
+
- lib
|
164
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
165
|
+
none: false
|
166
|
+
requirements:
|
167
|
+
- - ! '>='
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: '0'
|
170
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
|
+
none: false
|
172
|
+
requirements:
|
173
|
+
- - ! '>='
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '0'
|
176
|
+
requirements: []
|
177
|
+
rubyforge_project:
|
178
|
+
rubygems_version: 1.8.24
|
179
|
+
signing_key:
|
180
|
+
specification_version: 3
|
181
|
+
summary: SMTP server sandbox
|
182
|
+
test_files:
|
183
|
+
- test/config.yml
|
184
|
+
- test/mail_sandbox/config_test.rb
|
185
|
+
- test/mail_sandbox/server_test.rb
|
186
|
+
- test/my_observer.rb
|
187
|
+
- test/test_helper.rb
|