mail_daemon 0.0.5

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/lib/server.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'sinatra'
2
+
3
+ get '/reload' do
4
+ MailDaemon::EmailWatcher.reload
5
+ MailDaemon::EmailWatcher.restart
6
+ end
@@ -0,0 +1,113 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
8
+ <title>CaseBlocks Email Watcher</title>
9
+
10
+ <!-- Bootstrap -->
11
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
12
+ <link href="dashboard.css" rel="stylesheet">
13
+
14
+
15
+ <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
16
+ <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
17
+ <!--[if lt IE 9]>
18
+ <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
19
+ <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
20
+ <![endif]-->
21
+ </head>
22
+ <body>
23
+
24
+ <nav class="navbar navbar-inverse navbar-fixed-top">
25
+ <div class="container-fluid">
26
+ <div class="navbar-header">
27
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
28
+ <span class="sr-only">Toggle navigation</span>
29
+ <span class="icon-bar"></span>
30
+ <span class="icon-bar"></span>
31
+ <span class="icon-bar"></span>
32
+ </button>
33
+ <a class="navbar-brand" href="#">CaseBlocks Email Watcher</a>
34
+ </div>
35
+ <div id="navbar" class="navbar-collapse collapse">
36
+ <ul class="nav navbar-nav navbar-right">
37
+ <li><a href="/">Dashboard</a></li>
38
+ <li><a href="/settings">Settings</a></li>
39
+ </ul>
40
+ <form class="navbar-form navbar-right">
41
+ <input type="text" class="form-control" placeholder="Search...">
42
+ </form>
43
+ </div>
44
+ </div>
45
+ </nav>
46
+
47
+ <div class="container-fluid">
48
+ <div class="row">
49
+
50
+ <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
51
+ <h1 class="page-header">Dashboard</h1>
52
+
53
+ <div class="row placeholders">
54
+ <div class="col-xs-6 col-sm-3 placeholder">
55
+ <img src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail">
56
+ <h4>Label</h4>
57
+ <span class="text-muted">Something else</span>
58
+ </div>
59
+ <div class="col-xs-6 col-sm-3 placeholder">
60
+ <img src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail">
61
+ <h4>Label</h4>
62
+ <span class="text-muted">Something else</span>
63
+ </div>
64
+ <div class="col-xs-6 col-sm-3 placeholder">
65
+ <img src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail">
66
+ <h4>Label</h4>
67
+ <span class="text-muted">Something else</span>
68
+ </div>
69
+ <div class="col-xs-6 col-sm-3 placeholder">
70
+ <img src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail">
71
+ <h4>Label</h4>
72
+ <span class="text-muted">Something else</span>
73
+ </div>
74
+ </div>
75
+
76
+ <h2 class="sub-header">Mailboxes</h2>
77
+ <div class="table-responsive">
78
+ <table class="table table-striped">
79
+ <thead>
80
+ <tr>
81
+ <th>Email Address</th>
82
+ <th>Host</th>
83
+ <th>Delivery Method</th>
84
+ </tr>
85
+ </thead>
86
+ <tbody>
87
+ <% @mailboxes.each do |mailbox| %>
88
+ <tr>
89
+ <td><%= mailbox[:email] %></td>
90
+ <td><%= mailbox[:host] %></td>
91
+ <td><%= mailbox[:delivery_method] %></td>
92
+ </tr>
93
+ <% end %>
94
+ </tbody>
95
+ </table>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+
101
+ <!-- Bootstrap core JavaScript
102
+ ================================================== -->
103
+ <!-- Placed at the end of the document so the pages load faster -->
104
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
105
+ <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
106
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
107
+
108
+
109
+ <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
110
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
111
+
112
+ </body>
113
+ </html>
@@ -0,0 +1,100 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
8
+ <title>CaseBlocks Email Watcher</title>
9
+
10
+ <!-- Bootstrap -->
11
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
12
+ <link href="dashboard.css" rel="stylesheet">
13
+ <link href="custom.css" rel="stylesheet">
14
+
15
+
16
+ <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
17
+ <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
18
+ <!--[if lt IE 9]>
19
+ <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
20
+ <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
21
+ <![endif]-->
22
+ </head>
23
+ <body>
24
+
25
+ <nav class="navbar navbar-inverse navbar-fixed-top">
26
+ <div class="container-fluid">
27
+ <div class="navbar-header">
28
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
29
+ <span class="sr-only">Toggle navigation</span>
30
+ <span class="icon-bar"></span>
31
+ <span class="icon-bar"></span>
32
+ <span class="icon-bar"></span>
33
+ </button>
34
+ <a class="navbar-brand" href="#">CaseBlocks Email Watcher</a>
35
+ </div>
36
+ <div id="navbar" class="navbar-collapse collapse">
37
+ <ul class="nav navbar-nav navbar-right">
38
+ <li><a href="/">Dashboard</a></li>
39
+ <li><a href="/reload">Reload Configuration</a></li>
40
+ </ul>
41
+ <form class="navbar-form navbar-right">
42
+ <input type="text" class="form-control" placeholder="Search...">
43
+ </form>
44
+ </div>
45
+ </div>
46
+ </nav>
47
+
48
+ <div class="container-fluid">
49
+ <div class="row">
50
+ <div class="col-sm-9 col-md-10 main" style="width: 100%;">
51
+ <!-- <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> -->
52
+
53
+ <h2 class="sub-header">Mailboxes</h2>
54
+ <div class="table-responsive">
55
+ <table class="table table-striped">
56
+ <thead>
57
+ <tr>
58
+ <th></th>
59
+ <th>Email Address</th>
60
+ <th>Host</th>
61
+ <th>Port</th>
62
+ <th>SSL</th>
63
+ <th>Start TLS</th>
64
+ <th>Messages Processed</th>
65
+ <th>Last Processed At</th>
66
+ </tr>
67
+ </thead>
68
+ <tbody>
69
+ <% @mailboxes.each do |mailbox| %>
70
+ <tr>
71
+ <td><div class="status-circle <%=mailbox[:status_colour]%>"></td>
72
+ <td><%= mailbox[:email] %></td>
73
+ <td><%= mailbox[:host] %></td>
74
+ <td><%= mailbox[:port] %></td>
75
+ <td><%= !!mailbox[:ssl] ? "Yes" : "No" %></td>
76
+ <td><%= mailbox[:start_tls] ? "Yes" : "No" %></td>
77
+ <td><%= mailbox[:message_count] %></td>
78
+ <td><%= mailbox[:last_delivered_at] %></td>
79
+ </tr>
80
+ <% end %>
81
+ </tbody>
82
+ </table>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </div>
87
+
88
+ <!-- Bootstrap core JavaScript
89
+ ================================================== -->
90
+ <!-- Placed at the end of the document so the pages load faster -->
91
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
92
+ <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
93
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
94
+
95
+
96
+ <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
97
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
98
+
99
+ </body>
100
+ </html>
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mail_daemon/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mail_daemon"
8
+ spec.version = MailDaemon::VERSION
9
+ spec.authors = ["EmergeAdapt"]
10
+ spec.email = ["development@emergeadapt.com"]
11
+ spec.summary = %q{IMAP account daemon to watch for new mail and to execute a ruby block with data from message.}
12
+ spec.description = %q{.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "awesome_print"
24
+
25
+ spec.add_dependency 'mysql2'
26
+ spec.add_dependency 'sidekiq'
27
+ spec.add_dependency 'mail'
28
+ # spec.add_dependency 'mail_room'
29
+ spec.add_dependency 'charlock_holmes' # required for sidekiq delivery
30
+ spec.add_dependency 'nokogiri'
31
+ spec.add_dependency 'sinatra'
32
+ spec.add_dependency 'sanitize'
33
+
34
+
35
+ end
@@ -0,0 +1,20 @@
1
+ require "minitest/autorun"
2
+
3
+ class TestOrder < Minitest::Test
4
+ def setup
5
+ @sample = {}
6
+ @order = Order.new(@sample)
7
+ end
8
+
9
+ def test_that_kitty_can_eat
10
+ assert_equal "OHAI!", @meme.i_can_has_cheezburger?
11
+ end
12
+
13
+ def test_that_it_will_not_blend
14
+ refute_match /^no/i, @meme.will_it_blend?
15
+ end
16
+
17
+ def test_that_will_be_skipped
18
+ skip "test this later"
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class VersionTest < MiniTest::Unit::TestCase
4
+ def test_version
5
+ assert_equal '0.0.1', mail_daemon::VERSION
6
+ end
7
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../test_helper'
2
+
3
+ class MessageHandlerTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ ENV['CB_API_ENDPOINT'] = 'https://cb.local/'
6
+ ENV['CB_API_TOKEN'] = '1234'
7
+ end
8
+ def test_invalid_construction
9
+ ENV['AWS_ACCESS_KEY'] = nil
10
+ ENV['AWS_SECRET_ACCESS_KEY'] = nil
11
+ ENV['CB_API_ENDPOINT'] = nil
12
+ ENV['CB_API_TOKEN'] = nil
13
+ assert_raises(RuntimeError) { mail_daemon::OrderHandler.new }
14
+ end
15
+ def test_valid_construction
16
+ ENV['AWS_ACCESS_KEY'] = 'access'
17
+ ENV['AWS_SECRET_ACCESS_KEY'] = 'secret'
18
+ refute_nil mail_daemon::OrderHandler.new
19
+ end
20
+ def test_basic_sqs_connectivity
21
+ oh = mail_daemon::OrderHandler.new
22
+ result = oh.send_orders
23
+
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/pride'
3
+ require File.expand_path('../../lib/mail_daemon.rb', __FILE__)
metadata ADDED
@@ -0,0 +1,221 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mail_daemon
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ platform: ruby
6
+ authors:
7
+ - EmergeAdapt
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: awesome_print
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mysql2
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sidekiq
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: mail
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: charlock_holmes
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: nokogiri
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sinatra
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: sanitize
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: "."
154
+ email:
155
+ - development@emergeadapt.com
156
+ executables:
157
+ - mail_daemon
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - ".gitignore"
162
+ - ".ruby-gemset"
163
+ - ".ruby-version"
164
+ - Gemfile
165
+ - LICENSE
166
+ - LICENSE.txt
167
+ - README.md
168
+ - Rakefile
169
+ - bin/mail_daemon
170
+ - config.yml
171
+ - lib/mail_daemon.rb
172
+ - lib/mail_daemon/email_body_parser.rb
173
+ - lib/mail_daemon/email_handler.rb
174
+ - lib/mail_daemon/email_watcher.rb
175
+ - lib/mail_daemon/encryption.rb
176
+ - lib/mail_daemon/helpers.rb
177
+ - lib/mail_daemon/imap/connection.rb
178
+ - lib/mail_daemon/imap/statuses.rb
179
+ - lib/mail_daemon/imap/watcher.rb
180
+ - lib/mail_daemon/imap_watcher.rb
181
+ - lib/mail_daemon/version.rb
182
+ - lib/public/custom.css
183
+ - lib/public/dashboard.css
184
+ - lib/server.rb
185
+ - lib/views/settings.erb
186
+ - lib/views/stats.erb
187
+ - mail_daemon.gemspec
188
+ - test/lib/order2cb/order_test.rb
189
+ - test/lib/order2cb/version_test.rb
190
+ - test/lib/order2cb_test.rb
191
+ - test/test_helper.rb
192
+ homepage: ''
193
+ licenses:
194
+ - MIT
195
+ metadata: {}
196
+ post_install_message:
197
+ rdoc_options: []
198
+ require_paths:
199
+ - lib
200
+ required_ruby_version: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ required_rubygems_version: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ requirements: []
211
+ rubyforge_project:
212
+ rubygems_version: 2.4.5.1
213
+ signing_key:
214
+ specification_version: 4
215
+ summary: IMAP account daemon to watch for new mail and to execute a ruby block with
216
+ data from message.
217
+ test_files:
218
+ - test/lib/order2cb/order_test.rb
219
+ - test/lib/order2cb/version_test.rb
220
+ - test/lib/order2cb_test.rb
221
+ - test/test_helper.rb