mail_daemon 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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