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 +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +8 -5
- data/lib/midi-smtp-server/exceptions.rb +25 -25
- data/lib/midi-smtp-server/tls-transport.rb +1 -1
- data/lib/midi-smtp-server/version.rb +3 -3
- data/lib/midi-smtp-server.rb +46 -13
- metadata +35 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7acc07aa094d1a272f39cd92b1609d9d9eb75447cb188d44abcdd3b36b4be8f9
|
|
4
|
+
data.tar.gz: 1338e9d41425eeb539a9ff873bb72fd81aa8ac28143a5bfec4a37c0937e29674
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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
|
|
162
|
+
#### Latest release: 3.3.2 (2026-09-16)
|
|
163
163
|
|
|
164
|
-
1.
|
|
165
|
-
2.
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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|
|
data/lib/midi-smtp-server.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
-
#
|
|
201
|
-
attr_reader :
|
|
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
|
-
# +
|
|
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
|
-
|
|
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
|
-
@
|
|
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
|
-
#
|
|
791
|
+
# handle no input data is available yet
|
|
773
792
|
rescue IO::WaitReadable
|
|
774
|
-
|
|
775
|
-
|
|
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])
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
|
|
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.
|
|
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:
|
|
55
|
-
signing_key:
|
|
81
|
+
rubygems_version: 4.0.16
|
|
56
82
|
specification_version: 4
|
|
57
83
|
summary: MidiSmtpServer Class
|
|
58
84
|
test_files: []
|