mailman 0.2.0 → 0.3.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.
- data/README.md +6 -1
- data/USER_GUIDE.md +25 -6
- data/lib/mailman/application.rb +14 -13
- data/lib/mailman/receiver/pop3.rb +2 -0
- data/lib/mailman/route/condition.rb +4 -3
- data/lib/mailman/route/conditions.rb +20 -3
- data/lib/mailman/route.rb +6 -2
- data/lib/mailman/router.rb +8 -1
- data/lib/mailman/version.rb +1 -1
- metadata +3 -3
data/README.md
CHANGED
@@ -10,7 +10,7 @@ support), that works with Rails "out of the box".
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
See the
|
13
|
+
See the [USER_GUIDE.md](http://rubydoc.info/github/titanous/mailman/master/file/USER_GUIDE.md) for more information.
|
14
14
|
|
15
15
|
## Installation
|
16
16
|
|
@@ -21,6 +21,11 @@ See the {file:USER_GUIDE.md} for more information.
|
|
21
21
|
This project is sponsored by the [Ruby Summer of Code](http://rubysoc.org),
|
22
22
|
and my mentor is [Steven Soroka](http://github.com/ssoroka).
|
23
23
|
|
24
|
+
### Contributors
|
25
|
+
|
26
|
+
Tim Carey-Smith
|
27
|
+
Nicolas Aguttes
|
28
|
+
|
24
29
|
## Copyright
|
25
30
|
|
26
31
|
Copyright (c) 2010 Jonathan Rudenberg. See LICENSE for details.
|
data/USER_GUIDE.md
CHANGED
@@ -96,6 +96,23 @@ All captures from matchers are available as block arguments:
|
|
96
96
|
puts "Got message from #{username} about Ticket #{ticket_id}"
|
97
97
|
end
|
98
98
|
|
99
|
+
#### Class Routing
|
100
|
+
|
101
|
+
Messages can also be routed to methods. For instance, to route to an
|
102
|
+
ActionMailer mailer with a `receive` method defined, this will work:
|
103
|
+
|
104
|
+
from '%user%@example.org', SampleMailer
|
105
|
+
|
106
|
+
Messages can also be routed to arbitrary instance methods:
|
107
|
+
|
108
|
+
from '%user%@example.org', 'ExampleClass#new_message'
|
109
|
+
|
110
|
+
The method should accept two arguments, the message object, and the params:
|
111
|
+
|
112
|
+
def receive(message, params)
|
113
|
+
# process message here
|
114
|
+
end
|
115
|
+
|
99
116
|
#### Route Helpers
|
100
117
|
|
101
118
|
There are two helpers available inside of route blocks:
|
@@ -116,7 +133,7 @@ the properties available.
|
|
116
133
|
|
117
134
|
### Conditions
|
118
135
|
|
119
|
-
Currently there are
|
136
|
+
Currently there are five conditions available: `to`, `from`, `cc`, `subject`, `body`
|
120
137
|
|
121
138
|
More can be added easily (see `lib/mailman/route/conditions.rb`).
|
122
139
|
|
@@ -145,7 +162,8 @@ will poll every minute by default (this can be changed with
|
|
145
162
|
`Mailman.config.poll_interval`). After new messages are processed, they will
|
146
163
|
be deleted from the server. *No copy of messages will be saved anywhere
|
147
164
|
after processing*. If you want to keep a copy of messages, it is recommended
|
148
|
-
that you use a mail retriever with the Maildir receiver.
|
165
|
+
that you use a mail retriever with the Maildir receiver. You could also use
|
166
|
+
Gmail and set it to keep messages after they have been retrieved with POP3.
|
149
167
|
|
150
168
|
|
151
169
|
### Maildir
|
@@ -183,10 +201,11 @@ set, Mailman will use POP3 polling as the receiver.
|
|
183
201
|
**Example**:
|
184
202
|
|
185
203
|
Mailman.config.pop3 = {
|
186
|
-
:username => '
|
187
|
-
:password => '
|
188
|
-
:server => '
|
189
|
-
:port =>
|
204
|
+
:username => 'chunkybacon@gmail.com',
|
205
|
+
:password => 'foobar',
|
206
|
+
:server => 'pop.gmail.com',
|
207
|
+
:port => 995, # defaults to 110
|
208
|
+
:ssl => true # defaults to false
|
190
209
|
}
|
191
210
|
|
192
211
|
|
data/lib/mailman/application.rb
CHANGED
@@ -43,23 +43,24 @@ module Mailman
|
|
43
43
|
elsif Mailman.config.pop3
|
44
44
|
options = {:processor => @processor}.merge(Mailman.config.pop3)
|
45
45
|
Mailman.logger.info "POP3 receiver enabled (#{options[:username]}@#{options[:server]})."
|
46
|
+
if Mailman.config.poll_interval > 0 # we should poll
|
47
|
+
polling = true
|
48
|
+
Mailman.logger.info "Polling enabled. Checking every #{Mailman.config.poll_interval} seconds."
|
49
|
+
else
|
50
|
+
polling = false
|
51
|
+
Mailman.logger.info 'Polling disabled. Checking for messages once.'
|
52
|
+
end
|
53
|
+
|
46
54
|
connection = Receiver::POP3.new(options)
|
47
|
-
|
55
|
+
loop do
|
56
|
+
Mailman.logger.debug "Checking POP3 server for messages..."
|
48
57
|
connection.connect
|
49
|
-
|
50
|
-
Mailman.logger.info "Polling enabled. Checking every #{Mailman.config.poll_interval} seconds."
|
51
|
-
loop do
|
52
|
-
Mailman.logger.debug "Polling POP3 server for messages..."
|
53
|
-
connection.get_messages
|
54
|
-
sleep Mailman.config.poll_interval
|
55
|
-
end
|
56
|
-
else # one-time retrieval
|
57
|
-
Mailman.logger.info "Polling disabled. Checking for messages..."
|
58
|
-
connection.get_messages
|
59
|
-
end
|
60
|
-
ensure
|
58
|
+
connection.get_messages
|
61
59
|
connection.disconnect
|
60
|
+
break if !polling
|
61
|
+
sleep Mailman.config.poll_interval
|
62
62
|
end
|
63
|
+
|
63
64
|
elsif Mailman.config.maildir
|
64
65
|
Mailman.logger.info "Maildir receiver enabled (#{Mailman.config.maildir})."
|
65
66
|
maildir = Maildir.new(Mailman.config.maildir)
|
@@ -15,11 +15,13 @@ module Mailman
|
|
15
15
|
# @option options [Integer] :port the port to connect to
|
16
16
|
# @option options [String] :username the username to authenticate with
|
17
17
|
# @option options [String] :password the password to authenticate with
|
18
|
+
# @option options [true,false] :ssl enable SSL
|
18
19
|
def initialize(options)
|
19
20
|
@processor = options[:processor]
|
20
21
|
@username = options[:username]
|
21
22
|
@password = options[:password]
|
22
23
|
@connection = Net::POP3.new(options[:server], options[:port])
|
24
|
+
@connection.enable_ssl(OpenSSL::SSL::VERIFY_NONE) if options[:ssl]
|
23
25
|
end
|
24
26
|
|
25
27
|
# Connects to the POP3 server.
|
@@ -30,8 +30,9 @@ module Mailman
|
|
30
30
|
def self.inherited(condition)
|
31
31
|
condition_name = condition.to_s.split('::')[-1][0...-9].downcase
|
32
32
|
Route.class_eval <<-EOM
|
33
|
-
def #{condition_name}(pattern, &block)
|
33
|
+
def #{condition_name}(pattern, klass = nil, &block)
|
34
34
|
@conditions << #{condition}.new(pattern)
|
35
|
+
@klass = klass
|
35
36
|
if block_given?
|
36
37
|
@block = block
|
37
38
|
end
|
@@ -40,8 +41,8 @@ module Mailman
|
|
40
41
|
EOM
|
41
42
|
|
42
43
|
Application.class_eval <<-EOM
|
43
|
-
def #{condition_name}(pattern, &block)
|
44
|
-
@router.add_route Route.new.#{condition_name}(pattern, &block)
|
44
|
+
def #{condition_name}(pattern, klass = nil, &block)
|
45
|
+
@router.add_route Route.new.#{condition_name}(pattern, klass, &block)
|
45
46
|
end
|
46
47
|
EOM
|
47
48
|
end
|
@@ -4,9 +4,11 @@ module Mailman
|
|
4
4
|
# Matches against the To addresses of a message.
|
5
5
|
class ToCondition < Condition
|
6
6
|
def match(message)
|
7
|
-
message.to.
|
8
|
-
|
9
|
-
|
7
|
+
if !message.to.nil?
|
8
|
+
message.to.each do |address|
|
9
|
+
if result = @matcher.match(address)
|
10
|
+
return result
|
11
|
+
end
|
10
12
|
end
|
11
13
|
end
|
12
14
|
nil
|
@@ -39,5 +41,20 @@ module Mailman
|
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
44
|
+
# Matches against the CC header of a message.
|
45
|
+
class CcCondition < Condition
|
46
|
+
def match(message)
|
47
|
+
if !message.cc.nil?
|
48
|
+
message.cc.each do |address|
|
49
|
+
if result = @matcher.match(address)
|
50
|
+
return result
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
42
59
|
end
|
43
60
|
end
|
data/lib/mailman/route.rb
CHANGED
@@ -7,6 +7,10 @@ module Mailman
|
|
7
7
|
# @return [Proc] the block that should be run if the conditions match
|
8
8
|
attr_reader :block
|
9
9
|
|
10
|
+
# @return [Class,String] the class (and optional instance method) to run
|
11
|
+
# instead of a block
|
12
|
+
attr_reader :klass
|
13
|
+
|
10
14
|
# @return [Array] the list of condition instances associated with the route
|
11
15
|
attr_reader :conditions
|
12
16
|
|
@@ -16,7 +20,7 @@ module Mailman
|
|
16
20
|
|
17
21
|
# Checks whether a message matches the route.
|
18
22
|
# @param [Mail::Message] message the message to match against
|
19
|
-
# @return [Hash] the +:block+ associated with the route, the
|
23
|
+
# @return [Hash] the +:block+ and +:klass+ associated with the route, the
|
20
24
|
# +:params+ hash, and the block +:args+ array.
|
21
25
|
def match!(message)
|
22
26
|
params = {}
|
@@ -29,7 +33,7 @@ module Mailman
|
|
29
33
|
return nil
|
30
34
|
end
|
31
35
|
end
|
32
|
-
{ :block => @block, :params => params, :args => args }
|
36
|
+
{ :block => @block, :klass => @klass, :params => params, :args => args }
|
33
37
|
end
|
34
38
|
|
35
39
|
end
|
data/lib/mailman/router.rb
CHANGED
@@ -49,7 +49,14 @@ module Mailman
|
|
49
49
|
|
50
50
|
if result
|
51
51
|
@params.merge!(result[:params])
|
52
|
-
if result[:
|
52
|
+
if !result[:klass].nil?
|
53
|
+
if result[:klass].is_a?(Class) # no instance method specified
|
54
|
+
result[:klass].new.send(:receive, @message, @params)
|
55
|
+
elsif result[:klass].kind_of?(String) # instance method specified
|
56
|
+
klass, method = result[:klass].split('#')
|
57
|
+
klass.camelize.constantize.new.send(method.to_sym, @message, @params)
|
58
|
+
end
|
59
|
+
elsif result[:block].arity > 0
|
53
60
|
instance_exec(*result[:args], &result[:block])
|
54
61
|
else
|
55
62
|
instance_exec(&result[:block])
|
data/lib/mailman/version.rb
CHANGED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 3
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jonathan Rudenberg
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-09-02 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|