mailman 0.6.0 → 0.7.0
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +108 -0
- data/LICENSE +1 -1
- data/README.md +4 -32
- data/USER_GUIDE.md +26 -0
- data/bin/mailman +25 -0
- data/lib/mailman.rb +1 -1
- data/lib/mailman/application.rb +36 -21
- data/lib/mailman/cli.rb +39 -0
- data/lib/mailman/configuration.rb +12 -0
- data/lib/mailman/message_processor.rb +6 -1
- data/lib/mailman/middleware.rb +47 -0
- data/lib/mailman/receiver/imap.rb +1 -1
- data/lib/mailman/receiver/pop3.rb +2 -0
- data/lib/mailman/version.rb +1 -1
- metadata +24 -33
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cdeb5aa44e41f7d2b6d9b4652ab467d26a160699
|
4
|
+
data.tar.gz: 4ee7a90bc537c2f38b300227c50e0f0780dd956b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 569481ea8e5df1b94f809c93af6071303c4c22093c3fcaf4721c0924b8c6d719320c4853a8dd93ca243877f14f2aa1da843f050080a04155e4708febb64eeeb9
|
7
|
+
data.tar.gz: 78382077fab9d79e6088d85e693f99ff59b8a58b5e9d5d7ec64bd30aa02a7986924f4f2a3535e602fc5735cc0185b0601e596f569b5b6da69d8d16adc9b1bcf1
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
## 0.7.0 (August 11, 2013)
|
2
|
+
|
3
|
+
Features
|
4
|
+
|
5
|
+
- Configurable POP3 open_timeout and read_timeout values
|
6
|
+
- Middleware support
|
7
|
+
- CLI runner tool
|
8
|
+
- Multiple configurations
|
9
|
+
|
10
|
+
|
11
|
+
## 0.6.0 (January 12, 2013)
|
12
|
+
|
13
|
+
Features
|
14
|
+
|
15
|
+
- IMAP: Mark messages as seen instead of deleting them (see [5b6aef0](https://github.com/titanous/mailman/commit/5b6aef0163f0f28c790abf3083cbda7cbc9cc13f) for details on how revert to the previous behaviour)
|
16
|
+
|
17
|
+
Bugfixes
|
18
|
+
|
19
|
+
- IMAP: Don't only process recent messages
|
20
|
+
|
21
|
+
|
22
|
+
## 0.5.4 (January 3, 2013)
|
23
|
+
|
24
|
+
Bufixes
|
25
|
+
|
26
|
+
- Fix multipart message matching
|
27
|
+
- Fix Rails environment require
|
28
|
+
- Speed up maildir processing
|
29
|
+
|
30
|
+
|
31
|
+
## 0.5.3 (August 30, 2012)
|
32
|
+
|
33
|
+
Features
|
34
|
+
|
35
|
+
- Add `watch_maildir` config flag that allows a single run against a maildir
|
36
|
+
- Add IMAP SSL and non-inbox folder support
|
37
|
+
|
38
|
+
|
39
|
+
## 0.5.2 (June 13, 2012)
|
40
|
+
|
41
|
+
Bugfixes
|
42
|
+
|
43
|
+
- Clear the params hash after each message
|
44
|
+
- Allow setting config.rails\_root to false
|
45
|
+
|
46
|
+
|
47
|
+
## 0.5.1 (May 9, 2012)
|
48
|
+
|
49
|
+
Bugfixes
|
50
|
+
|
51
|
+
- Check maildir on startup to catch any pre-existing messages
|
52
|
+
- Rescue errors while processing messages so that the app doesn't die
|
53
|
+
|
54
|
+
|
55
|
+
## 0.5.0 (April 24, 2012)
|
56
|
+
|
57
|
+
Features
|
58
|
+
|
59
|
+
- IMAP support
|
60
|
+
- Graceful death
|
61
|
+
|
62
|
+
Bugfixes
|
63
|
+
|
64
|
+
- Check all new messages in Maildir when a file changes
|
65
|
+
- Don't move message from new to current in Maildir if process failed
|
66
|
+
- Avoid require listen if not use
|
67
|
+
- Avoid failing if POP3::Connection raises an exception
|
68
|
+
- Check multipart bodies properly
|
69
|
+
- Use listen gem instead of fssm
|
70
|
+
- Don't die if the Rails environment is already loaded
|
71
|
+
|
72
|
+
|
73
|
+
## 0.4.0 (October 3, 2010)
|
74
|
+
|
75
|
+
Features
|
76
|
+
|
77
|
+
- The `ignore_stdin` config option has been added
|
78
|
+
|
79
|
+
Bugfixes
|
80
|
+
|
81
|
+
- Fix a Mail/ActiveSupport dependency issue with i18n
|
82
|
+
|
83
|
+
|
84
|
+
## 0.3.0 (September 2, 2010)
|
85
|
+
|
86
|
+
Features
|
87
|
+
|
88
|
+
- The `CC` condition has been added
|
89
|
+
- The router can route to class instance methods as well as blocks
|
90
|
+
- SSL is now supported by the POP3 receiver
|
91
|
+
|
92
|
+
Bugfixes
|
93
|
+
|
94
|
+
- Fix a bug where messages were not being deleted properly by the POP3
|
95
|
+
polling loop
|
96
|
+
- Fix empty `To` fields crashing apps
|
97
|
+
|
98
|
+
|
99
|
+
## 0.2.0 (July 28, 2010
|
100
|
+
|
101
|
+
Features
|
102
|
+
|
103
|
+
- Add `Application.run` instead of Application.new().run
|
104
|
+
|
105
|
+
|
106
|
+
## 0.1.0 (July 27, 2010)
|
107
|
+
|
108
|
+
Initial release.
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -21,41 +21,13 @@ See the [User Guide](https://github.com/titanous/mailman/blob/master/USER_GUIDE.
|
|
21
21
|
|
22
22
|
## Compatibility
|
23
23
|
|
24
|
-
Tested on Ruby
|
25
|
-
|
26
|
-
### Dependencies
|
27
|
-
|
28
|
-
* mail >= 2.0.3
|
29
|
-
* activesupport >= 2.3.4
|
30
|
-
* listen >= 0.4.1
|
31
|
-
* maildir >= 0.5.0
|
32
|
-
* i18n >= 0.4.1
|
24
|
+
Tested on Ruby 2.0, 1.9.3, JRuby, and Rubinius.
|
33
25
|
|
34
26
|
## Thanks
|
35
27
|
|
36
|
-
This project was sponsored by
|
37
|
-
|
38
|
-
|
39
|
-
### Contributors
|
40
|
-
|
41
|
-
- [Nicolas Aguttes](http://github.com/tranquiliste)
|
42
|
-
- [Nathan Broadbent](https://github.com/ndbroadbent)
|
43
|
-
- [John Cant](https://github.com/johncant)
|
44
|
-
- [Tim Carey-Smith](http://github.com/halorgium)
|
45
|
-
- [Dan Cheail](https://github.com/DanCheail)
|
46
|
-
- [Francis Chong](https://github.com/siuying)
|
47
|
-
- [Kevin Glowacz](https://github.com/kjg)
|
48
|
-
- [Cyril Mougel](http://github.com/shingara)
|
49
|
-
- [Brian Palmer](https://github.com/codekitchen)
|
50
|
-
- [Phillip Ridlen](https://github.com/philtr)
|
51
|
-
- [Daniel Schierbeck](http://github.com/dasch)
|
52
|
-
- [Steven Soroka](http://github.com/ssoroka)
|
53
|
-
- [Ryan Stawarz](https://github.com/rstawarz)
|
54
|
-
- [Benjamin Waldher](https://github.com/lgbr)
|
55
|
-
- [Ian White](http://github.com/ianwhite)
|
56
|
-
- [Andreas Wolff](https://github.com/rubyphunk)
|
57
|
-
|
28
|
+
This project was originally sponsored by Ruby Summer of Code (2010), and
|
29
|
+
mentored by [Steven Soroka](http://github.com/ssoroka).
|
58
30
|
|
59
31
|
## Copyright
|
60
32
|
|
61
|
-
Copyright (c) 2010-
|
33
|
+
Copyright (c) 2010-2013 Jonathan Rudenberg. See LICENSE for details.
|
data/USER_GUIDE.md
CHANGED
@@ -269,3 +269,29 @@ interfere with running Mailman with cron or as a daemon.
|
|
269
269
|
(Control-C) and allow the mail receiver to finish its current
|
270
270
|
iteration before exiting. Note that this currently only works
|
271
271
|
with POP3 receivers.
|
272
|
+
|
273
|
+
### Middleware
|
274
|
+
|
275
|
+
`Mailman.config.middleware` gives you access to the Mailman middleware stack.
|
276
|
+
Middleware allows you to execute code before and after each message is
|
277
|
+
processed. Middleware is super useful for things like error handling and any
|
278
|
+
other actions you need to do before/after each message is processed.
|
279
|
+
|
280
|
+
Here's an example of some simple error logging middleware:
|
281
|
+
|
282
|
+
```ruby
|
283
|
+
# Define the middleware
|
284
|
+
class ErrorLoggingMiddleware
|
285
|
+
def call(mail)
|
286
|
+
begin
|
287
|
+
yield
|
288
|
+
rescue
|
289
|
+
puts "There was an error processing this message! #{mail.subject}"
|
290
|
+
raise
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
# Add it to the Mailman middleware stack
|
296
|
+
Mailman.config.middleware.add ErrorLoggingMiddleware
|
297
|
+
```
|
data/bin/mailman
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'mailman/cli'
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
$:.<< '.'
|
7
|
+
|
8
|
+
options = {}
|
9
|
+
|
10
|
+
ARGV.options do |opts|
|
11
|
+
opts.on('-c', '--config=val', String) { |config_file| options[:config_file] = config_file }
|
12
|
+
opts.on('-p', '--pidfile=val', String) { |pid_file| options[:pid_file] = pid_file }
|
13
|
+
opts.on('-e', '--environment=val', String) { |environment| options[:environment] = environment }
|
14
|
+
|
15
|
+
opts.parse!
|
16
|
+
end
|
17
|
+
|
18
|
+
begin
|
19
|
+
Mailman::CLI.new(options).run
|
20
|
+
rescue => e
|
21
|
+
STDERR.puts e
|
22
|
+
STDERR.puts e.backtrace.join("\n")
|
23
|
+
|
24
|
+
exit 1
|
25
|
+
end
|
data/lib/mailman.rb
CHANGED
@@ -9,7 +9,7 @@ require 'mailman/version'
|
|
9
9
|
|
10
10
|
module Mailman
|
11
11
|
|
12
|
-
[:Application, :Router, :Configuration, :Receiver, :MessageProcessor].each do |constant|
|
12
|
+
[:Application, :Router, :Configuration, :Receiver, :MessageProcessor, :Middleware].each do |constant|
|
13
13
|
autoload constant, "mailman/#{constant.to_s.underscore}"
|
14
14
|
end
|
15
15
|
|
data/lib/mailman/application.rb
CHANGED
@@ -2,8 +2,12 @@ module Mailman
|
|
2
2
|
# The main application class. Pass a block to {#new} to create a new app.
|
3
3
|
class Application
|
4
4
|
|
5
|
-
def self.run(&block)
|
6
|
-
|
5
|
+
def self.run(config=nil, &block)
|
6
|
+
if config
|
7
|
+
app = new(config, &block)
|
8
|
+
else
|
9
|
+
app = new(&block)
|
10
|
+
end
|
7
11
|
app.run
|
8
12
|
app
|
9
13
|
end
|
@@ -14,25 +18,29 @@ module Mailman
|
|
14
18
|
# @return [MessageProcessor] the app's message processor
|
15
19
|
attr_reader :processor
|
16
20
|
|
21
|
+
# @return [Config] the apps's configuration
|
22
|
+
attr_reader :config
|
23
|
+
|
17
24
|
# Creates a new router, and sets up any routes passed in the block.
|
18
25
|
# @param [Hash] options the application options
|
19
26
|
# @option options [true,false] :graceful_death catch interrupt signal and don't die until end of poll
|
20
27
|
# @param [Proc] block a block with routes
|
21
28
|
|
22
|
-
def initialize(&block)
|
29
|
+
def initialize(config=:default, &block)
|
23
30
|
@router = Mailman::Router.new
|
24
|
-
@
|
31
|
+
@config = select_config(config)
|
32
|
+
@processor = MessageProcessor.new(:router => @router, :config => @config)
|
25
33
|
|
26
|
-
if
|
34
|
+
if self.config.maildir
|
27
35
|
require 'maildir'
|
28
|
-
@maildir = Maildir.new(
|
36
|
+
@maildir = Maildir.new(self.config.maildir)
|
29
37
|
end
|
30
38
|
|
31
39
|
instance_eval(&block) if block_given?
|
32
40
|
end
|
33
41
|
|
34
42
|
def polling?
|
35
|
-
|
43
|
+
config.poll_interval > 0 && !@polling_interrupt
|
36
44
|
end
|
37
45
|
|
38
46
|
# Sets the block to run if no routes match a message.
|
@@ -44,47 +52,47 @@ module Mailman
|
|
44
52
|
def run
|
45
53
|
Mailman.logger.info "Mailman v#{Mailman::VERSION} started"
|
46
54
|
|
47
|
-
if
|
48
|
-
rails_env = File.join(
|
55
|
+
if config.rails_root
|
56
|
+
rails_env = File.join(config.rails_root, 'config', 'environment.rb')
|
49
57
|
if File.exist?(rails_env) && !(defined?(Rails) && Rails.env)
|
50
|
-
Mailman.logger.info "Rails root found in #{
|
58
|
+
Mailman.logger.info "Rails root found in #{config.rails_root}, requiring environment..."
|
51
59
|
require rails_env
|
52
60
|
end
|
53
61
|
end
|
54
62
|
|
55
|
-
if
|
63
|
+
if config.graceful_death
|
56
64
|
# When user presses CTRL-C, finish processing current message before exiting
|
57
65
|
Signal.trap("INT") { @polling_interrupt = true }
|
58
66
|
end
|
59
67
|
|
60
68
|
# STDIN
|
61
|
-
if !
|
69
|
+
if !config.ignore_stdin && $stdin.fcntl(Fcntl::F_GETFL, 0) == 0
|
62
70
|
Mailman.logger.debug "Processing message from STDIN."
|
63
71
|
@processor.process($stdin.read)
|
64
72
|
|
65
73
|
# IMAP
|
66
|
-
elsif
|
67
|
-
options = {:processor => @processor}.merge(
|
74
|
+
elsif config.imap
|
75
|
+
options = {:processor => @processor}.merge(config.imap)
|
68
76
|
Mailman.logger.info "IMAP receiver enabled (#{options[:username]}@#{options[:server]})."
|
69
77
|
polling_loop Receiver::IMAP.new(options)
|
70
78
|
|
71
79
|
# POP3
|
72
|
-
elsif
|
73
|
-
options = {:processor => @processor}.merge(
|
80
|
+
elsif config.pop3
|
81
|
+
options = {:processor => @processor}.merge(config.pop3)
|
74
82
|
Mailman.logger.info "POP3 receiver enabled (#{options[:username]}@#{options[:server]})."
|
75
83
|
polling_loop Receiver::POP3.new(options)
|
76
84
|
|
77
85
|
# Maildir
|
78
|
-
elsif
|
86
|
+
elsif config.maildir
|
79
87
|
|
80
|
-
Mailman.logger.info "Maildir receiver enabled (#{
|
88
|
+
Mailman.logger.info "Maildir receiver enabled (#{config.maildir})."
|
81
89
|
|
82
90
|
Mailman.logger.debug "Processing new message queue..."
|
83
91
|
@maildir.list(:new).each do |message|
|
84
92
|
@processor.process_maildir_message(message)
|
85
93
|
end
|
86
94
|
|
87
|
-
if
|
95
|
+
if config.watch_maildir
|
88
96
|
require 'listen'
|
89
97
|
Mailman.logger.debug "Monitoring the Maildir for new messages..."
|
90
98
|
|
@@ -103,10 +111,17 @@ module Mailman
|
|
103
111
|
|
104
112
|
private
|
105
113
|
|
114
|
+
def select_config(new_config)
|
115
|
+
return Mailman.config if new_config == :default
|
116
|
+
return new_config if new_config.is_a?(Configuration)
|
117
|
+
return Configuration.from_hash(new_config) if new_config.is_a?(Hash)
|
118
|
+
return Configuration.new
|
119
|
+
end
|
120
|
+
|
106
121
|
# Run the polling loop for the email inbox connection
|
107
122
|
def polling_loop(connection)
|
108
123
|
if polling?
|
109
|
-
polling_msg = "Polling enabled. Checking every #{
|
124
|
+
polling_msg = "Polling enabled. Checking every #{config.poll_interval} seconds."
|
110
125
|
else
|
111
126
|
polling_msg = "Polling disabled. Checking for messages once."
|
112
127
|
end
|
@@ -122,7 +137,7 @@ module Mailman
|
|
122
137
|
end
|
123
138
|
|
124
139
|
break unless polling?
|
125
|
-
sleep
|
140
|
+
sleep config.poll_interval
|
126
141
|
end
|
127
142
|
end
|
128
143
|
|
data/lib/mailman/cli.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'mailman'
|
2
|
+
|
3
|
+
module Mailman
|
4
|
+
class CLI
|
5
|
+
class ConfigNotDefined < StandardError; end
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
@config_file = options[:config_file]
|
9
|
+
@pid_file = options[:pid_file]
|
10
|
+
@environment = options[:environment]
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
set_environment
|
15
|
+
record_pid_file
|
16
|
+
load_config
|
17
|
+
end
|
18
|
+
|
19
|
+
def set_environment
|
20
|
+
ENV['RACK_ENV'] = ENV['RAILS_ENV'] = @environment
|
21
|
+
end
|
22
|
+
|
23
|
+
def load_config
|
24
|
+
if @config_file
|
25
|
+
require @config_file
|
26
|
+
else
|
27
|
+
raise ConfigNotDefined.new
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def record_pid_file
|
32
|
+
if @pid_file
|
33
|
+
File.open(@pid_file, 'w') do |f|
|
34
|
+
f.puts Process.pid
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -31,6 +31,10 @@ module Mailman
|
|
31
31
|
# connections.
|
32
32
|
attr_accessor :graceful_death
|
33
33
|
|
34
|
+
def middleware
|
35
|
+
@middleware ||= Mailman::Middleware.new
|
36
|
+
end
|
37
|
+
|
34
38
|
def logger
|
35
39
|
@logger ||= Logger.new(STDOUT)
|
36
40
|
end
|
@@ -47,5 +51,13 @@ module Mailman
|
|
47
51
|
@rails_root.nil? ? '.' : @rails_root
|
48
52
|
end
|
49
53
|
|
54
|
+
def self.from_hash(options)
|
55
|
+
config = self.new
|
56
|
+
options.each do |key, value|
|
57
|
+
config.send "#{key}=", value
|
58
|
+
end
|
59
|
+
config
|
60
|
+
end
|
61
|
+
|
50
62
|
end
|
51
63
|
end
|
@@ -7,6 +7,7 @@ module Mailman
|
|
7
7
|
# messages to
|
8
8
|
def initialize(options)
|
9
9
|
@router = options[:router]
|
10
|
+
@config = options[:config]
|
10
11
|
end
|
11
12
|
|
12
13
|
# Converts a raw email into a +Mail::Message+ instance, and passes it to the
|
@@ -16,7 +17,11 @@ module Mailman
|
|
16
17
|
mail = Mail.new(message)
|
17
18
|
from = mail.from.nil? ? "unknown" : mail.from.first
|
18
19
|
Mailman.logger.info "Got new message from '#{from}' with subject '#{mail.subject}'."
|
19
|
-
|
20
|
+
|
21
|
+
# Run any middlewares before routing the message
|
22
|
+
@config.middleware.run(mail) do
|
23
|
+
@router.route(mail)
|
24
|
+
end
|
20
25
|
end
|
21
26
|
|
22
27
|
# Processes a +Maildir::Message+ instance.
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Mailman
|
2
|
+
class Middleware
|
3
|
+
attr_reader :entries
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@entries = []
|
7
|
+
yield self if block_given?
|
8
|
+
end
|
9
|
+
|
10
|
+
def add(klass)
|
11
|
+
entries << klass
|
12
|
+
end
|
13
|
+
|
14
|
+
def remove(klass)
|
15
|
+
entries.delete(klass)
|
16
|
+
end
|
17
|
+
|
18
|
+
def insert_before(oldklass, newklass)
|
19
|
+
idx = entries.index(oldklass) || 0
|
20
|
+
entries.insert(idx, newklass)
|
21
|
+
end
|
22
|
+
|
23
|
+
def insert_after(oldklass, newklass)
|
24
|
+
idx = entries.rindex(oldklass) || entries.count - 1
|
25
|
+
entries.insert(idx+1, newklass)
|
26
|
+
end
|
27
|
+
|
28
|
+
def run(*args, &final_action)
|
29
|
+
final_return = nil
|
30
|
+
stack = @entries.map {|m| m.new}
|
31
|
+
traverse_stack = lambda do
|
32
|
+
if stack.empty?
|
33
|
+
final_return = final_action.call
|
34
|
+
else
|
35
|
+
stack.shift.call(*args, &traverse_stack)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
traverse_stack.call
|
39
|
+
|
40
|
+
final_return
|
41
|
+
end
|
42
|
+
|
43
|
+
def each(&block)
|
44
|
+
entries.each(&block)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -36,7 +36,7 @@ module Mailman
|
|
36
36
|
# Connects to the IMAP server.
|
37
37
|
def connect
|
38
38
|
if @connection.nil? or @connection.disconnected?
|
39
|
-
@connection = Net::IMAP.new(@server, @port, @ssl)
|
39
|
+
@connection = Net::IMAP.new(@server, port: @port, ssl: @ssl)
|
40
40
|
@connection.login(@username, @password)
|
41
41
|
end
|
42
42
|
@connection.select(@folder)
|
@@ -22,6 +22,8 @@ module Mailman
|
|
22
22
|
@password = options[:password]
|
23
23
|
@connection = Net::POP3.new(options[:server], options[:port])
|
24
24
|
@connection.enable_ssl(OpenSSL::SSL::VERIFY_NONE) if options[:ssl]
|
25
|
+
@connection.open_timeout = options[:open_timeout] if options[:open_timeout]
|
26
|
+
@connection.read_timeout = options[:read_timeout] if options[:read_timeout]
|
25
27
|
end
|
26
28
|
|
27
29
|
# Connects to the POP3 server.
|
data/lib/mailman/version.rb
CHANGED
metadata
CHANGED
@@ -1,100 +1,88 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.7.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jonathan Rudenberg
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-08-11 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: mail
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 2.0.3
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 2.0.3
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: activesupport
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: 2.3.4
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: 2.3.4
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: listen
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: 0.4.1
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: 0.4.1
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: maildir
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: 0.5.0
|
70
62
|
type: :runtime
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: 0.5.0
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: i18n
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: 0.4.1
|
86
76
|
type: :runtime
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - '>='
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: 0.4.1
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: rspec
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
87
|
- - ~>
|
100
88
|
- !ruby/object:Gem::Version
|
@@ -102,7 +90,6 @@ dependencies:
|
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
94
|
- - ~>
|
108
95
|
- !ruby/object:Gem::Version
|
@@ -111,13 +98,17 @@ description: Mailman makes it easy to process incoming emails with a simple rout
|
|
111
98
|
DSL
|
112
99
|
email:
|
113
100
|
- jonathan@titanous.com
|
114
|
-
executables:
|
101
|
+
executables:
|
102
|
+
- mailman
|
115
103
|
extensions: []
|
116
104
|
extra_rdoc_files: []
|
117
105
|
files:
|
106
|
+
- bin/mailman
|
118
107
|
- lib/mailman/application.rb
|
108
|
+
- lib/mailman/cli.rb
|
119
109
|
- lib/mailman/configuration.rb
|
120
110
|
- lib/mailman/message_processor.rb
|
111
|
+
- lib/mailman/middleware.rb
|
121
112
|
- lib/mailman/receiver/imap.rb
|
122
113
|
- lib/mailman/receiver/pop3.rb
|
123
114
|
- lib/mailman/receiver.rb
|
@@ -134,28 +125,28 @@ files:
|
|
134
125
|
- LICENSE
|
135
126
|
- README.md
|
136
127
|
- USER_GUIDE.md
|
137
|
-
|
128
|
+
- CHANGELOG.md
|
129
|
+
homepage: https://github.com/titanous/mailman
|
138
130
|
licenses: []
|
131
|
+
metadata: {}
|
139
132
|
post_install_message:
|
140
133
|
rdoc_options: []
|
141
134
|
require_paths:
|
142
135
|
- lib
|
143
136
|
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
-
none: false
|
145
137
|
requirements:
|
146
|
-
- -
|
138
|
+
- - '>='
|
147
139
|
- !ruby/object:Gem::Version
|
148
140
|
version: '0'
|
149
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
|
-
none: false
|
151
142
|
requirements:
|
152
|
-
- -
|
143
|
+
- - '>='
|
153
144
|
- !ruby/object:Gem::Version
|
154
145
|
version: '0'
|
155
146
|
requirements: []
|
156
147
|
rubyforge_project: mailman
|
157
|
-
rubygems_version:
|
148
|
+
rubygems_version: 2.0.3
|
158
149
|
signing_key:
|
159
|
-
specification_version:
|
150
|
+
specification_version: 4
|
160
151
|
summary: A incoming email processing microframework
|
161
152
|
test_files: []
|