mailman 0.7.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4e0d6250baa93fa46879402ceb182c3a708646fd
4
- data.tar.gz: f7b302706b41090084e7bc4fb615428210fab46a
3
+ metadata.gz: 95cd28c23630aa811c3a0f9299730e745bc29a8a
4
+ data.tar.gz: 52e2f0d09f4452e08a16d5a51b9f7d85b45ba93b
5
5
  SHA512:
6
- metadata.gz: 36ff95f7fbef72bb59af16b5dad474e170afa93b1a8f459dfce4cb48135a01715dcaa3ab20a973068c19805a23ed08a2847252645c07ca3115e087f509160838
7
- data.tar.gz: a2bd2c82bb9833ff2202ff6e238cd4432d0162a0f54f93ccfa10782bd365368f58e37362b60ad15a64f6abeac8cbf601200c437c211dac6de07b0d12c33c56e4
6
+ metadata.gz: dc09cb996cc8418a81a15d02c9585807256d62c8d0ade276930005689bbab99e570d42c0fa45fb19b50e2b4c03b2bea8fe202c9347262f207456ff06495e56de
7
+ data.tar.gz: 35aa8a40870ffa6439cda844fc47a9269a5650411ea4ce0223d867f5c027f66818a2447782bed53e512860c85bd84735a1f5cdeeb8f637732960d83b0aaea09e
@@ -1,3 +1,14 @@
1
+ ## 0.7.3 (March 17, 2015)
2
+ Features
3
+ starttls for imap
4
+ allow passing options to openssl for pop3/imap
5
+
6
+ Security fixes
7
+ Enable certificate validation for pop3
8
+
9
+ Bugfixes
10
+ added retry logic to handle connection errors gracefully
11
+
1
12
  ## 0.7.2 (June 9, 2014)
2
13
 
3
14
  Bugfixes
@@ -26,7 +37,7 @@ Features
26
37
 
27
38
  Features
28
39
 
29
- - 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)
40
+ - IMAP: Mark messages as seen instead of deleting them (see [5b6aef0](https://github.com/mailman/mailman/commit/5b6aef0163f0f28c790abf3083cbda7cbc9cc13f) for details on how revert to the previous behaviour)
30
41
 
31
42
  Bugfixes
32
43
 
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Mailman [![Build Status](https://secure.travis-ci.org/titanous/mailman.png)](https://secure.travis-ci.org/titanous/mailman)
1
+ # Mailman [![Build Status](https://secure.travis-ci.org/mailman/mailman.png)](https://secure.travis-ci.org/mailman/mailman)
2
2
 
3
3
  Mailman is an incoming mail processing microframework (with POP3 and Maildir
4
4
  support), that works with Rails "out of the box".
@@ -12,7 +12,7 @@ Mailman::Application.run do
12
12
  end
13
13
  ```
14
14
 
15
- See the [User Guide](https://github.com/titanous/mailman/blob/master/USER_GUIDE.md) for more information.
15
+ See the [User Guide](https://github.com/mailman/mailman/blob/master/USER_GUIDE.md) for more information.
16
16
 
17
17
  **If you'd like to maintain this gem, email jonathan@titanous.com.**
18
18
 
@@ -22,7 +22,14 @@ See the [User Guide](https://github.com/titanous/mailman/blob/master/USER_GUIDE.
22
22
 
23
23
  ## Compatibility
24
24
 
25
- Tested on Ruby 2.0, 1.9.3, JRuby, and Rubinius.
25
+ Tested on Ruby 2.1, 2.0, 1.9.3, JRuby, and Rubinius.
26
+
27
+ ### Ruby < 2.0.0
28
+
29
+ In order to use this gem with ruby versions older then 2.0.0, you have to
30
+ restrict the maildir gem to the latest supported version in your `Gemfile`:
31
+
32
+ gem 'maildir', '< 2.1.0'
26
33
 
27
34
  ## Thanks
28
35
 
@@ -185,24 +185,31 @@ after processing*. If you want to keep a copy of messages, it is recommended
185
185
  that you use a mail retriever with the Maildir receiver. You could also use
186
186
  Gmail and set it to keep messages after they have been retrieved with POP3.
187
187
 
188
+ You can pass a Hash to `ssl` with
189
+ [SSL context options](http://www.ruby-doc.org/stdlib/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html).
190
+ For example, when you have a self-signed certificate: `ssl: { ca_file: '/etc/pki/my_ca.pem' }`.
191
+
188
192
 
189
193
  ### IMAP
190
194
 
191
- The IMAP receiver is enabled when the `Mailman.config.imap` hash is set.
195
+ The IMAP receiver is enabled when the `Mailman.config.imap` hash is set.
192
196
  Polling can be set with `Mailman.config.poll_interval`. This will read all unread messages in the INBOX by default.
193
197
  Here are example settings for gmail.
194
198
 
195
199
  ```ruby
196
200
  Mailman.config.imap = {
197
- server: 'imap.gmail.com',
198
- port: 993, # usually 995, 993 for gmail
201
+ server: 'imap.gmail.com',
202
+ port: 993, # you usually don't need to set this, but it's there if you need to
199
203
  ssl: true,
204
+ # Use starttls instead of ssl (do not specify both)
205
+ #starttls: true,
200
206
  username: 'foo@somedomain.com',
201
207
  password: 'totallyunsecuredpassword'
202
208
  }
203
209
 
204
210
  ```
205
211
  * When using gmail, remember to [enable IMAP](https://support.google.com/mail/troubleshooter/1668960)
212
+ * You can pass a Hash to `ssl`, just like with POP3.
206
213
 
207
214
  ### Maildir
208
215
 
@@ -243,7 +250,7 @@ Mailman.config.pop3 = {
243
250
  :username => 'chunkybacon@gmail.com',
244
251
  :password => 'foobar',
245
252
  :server => 'pop.gmail.com',
246
- :port => 995, # defaults to 110
253
+ :port => 995, # you can usually omit this, but it's there
247
254
  :ssl => true # defaults to false
248
255
  }
249
256
  ```
@@ -133,14 +133,23 @@ module Mailman
133
133
  end
134
134
  Mailman.logger.info(polling_msg)
135
135
 
136
+ tries ||= 5
136
137
  loop do
137
138
  begin
138
139
  connection.connect
139
140
  connection.get_messages
140
- rescue SystemCallError => e
141
+ rescue SystemCallError, EOFError => e
141
142
  Mailman.logger.error e.message
143
+ unless (tries -= 1).zero?
144
+ Mailman.logger.error "Retrying..."
145
+ begin
146
+ connection.disconnect
147
+ rescue # don't crash in the crash handler
148
+ end
149
+ retry
150
+ end
142
151
  ensure
143
- connection.disconnect
152
+ connection.started? && connection.disconnect
144
153
  end
145
154
 
146
155
  break unless polling?
@@ -13,7 +13,11 @@ module Mailman
13
13
  # messages to
14
14
  # @option options [String] :server the server to connect to
15
15
  # @option options [Integer] :port the port to connect to
16
- # @option options [Boolean] :ssl whether or not to use ssl
16
+ # @option options [Boolean,Hash] :ssl if options is true, then an attempt will
17
+ # be made to use SSL (now TLS) to connect to the server. A Hash can be used
18
+ # to enable ssl and supply SSL context options.
19
+ # @option options [Boolean] :starttls use STARTTLS command to start
20
+ # TLS session.
17
21
  # @option options [String] :username the username to authenticate with
18
22
  # @option options [String] :password the password to authenticate with
19
23
  # @option options [String] :folder the mail folder to search
@@ -28,22 +32,34 @@ module Mailman
28
32
  @password = options[:password]
29
33
  @filter = options[:filter] || 'UNSEEN'
30
34
  @done_flags = options[:done_flags] || [Net::IMAP::SEEN]
31
- @port = options[:port] || 143
32
35
  @ssl = options[:ssl] || false
36
+ @starttls = options[:starttls] || false
37
+ @port = options[:port] || (@ssl ? 993 : 143)
33
38
  @folder = options[:folder] || "INBOX"
39
+
40
+ if @starttls && @ssl
41
+ raise StandardError.new("either specify ssl or starttls, not both")
42
+ end
34
43
  end
35
44
 
36
45
  # Connects to the IMAP server.
37
46
  def connect
47
+ tries ||= 5
38
48
  if @connection.nil? or @connection.disconnected?
39
49
  @connection = Net::IMAP.new(@server, port: @port, ssl: @ssl)
50
+ if @starttls
51
+ @connection.starttls
52
+ end
40
53
  @connection.login(@username, @password)
41
54
  end
42
55
  @connection.select(@folder)
56
+ rescue Net::IMAP::ByeResponseError, Net::IMAP::NoResponseError => e
57
+ retry unless (tries -= 1).zero?
43
58
  end
44
59
 
45
60
  # Disconnects from the IMAP server.
46
61
  def disconnect
62
+ return false if @connection.nil?
47
63
  @connection.logout
48
64
  @connection.disconnected? ? true : @connection.disconnect rescue nil
49
65
  end
@@ -53,13 +69,21 @@ module Mailman
53
69
  def get_messages
54
70
  @connection.search(@filter).each do |message|
55
71
  body = @connection.fetch(message, "RFC822")[0].attr["RFC822"]
56
- @processor.process(body)
72
+ begin
73
+ @processor.process(body)
74
+ rescue StandardError => error
75
+ Mailman.logger.error "Error encountered processing message: #{message.inspect}\n #{error.class.to_s}: #{error.message}\n #{error.backtrace.join("\n")}"
76
+ next
77
+ end
57
78
  @connection.store(message, "+FLAGS", @done_flags)
58
79
  end
59
80
  # Clears messages that have the Deleted flag set
60
81
  @connection.expunge
61
82
  end
62
83
 
84
+ def started?
85
+ not (!@connection.nil? && @connection.disconnected?)
86
+ end
63
87
  end
64
88
  end
65
89
  end
@@ -12,16 +12,21 @@ module Mailman
12
12
  # @option options [MessageProcessor] :processor the processor to pass new
13
13
  # messages to
14
14
  # @option options [String] :server the server to connect to
15
- # @option options [Integer] :port the port to connect to
15
+ # @option options [Integer] :port the port to connect to (default 110, or 995 for ssl)
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
+ # @option options [true,false,Hash] :ssl enable SSL
19
19
  def initialize(options)
20
20
  @processor = options[:processor]
21
21
  @username = options[:username]
22
22
  @password = options[:password]
23
- @connection = Net::POP3.new(options[:server], options[:port])
24
- @connection.enable_ssl(OpenSSL::SSL::VERIFY_NONE) if options[:ssl]
23
+ port = options[:port] || (options[:ssl] ? 995 : 110)
24
+ @connection = Net::POP3.new(options[:server], port)
25
+ if options[:ssl].is_a? Hash
26
+ @connection.enable_ssl(options[:ssl])
27
+ elsif options[:ssl]
28
+ @connection.enable_ssl
29
+ end
25
30
  @connection.open_timeout = options[:open_timeout] if options[:open_timeout]
26
31
  @connection.read_timeout = options[:read_timeout] if options[:read_timeout]
27
32
  end
@@ -40,11 +45,19 @@ module Mailman
40
45
  # deleting them.
41
46
  def get_messages
42
47
  @connection.each_mail do |message|
43
- @processor.process(message.pop)
48
+ begin
49
+ @processor.process(message.pop)
50
+ rescue StandardError => error
51
+ Mailman.logger.error "Error encountered processing message: #{message.inspect}\n #{error.class.to_s}: #{error.message}\n #{error.backtrace.join("\n")}"
52
+ next
53
+ end
44
54
  end
45
55
  @connection.delete_all
46
56
  end
47
57
 
58
+ def started?
59
+ @connection.started?
60
+ end
48
61
  end
49
62
  end
50
63
  end
@@ -1,3 +1,3 @@
1
1
  module Mailman
2
- VERSION = '0.7.2'
2
+ VERSION = '0.7.3'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailman
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Rudenberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-10 00:00:00.000000000 Z
11
+ date: 2015-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '2.10'
89
+ version: '3.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '2.10'
96
+ version: '3.0'
97
97
  description: Mailman makes it easy to process incoming emails with a simple routing
98
98
  DSL
99
99
  email:
@@ -126,7 +126,7 @@ files:
126
126
  - lib/mailman/route/string_matcher.rb
127
127
  - lib/mailman/router.rb
128
128
  - lib/mailman/version.rb
129
- homepage: https://github.com/titanous/mailman
129
+ homepage: https://github.com/mailman/mailman
130
130
  licenses: []
131
131
  metadata: {}
132
132
  post_install_message: