mailman 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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
@@ -1,6 +1,6 @@
1
1
  The MIT License
2
2
 
3
- Copyright (c) 2010-2012 Jonathan Rudenberg
3
+ Copyright (c) 2010-2013 Jonathan Rudenberg
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
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 1.8.7, 1.9.2, 1.9.3, REE, JRuby 1.7, and Rubinius.
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 the [Ruby Summer of Code](http://rubysoc.org),
37
- and my mentor was [Steven Soroka](http://github.com/ssoroka).
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-2012 Jonathan Rudenberg. See LICENSE for details.
33
+ Copyright (c) 2010-2013 Jonathan Rudenberg. See LICENSE for details.
@@ -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
+ ```
@@ -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
@@ -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
 
@@ -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
- app = new(&block)
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
- @processor = MessageProcessor.new(:router => @router)
31
+ @config = select_config(config)
32
+ @processor = MessageProcessor.new(:router => @router, :config => @config)
25
33
 
26
- if Mailman.config.maildir
34
+ if self.config.maildir
27
35
  require 'maildir'
28
- @maildir = Maildir.new(Mailman.config.maildir)
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
- Mailman.config.poll_interval > 0 && !@polling_interrupt
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 Mailman.config.rails_root
48
- rails_env = File.join(Mailman.config.rails_root, 'config', 'environment.rb')
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 #{Mailman.config.rails_root}, requiring environment..."
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 Mailman.config.graceful_death
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 !Mailman.config.ignore_stdin && $stdin.fcntl(Fcntl::F_GETFL, 0) == 0
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 Mailman.config.imap
67
- options = {:processor => @processor}.merge(Mailman.config.imap)
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 Mailman.config.pop3
73
- options = {:processor => @processor}.merge(Mailman.config.pop3)
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 Mailman.config.maildir
86
+ elsif config.maildir
79
87
 
80
- Mailman.logger.info "Maildir receiver enabled (#{Mailman.config.maildir})."
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 Mailman.config.watch_maildir
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 #{Mailman.config.poll_interval} seconds."
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 Mailman.config.poll_interval
140
+ sleep config.poll_interval
126
141
  end
127
142
  end
128
143
 
@@ -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
- @router.route(mail)
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.
@@ -1,3 +1,3 @@
1
1
  module Mailman
2
- VERSION = '0.6.0'
2
+ VERSION = '0.7.0'
3
3
  end
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.6.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-01-13 00:00:00.000000000 Z
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
- homepage: http://mailmanrb.com
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: 1.8.23
148
+ rubygems_version: 2.0.3
158
149
  signing_key:
159
- specification_version: 3
150
+ specification_version: 4
160
151
  summary: A incoming email processing microframework
161
152
  test_files: []