midi-smtp-server 3.2.1 → 3.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2376ca7f3510ebe230523b2fd5629dc39a5c44f3415ce3980d1e27d156ac3397
4
- data.tar.gz: eaeb5ae1fe8dd868b772d9dfa267665e2b0e8b6f63c4761cab2d861cac412499
3
+ metadata.gz: 7acc07aa094d1a272f39cd92b1609d9d9eb75447cb188d44abcdd3b36b4be8f9
4
+ data.tar.gz: 1338e9d41425eeb539a9ff873bb72fd81aa8ac28143a5bfec4a37c0937e29674
5
5
  SHA512:
6
- metadata.gz: da5d3c16c081cd3c34be74d1f745bcc015e5c1fa9bbcdf6d55552e1e2c30df831ad63c025c86e4ffda078dc37b1c7bcf16d14fe512dbb91bbabb54dd9b2ca944
7
- data.tar.gz: acbdac6c519f20758e9af7922094032ce3d3bc67e4874d8b37bac283e408ca303cd3fc47ae51b360e3ef9d1bfddc68bc620f5a105e4a68ca4a3d0ca3fef73ef6
6
+ metadata.gz: e59c85758a6ba6e2a78bb82b64b79a08b57b8fb309b15206ed9221b7ebfc127629a4dc470b93b74f4f8c0f99da58602d63d7f618aef1589d427c1426484fee13
7
+ data.tar.gz: 13cbeef718a3c8a204ab7bc67b855d97525d5c2b8f86bf8909e956f66b635e078c7c4f12fe09ca4a74b7cd1fd81ba31112aedc2ee8bbd7c83ef07d803ccaafae
data/CHANGELOG.md CHANGED
@@ -5,6 +5,15 @@ We suggest everybody using MidiSmtpServer to switch at least to latest 2.3.y. or
5
5
  For upgrades from previous versions or outdated _MiniSmtpServer_ gem you may follow the guides at [Appendix Upgrade](https://midi-smtp-server.readthedocs.io/appendix_upgrade/) to get your code ready for the latest releases.
6
6
 
7
7
 
8
+ #### 3.3.2 (2026-09-16)
9
+
10
+ 1. Updates and fixes for Ruby versions 3.3, 3.4 and 4.0
11
+ 2. New feature and optimization for [IO wait](https://midi-smtp-server.readthedocs.io/feature_load_balancing) by event mode
12
+ 3. Deprecate `io_waitreadable_sleep` in favor of `io_wait_mode` and `io_wait_available`
13
+ 4. Test fixes for newer Ruby (3.3+) and OS-specific socket behaviour
14
+ 5. mkdocs update for readthedocs
15
+
16
+
8
17
  #### 3.2.1 (2023-08-15)
9
18
 
10
19
  1. New feature [proxy](https://midi-smtp-server.readthedocs.io/feature_proxy) ([check issue 49](https://github.com/4commerce-technologies-AG/midi-smtp-server/issues/49))
data/README.md CHANGED
@@ -92,7 +92,7 @@ Use the component in your project sources by:
92
92
 
93
93
  When a `Gemfile` handles your dependencies, please consider to use the [pessimistic operator](https://thoughtbot.com/blog/rubys-pessimistic-operator) at least:
94
94
 
95
- `gem 'midi-smtp-server', '~> 3.1.2''`
95
+ `gem 'midi-smtp-server', '~> 3.3.2''`
96
96
 
97
97
  All changes by PATCH versions are always functional and compatible with no issues on update!
98
98
 
@@ -159,10 +159,13 @@ We suggest everybody using MidiSmtpServer to switch at least to latest 2.3.y. or
159
159
  For upgrades from previous versions or outdated _MiniSmtpServer_ gem you may follow the guides (see appendix) how to change your existing code to be compatible with the latest releases.
160
160
 
161
161
 
162
- #### Latest release: 3.2.1 (2023-08-15)
162
+ #### Latest release: 3.3.2 (2026-09-16)
163
163
 
164
- 1. New feature [proxy](https://midi-smtp-server.readthedocs.io/feature_proxy) ([check issue 49](https://github.com/4commerce-technologies-AG/midi-smtp-server/issues/49))
165
- 2. mkdocs update for readthedocs
164
+ 1. Updates and fixes for Ruby versions 3.3, 3.4 and 4.0
165
+ 2. New feature and optimization for [IO wait](https://midi-smtp-server.readthedocs.io/feature_load_balancing) by event mode
166
+ 3. Deprecate `io_waitreadable_sleep` in favor of `io_wait_mode` and `io_wait_available`
167
+ 4. Test fixes for newer Ruby (3.3+) and OS-specific socket behaviour
168
+ 5. mkdocs update for readthedocs
166
169
 
167
170
 
168
171
  #### Changelog history
@@ -205,4 +208,4 @@ Author: [Tom Freudenberg](http://about.me/tom.freudenberg)
205
208
 
206
209
  [MidiSmtpServer Class](https://github.com/4commerce-technologies-AG/midi-smtp-server/) is inspired from [MiniSmtpServer Class](https://github.com/aarongough/mini-smtp-server) and code written by [Aaron Gough](https://github.com/aarongough) and [Peter Cooper](https://github.com/4commerce-technologies-AG/midi-smtp-server#author--credits)
207
210
 
208
- Copyright (c) 2014-2023 [Tom Freudenberg](https://github.com/TomFreudenberg), [4commerce technologies AG](https://www.4commerce.de/), released under the MIT license
211
+ Copyright (c) 2014-2026 [Tom Freudenberg](https://github.com/TomFreudenberg), [4commerce technologies AG](https://www.4commerce.de/), released under the MIT license
@@ -38,7 +38,7 @@ module MidiSmtpServer
38
38
  @smtpd_return_code = smtpd_return_code
39
39
  @smtpd_return_text = smtpd_return_text
40
40
  # call inherited constructor
41
- super msg
41
+ super(msg)
42
42
  end
43
43
 
44
44
  def smtpd_result
@@ -52,7 +52,7 @@ module MidiSmtpServer
52
52
 
53
53
  def initialize(msg = nil)
54
54
  # call inherited constructor
55
- super msg, 421, 'Service too busy or not available, closing transmission channel'
55
+ super(msg, 421, 'Service too busy or not available, closing transmission channel')
56
56
  end
57
57
 
58
58
  end
@@ -63,7 +63,7 @@ module MidiSmtpServer
63
63
 
64
64
  def initialize(msg = nil)
65
65
  # call inherited constructor
66
- super msg, 450, 'Requested mail action not taken: mailbox unavailable'
66
+ super(msg, 450, 'Requested mail action not taken: mailbox unavailable')
67
67
  end
68
68
 
69
69
  end
@@ -73,7 +73,7 @@ module MidiSmtpServer
73
73
 
74
74
  def initialize(msg = nil)
75
75
  # call inherited constructor
76
- super msg, 451, 'Requested action aborted: local error in processing'
76
+ super(msg, 451, 'Requested action aborted: local error in processing')
77
77
  end
78
78
 
79
79
  end
@@ -83,7 +83,7 @@ module MidiSmtpServer
83
83
 
84
84
  def initialize(msg = nil)
85
85
  # call inherited constructor
86
- super msg, 452, 'Requested action not taken: insufficient system storage'
86
+ super(msg, 452, 'Requested action not taken: insufficient system storage')
87
87
  end
88
88
 
89
89
  end
@@ -94,7 +94,7 @@ module MidiSmtpServer
94
94
 
95
95
  def initialize(msg = nil)
96
96
  # call inherited constructor
97
- super msg, 500, 'Syntax error, command unrecognised or error in parameters or arguments'
97
+ super(msg, 500, 'Syntax error, command unrecognised or error in parameters or arguments')
98
98
  end
99
99
 
100
100
  end
@@ -104,7 +104,7 @@ module MidiSmtpServer
104
104
 
105
105
  def initialize(msg = nil)
106
106
  # call inherited constructor
107
- super msg, 501, 'Syntax error in parameters or arguments'
107
+ super(msg, 501, 'Syntax error in parameters or arguments')
108
108
  end
109
109
 
110
110
  end
@@ -114,7 +114,7 @@ module MidiSmtpServer
114
114
 
115
115
  def initialize(msg = nil)
116
116
  # call inherited constructor
117
- super msg, 502, 'Command not implemented'
117
+ super(msg, 502, 'Command not implemented')
118
118
  end
119
119
 
120
120
  end
@@ -124,7 +124,7 @@ module MidiSmtpServer
124
124
 
125
125
  def initialize(msg = nil)
126
126
  # call inherited constructor
127
- super msg, 503, 'Bad sequence of commands'
127
+ super(msg, 503, 'Bad sequence of commands')
128
128
  end
129
129
 
130
130
  end
@@ -134,7 +134,7 @@ module MidiSmtpServer
134
134
 
135
135
  def initialize(msg = nil)
136
136
  # call inherited constructor
137
- super msg, 504, 'Command parameter not implemented'
137
+ super(msg, 504, 'Command parameter not implemented')
138
138
  end
139
139
 
140
140
  end
@@ -144,7 +144,7 @@ module MidiSmtpServer
144
144
 
145
145
  def initialize(msg = nil)
146
146
  # call inherited constructor
147
- super msg, 521, 'Service does not accept mail'
147
+ super(msg, 521, 'Service does not accept mail')
148
148
  end
149
149
 
150
150
  end
@@ -155,7 +155,7 @@ module MidiSmtpServer
155
155
 
156
156
  def initialize(msg = nil)
157
157
  # call inherited constructor
158
- super msg, 550, 'Requested action not taken: mailbox unavailable'
158
+ super(msg, 550, 'Requested action not taken: mailbox unavailable')
159
159
  end
160
160
 
161
161
  end
@@ -165,7 +165,7 @@ module MidiSmtpServer
165
165
 
166
166
  def initialize(msg = nil)
167
167
  # call inherited constructor
168
- super msg, 552, 'Requested mail action aborted: exceeded storage allocation'
168
+ super(msg, 552, 'Requested mail action aborted: exceeded storage allocation')
169
169
  end
170
170
 
171
171
  end
@@ -175,7 +175,7 @@ module MidiSmtpServer
175
175
 
176
176
  def initialize(msg = nil)
177
177
  # call inherited constructor
178
- super msg, 553, 'Requested action not taken: mailbox name not allowed'
178
+ super(msg, 553, 'Requested action not taken: mailbox name not allowed')
179
179
  end
180
180
 
181
181
  end
@@ -185,7 +185,7 @@ module MidiSmtpServer
185
185
 
186
186
  def initialize(msg = nil)
187
187
  # call inherited constructor
188
- super msg, 554, 'Transaction failed'
188
+ super(msg, 554, 'Transaction failed')
189
189
  end
190
190
 
191
191
  end
@@ -197,7 +197,7 @@ module MidiSmtpServer
197
197
 
198
198
  def initialize(msg = nil)
199
199
  # call inherited constructor
200
- super msg, 432, 'Password transition is needed'
200
+ super(msg, 432, 'Password transition is needed')
201
201
  end
202
202
 
203
203
  end
@@ -207,7 +207,7 @@ module MidiSmtpServer
207
207
 
208
208
  def initialize(msg = nil)
209
209
  # call inherited constructor
210
- super msg, 454, 'Temporary authentication failure'
210
+ super(msg, 454, 'Temporary authentication failure')
211
211
  end
212
212
 
213
213
  end
@@ -217,7 +217,7 @@ module MidiSmtpServer
217
217
 
218
218
  def initialize(msg = nil)
219
219
  # call inherited constructor
220
- super msg, 530, 'Authentication required'
220
+ super(msg, 530, 'Authentication required')
221
221
  end
222
222
 
223
223
  end
@@ -227,7 +227,7 @@ module MidiSmtpServer
227
227
 
228
228
  def initialize(msg = nil)
229
229
  # call inherited constructor
230
- super msg, 534, 'Authentication mechanism is too weak'
230
+ super(msg, 534, 'Authentication mechanism is too weak')
231
231
  end
232
232
 
233
233
  end
@@ -237,7 +237,7 @@ module MidiSmtpServer
237
237
 
238
238
  def initialize(msg = nil)
239
239
  # call inherited constructor
240
- super msg, 535, 'Authentication credentials invalid'
240
+ super(msg, 535, 'Authentication credentials invalid')
241
241
  end
242
242
 
243
243
  end
@@ -247,7 +247,7 @@ module MidiSmtpServer
247
247
 
248
248
  def initialize(msg = nil)
249
249
  # call inherited constructor
250
- super msg, 538, 'Encryption required for requested authentication mechanism'
250
+ super(msg, 538, 'Encryption required for requested authentication mechanism')
251
251
  end
252
252
 
253
253
  end
@@ -259,7 +259,7 @@ module MidiSmtpServer
259
259
 
260
260
  def initialize(msg = nil)
261
261
  # call inherited constructor
262
- super msg, 454, 'TLS not available'
262
+ super(msg, 454, 'TLS not available')
263
263
  end
264
264
 
265
265
  end
@@ -269,7 +269,7 @@ module MidiSmtpServer
269
269
 
270
270
  def initialize(msg = nil)
271
271
  # call inherited constructor
272
- super msg, 530, 'Encryption required, must issue STARTTLS command first'
272
+ super(msg, 530, 'Encryption required, must issue STARTTLS command first')
273
273
  end
274
274
 
275
275
  end
@@ -281,7 +281,7 @@ module MidiSmtpServer
281
281
 
282
282
  def initialize(msg = nil)
283
283
  # call inherited constructor
284
- super msg, 500, 'Bad input, PIPELINING is not allowed'
284
+ super(msg, 500, 'Bad input, PIPELINING is not allowed')
285
285
  end
286
286
 
287
287
  end
@@ -293,7 +293,7 @@ module MidiSmtpServer
293
293
 
294
294
  def initialize(msg = nil)
295
295
  # call inherited constructor
296
- super msg, 500, 'Bad input, Lines must be terminated by CRLF sequence'
296
+ super(msg, 500, 'Bad input, Lines must be terminated by CRLF sequence')
297
297
  end
298
298
 
299
299
  end
@@ -75,7 +75,7 @@ module MidiSmtpServer
75
75
  # try to load certificate and key
76
76
  cert_lines = File.read(@cert_path.to_s).lines
77
77
  # check if the cert file contains a chain of certs
78
- cert_indexes = cert_lines.each_with_index.map { |line, index| index if line.downcase.include?('-begin certificate-') }.compact
78
+ cert_indexes = cert_lines.each_with_index.filter_map { |line, index| index if line.downcase.include?('-begin certificate-') }
79
79
  # create each cert in the chain
80
80
  certs = []
81
81
  cert_indexes.each_with_index do |cert_index, current_index|
@@ -6,12 +6,12 @@ module MidiSmtpServer
6
6
  module VERSION
7
7
 
8
8
  MAJOR = 3
9
- MINOR = 2
10
- TINY = 1
9
+ MINOR = 3
10
+ TINY = 2
11
11
 
12
12
  STRING = [MAJOR, MINOR, TINY].compact.join('.')
13
13
 
14
- DATE = '2023-08-15'
14
+ DATE = '2026-09-16'
15
15
 
16
16
  end
17
17
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'logger'
4
4
  require 'socket'
5
+ require 'io/wait'
5
6
  require 'resolv'
6
7
  require 'base64'
7
8
 
@@ -27,7 +28,9 @@ module MidiSmtpServer
27
28
  DEFAULT_CRLF_MODE = :CRLF_ENSURE
28
29
 
29
30
  # default values for IO operations
30
- DEFAULT_IO_WAITREADABLE_SLEEP = 0.1
31
+ IO_WAIT_MODES = [:IO_WAIT_SLEEP, :IO_WAIT_EVENT].freeze
32
+ DEFAULT_IO_WAIT_MODE = :IO_WAIT_EVENT
33
+ DEFAULT_IO_WAIT_AVAILABLE = 0.1
31
34
  DEFAULT_IO_CMD_TIMEOUT = 30
32
35
  DEFAULT_IO_BUFFER_CHUNK_SIZE = 4 * 1024
33
36
  DEFAULT_IO_BUFFER_MAX_SIZE = 1 * 1024 * 1024
@@ -197,8 +200,10 @@ module MidiSmtpServer
197
200
  attr_reader :max_connections
198
201
  # CRLF handling based on conformity to RFC(2)822
199
202
  attr_reader :crlf_mode
200
- # Time in seconds to sleep on IO::WaitReadable exception
201
- attr_reader :io_waitreadable_sleep
203
+ # how to wait on IO::WaitReadable exception
204
+ attr_reader :io_wait_mode
205
+ # Time in fraction of a second to wait on IO::WaitReadable exception
206
+ attr_reader :io_wait_available
202
207
  # Maximum time in seconds to wait for a complete incoming data line, as a FixNum
203
208
  attr_reader :io_cmd_timeout
204
209
  # Bytes to read non-blocking from socket into buffer, as a FixNum
@@ -230,7 +235,8 @@ module MidiSmtpServer
230
235
  # +max_connections+:: maximum number of connections, this does limit the number of concurrent TCP connections (not set or nil => unlimited)
231
236
  # +crlf_mode+:: CRLF handling support (:CRLF_ENSURE [default], :CRLF_LEAVE, :CRLF_STRICT)
232
237
  # +do_dns_reverse_lookup+:: flag if this smtp server should do reverse DNS lookups on incoming connections
233
- # +io_waitreadable_sleep+:: seconds to sleep in loop when no input data is available (DEFAULT_IO_WAITREADABLE_SLEEP)
238
+ # +io_wait_mode+:: how to wait when no input data is available (DEFAULT_IO_WAIT_MODE)
239
+ # +io_wait_available+:: fraction of a second to wait in loop when no input data is available (DEFAULT_IO_WAIT_AVAILABLE)
234
240
  # +io_cmd_timeout+:: time in seconds to wait until complete line of data is expected (DEFAULT_IO_CMD_TIMEOUT, nil => disabled test)
235
241
  # +io_buffer_chunk_size+:: size of chunks (bytes) to read non-blocking from socket (DEFAULT_IO_BUFFER_CHUNK_SIZE)
236
242
  # +io_buffer_max_size+:: max size of buffer (max line length) until \lf ist expected (DEFAULT_IO_BUFFER_MAX_SIZE, nil => disabled test)
@@ -255,7 +261,9 @@ module MidiSmtpServer
255
261
  max_connections: nil,
256
262
  crlf_mode: nil,
257
263
  do_dns_reverse_lookup: nil,
258
- io_waitreadable_sleep: nil,
264
+ io_wait_mode: nil,
265
+ io_wait_available: nil,
266
+ io_waitreadable_sleep: nil, # deprecated, but for compatibility
259
267
  io_cmd_timeout: nil,
260
268
  io_buffer_chunk_size: nil,
261
269
  io_buffer_max_size: nil,
@@ -343,7 +351,7 @@ module MidiSmtpServer
343
351
  # test for all local valid ipv4 and ipv6 ip_addresses
344
352
  # check question on stackoverflow for details
345
353
  # https://stackoverflow.com/questions/59770803/identify-all-relevant-ip-addresses-from-ruby-socket-ip-address-list
346
- ip_addresses_for_host << a.ip_address if \
354
+ ip_addresses_for_host << a.ip_address if
347
355
  (a.ipv4? &&
348
356
  (a.ipv4_loopback? || a.ipv4_private? ||
349
357
  !(a.ipv4_loopback? || a.ipv4_private? || a.ipv4_multicast?)
@@ -391,10 +399,21 @@ module MidiSmtpServer
391
399
  # always prevent auto resolving hostnames to prevent a delay on socket connect
392
400
  BasicSocket.do_not_reverse_lookup = true
393
401
  # do reverse lookups manually if enabled by io.addr and io.peeraddr
402
+ # rubocop: disable-next Style/RedundantCondition
394
403
  @do_dns_reverse_lookup = do_dns_reverse_lookup.nil? ? true : do_dns_reverse_lookup
395
404
 
405
+ # deprecated compatibility
406
+ raise 'Not allowed to use io_wait_available and deprecated io_waitreadable_sleep at the same time!' unless io_waitreadable_sleep.nil? || io_wait_available.nil?
407
+ unless io_waitreadable_sleep.nil?
408
+ io_wait_available = io_waitreadable_sleep
409
+ io_wait_mode = :IO_WAIT_SLEEP
410
+ @logger_protected.warn('Deprecated: "io_waitreadable_sleep" was replaced! Please use "io_wait_available" and "io_wait_mode" instead.')
411
+ end
396
412
  # io and buffer settings
397
- @io_waitreadable_sleep = io_waitreadable_sleep.nil? ? DEFAULT_IO_WAITREADABLE_SLEEP : io_waitreadable_sleep
413
+ @io_wait_mode = io_wait_mode.nil? ? DEFAULT_IO_WAIT_MODE : io_wait_mode
414
+ raise "Unknown io wait mode #{@io_wait_mode} was given!" unless IO_WAIT_MODES.include?(@io_wait_mode)
415
+ @io_wait_available = io_wait_available.nil? ? DEFAULT_IO_WAIT_AVAILABLE : io_wait_available
416
+ raise 'Value of time must be positive (io_wait_available)' unless @io_wait_available.positive?
398
417
  @io_cmd_timeout = io_cmd_timeout.nil? ? DEFAULT_IO_CMD_TIMEOUT : io_cmd_timeout
399
418
  @io_buffer_chunk_size = io_buffer_chunk_size.nil? ? DEFAULT_IO_BUFFER_CHUNK_SIZE : io_buffer_chunk_size
400
419
  @io_buffer_max_size = io_buffer_max_size.nil? ? DEFAULT_IO_BUFFER_MAX_SIZE : io_buffer_max_size
@@ -769,10 +788,25 @@ module MidiSmtpServer
769
788
  io_buffer_line_lf = io_buffer.index("\n")
770
789
  end
771
790
 
772
- # ignore exception when no input data is available yet
791
+ # handle no input data is available yet
773
792
  rescue IO::WaitReadable
774
- # but wait a few moment to slow down system utilization
775
- sleep @io_waitreadable_sleep
793
+ if @io_wait_mode == :IO_WAIT_SLEEP
794
+ # reduce the processing speed and thereby the system
795
+ # utilization by sleeping the configured time
796
+ sleep @io_wait_available
797
+ else
798
+ # block on the underlying socket until new data has arrived,
799
+ # but wake up at least after wait time so that the loop
800
+ # keeps checking shutdown? and io_cmd_timeout
801
+ # (io.to_io resolves the plain socket behind an
802
+ # OpenSSL::SSL::SSLSocket, otherwise wait_readable is not defined
803
+ io.to_io.wait_readable(@io_wait_available)
804
+ end
805
+
806
+ # during TLS (re)negotiation a read may require the socket
807
+ # to become writable first. this always waits by event
808
+ rescue IO::WaitWritable
809
+ io.to_io.wait_writable(@io_wait_available)
776
810
  end
777
811
 
778
812
  # check if io_buffer is filled and contains already a line-feed
@@ -946,8 +980,8 @@ module MidiSmtpServer
946
980
  # check whether to answer as HELO or EHLO
947
981
  case line
948
982
  when (/^EHLO/i)
949
- # rubocop:disable Style/StringConcatenation
950
983
  # reply supported extensions
984
+ # rubocop: disable-next Style/StringConcatenation
951
985
  return "250-#{session[:ctx][:server][:helo_response].to_s.strip}\r\n" +
952
986
  # respond with 8BITMIME extension
953
987
  (@internationalization_extensions ? "250-8BITMIME\r\n" : '') +
@@ -960,7 +994,6 @@ module MidiSmtpServer
960
994
  # respond with STARTTLS if available and not already enabled
961
995
  (@encrypt_mode == :TLS_FORBIDDEN || encrypted?(session[:ctx]) ? '' : "250-STARTTLS\r\n") +
962
996
  '250 OK'
963
- # rubocop:enable all
964
997
  else
965
998
  # reply ok only
966
999
  return "250 OK #{session[:ctx][:server][:helo_response].to_s.strip}".strip
@@ -1302,7 +1335,7 @@ module MidiSmtpServer
1302
1335
  # If we are in date mode then ...
1303
1336
 
1304
1337
  # call event to signal beginning of message data transfer
1305
- on_message_data_start_event(session[:ctx]) unless session[:ctx][:message][:data][0]
1338
+ on_message_data_start_event(session[:ctx]) if session[:ctx][:message][:data].empty?
1306
1339
 
1307
1340
  # ... and the entire new message data (line) does NOT consists
1308
1341
  # solely of a period (.) on a line by itself then we are being
metadata CHANGED
@@ -1,15 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: midi-smtp-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.1
4
+ version: 3.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Freudenberg
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-08-15 00:00:00.000000000 Z
12
- dependencies: []
10
+ date: 2026-09-16 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: base64
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.2'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.2'
26
+ - !ruby/object:Gem::Dependency
27
+ name: logger
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.6'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.6'
13
40
  description: MidiSmtpServer is the highly customizable ruby SMTP-Server and SMTP-Service
14
41
  library with builtin support for AUTH and SSL/STARTTLS, 8BITMIME and SMTPUTF8, IPv4
15
42
  and IPv6 and additional features.
@@ -34,9 +61,9 @@ metadata:
34
61
  source_code_uri: https://github.com/4commerce-technologies-AG/midi-smtp-server
35
62
  changelog_uri: https://github.com/4commerce-technologies-AG/midi-smtp-server#changes-and-updates
36
63
  bug_tracker_uri: https://github.com/4commerce-technologies-AG/midi-smtp-server/issues
37
- documentation_uri: https://www.rubydoc.info/gems/midi-smtp-server/3.2.1
64
+ documentation_uri: https://www.rubydoc.info/gems/midi-smtp-server/3.3.2
38
65
  wiki_uri: https://midi-smtp-server.readthedocs.io/
39
- post_install_message:
66
+ rubygems_mfa_required: 'true'
40
67
  rdoc_options: []
41
68
  require_paths:
42
69
  - lib
@@ -44,15 +71,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
44
71
  requirements:
45
72
  - - ">="
46
73
  - !ruby/object:Gem::Version
47
- version: 2.6.0
74
+ version: 2.7.0
48
75
  required_rubygems_version: !ruby/object:Gem::Requirement
49
76
  requirements:
50
77
  - - ">="
51
78
  - !ruby/object:Gem::Version
52
79
  version: '0'
53
80
  requirements: []
54
- rubygems_version: 3.4.10
55
- signing_key:
81
+ rubygems_version: 4.0.16
56
82
  specification_version: 4
57
83
  summary: MidiSmtpServer Class
58
84
  test_files: []