net-imap 0.4.17 → 0.5.6
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/Gemfile +8 -1
- data/README.md +10 -4
- data/docs/styles.css +75 -14
- data/lib/net/imap/authenticators.rb +2 -2
- data/lib/net/imap/command_data.rb +59 -46
- data/lib/net/imap/config.rb +109 -13
- data/lib/net/imap/data_encoding.rb +3 -3
- data/lib/net/imap/data_lite.rb +226 -0
- data/lib/net/imap/deprecated_client_options.rb +6 -3
- data/lib/net/imap/errors.rb +6 -0
- data/lib/net/imap/esearch_result.rb +180 -0
- data/lib/net/imap/fetch_data.rb +126 -47
- data/lib/net/imap/response_data.rb +124 -237
- data/lib/net/imap/response_parser/parser_utils.rb +5 -0
- data/lib/net/imap/response_parser.rb +183 -34
- data/lib/net/imap/sasl/anonymous_authenticator.rb +3 -3
- data/lib/net/imap/sasl/authentication_exchange.rb +52 -20
- data/lib/net/imap/sasl/authenticators.rb +8 -4
- data/lib/net/imap/sasl/client_adapter.rb +77 -26
- data/lib/net/imap/sasl/cram_md5_authenticator.rb +4 -4
- data/lib/net/imap/sasl/digest_md5_authenticator.rb +218 -56
- data/lib/net/imap/sasl/external_authenticator.rb +2 -2
- data/lib/net/imap/sasl/gs2_header.rb +7 -7
- data/lib/net/imap/sasl/login_authenticator.rb +4 -3
- data/lib/net/imap/sasl/oauthbearer_authenticator.rb +6 -6
- data/lib/net/imap/sasl/plain_authenticator.rb +7 -7
- data/lib/net/imap/sasl/protocol_adapters.rb +60 -4
- data/lib/net/imap/sasl/scram_authenticator.rb +8 -8
- data/lib/net/imap/sasl.rb +7 -4
- data/lib/net/imap/sasl_adapter.rb +0 -1
- data/lib/net/imap/search_result.rb +2 -2
- data/lib/net/imap/sequence_set.rb +211 -81
- data/lib/net/imap/stringprep/nameprep.rb +1 -1
- data/lib/net/imap/stringprep/trace.rb +4 -4
- data/lib/net/imap/uidplus_data.rb +244 -0
- data/lib/net/imap/vanished_data.rb +56 -0
- data/lib/net/imap.rb +831 -279
- data/net-imap.gemspec +1 -1
- data/rakelib/rfcs.rake +2 -0
- data/rakelib/string_prep_tables_generator.rb +2 -0
- metadata +8 -7
@@ -2,9 +2,15 @@
|
|
2
2
|
|
3
3
|
module Net
|
4
4
|
class IMAP < Protocol
|
5
|
+
autoload :ESearchResult, "#{__dir__}/esearch_result"
|
5
6
|
autoload :FetchData, "#{__dir__}/fetch_data"
|
7
|
+
autoload :UIDFetchData, "#{__dir__}/fetch_data"
|
6
8
|
autoload :SearchResult, "#{__dir__}/search_result"
|
7
9
|
autoload :SequenceSet, "#{__dir__}/sequence_set"
|
10
|
+
autoload :UIDPlusData, "#{__dir__}/uidplus_data"
|
11
|
+
autoload :AppendUIDData, "#{__dir__}/uidplus_data"
|
12
|
+
autoload :CopyUIDData, "#{__dir__}/uidplus_data"
|
13
|
+
autoload :VanishedData, "#{__dir__}/vanished_data"
|
8
14
|
|
9
15
|
# Net::IMAP::ContinuationRequest represents command continuation requests.
|
10
16
|
#
|
@@ -157,13 +163,20 @@ module Net
|
|
157
163
|
# The raw response data.
|
158
164
|
end
|
159
165
|
|
160
|
-
#
|
166
|
+
# ResponseText represents texts of responses.
|
161
167
|
#
|
162
168
|
# The text may be prefixed by a ResponseCode.
|
163
169
|
#
|
164
|
-
# ResponseText is returned from TaggedResponse#data
|
165
|
-
# UntaggedResponse#data
|
166
|
-
# "
|
170
|
+
# ResponseText is returned from TaggedResponse#data or
|
171
|
+
# UntaggedResponse#data for
|
172
|
+
# {"status responses"}[https://www.rfc-editor.org/rfc/rfc3501#section-7.1]:
|
173
|
+
# * every TaggedResponse, name[rdoc-ref:TaggedResponse#name] is always
|
174
|
+
# "+OK+", "+NO+", or "+BAD+".
|
175
|
+
# * any UntaggedResponse when name[rdoc-ref:UntaggedResponse#name] is
|
176
|
+
# "+OK+", "+NO+", "+BAD+", "+PREAUTH+", or "+BYE+".
|
177
|
+
#
|
178
|
+
# Note that these "status responses" are confusingly _not_ the same as the
|
179
|
+
# +STATUS+ UntaggedResponse (see IMAP#status and StatusData).
|
167
180
|
class ResponseText < Struct.new(:code, :text)
|
168
181
|
# Used to avoid an allocation when ResponseText is empty
|
169
182
|
EMPTY = new(nil, "").freeze
|
@@ -181,32 +194,35 @@ module Net
|
|
181
194
|
# Returns the response text, not including any response code
|
182
195
|
end
|
183
196
|
|
184
|
-
#
|
185
|
-
#
|
186
|
-
#
|
187
|
-
#
|
197
|
+
# ResponseCode represents an \IMAP response code, which can be retrieved
|
198
|
+
# from ResponseText#code for
|
199
|
+
# {"status responses"}[https://www.rfc-editor.org/rfc/rfc3501#section-7.1]:
|
200
|
+
# * every TaggedResponse, name[rdoc-ref:TaggedResponse#name] is always
|
201
|
+
# "+OK+", "+NO+", or "+BAD+".
|
202
|
+
# * any UntaggedResponse when name[rdoc-ref:UntaggedResponse#name] is
|
203
|
+
# "+OK+", "+NO+", "+BAD+", "+PREAUTH+", or "+BYE+".
|
204
|
+
#
|
205
|
+
# Note that these "status responses" are confusingly _not_ the same as the
|
206
|
+
# +STATUS+ UntaggedResponse (see IMAP#status and StatusData).
|
188
207
|
#
|
189
208
|
# Some response codes come with additional data which will be parsed by
|
190
209
|
# Net::IMAP. Others return +nil+ for #data, but are used as a
|
191
210
|
# machine-readable annotation for the human-readable ResponseText#text in
|
192
|
-
# the same response.
|
193
|
-
# code text, #data returns the unparsed string.
|
211
|
+
# the same response.
|
194
212
|
#
|
195
213
|
# Untagged response code #data is pushed directly onto Net::IMAP#responses,
|
196
214
|
# keyed by #name, unless it is removed by the command that generated it.
|
197
215
|
# Use Net::IMAP#add_response_handler to view tagged response codes for
|
198
216
|
# command methods that do not return their TaggedResponse.
|
199
217
|
#
|
218
|
+
# == Standard response codes
|
219
|
+
#
|
200
220
|
# \IMAP extensions may define new codes and the data that comes with them.
|
201
221
|
# The IANA {IMAP Response
|
202
222
|
# Codes}[https://www.iana.org/assignments/imap-response-codes/imap-response-codes.xhtml]
|
203
223
|
# registry has links to specifications for all standard response codes.
|
204
|
-
# Response codes are backwards compatible: Servers are allowed to send new
|
205
|
-
# response codes even if the client has not enabled the extension that
|
206
|
-
# defines them. When unknown response code data is encountered, #data
|
207
|
-
# will return an unparsed string.
|
208
224
|
#
|
209
|
-
#
|
225
|
+
# === +IMAP4rev1+ response codes
|
210
226
|
# See [IMAP4rev1[https://www.rfc-editor.org/rfc/rfc3501]] {§7.1, "Server
|
211
227
|
# Responses - Status
|
212
228
|
# Responses"}[https://www.rfc-editor.org/rfc/rfc3501#section-7.1] for full
|
@@ -237,24 +253,24 @@ module Net
|
|
237
253
|
# the <tt>\Seen</tt> flag set.
|
238
254
|
# <em>DEPRECATED by IMAP4rev2.</em>
|
239
255
|
#
|
240
|
-
#
|
256
|
+
# === +BINARY+ extension
|
241
257
|
# See {[RFC3516]}[https://www.rfc-editor.org/rfc/rfc3516].
|
242
258
|
# * +UNKNOWN-CTE+, with a tagged +NO+ response, when the server does not
|
243
259
|
# known how to decode a CTE (content-transfer-encoding). #data is +nil+.
|
244
260
|
# See IMAP#fetch.
|
245
261
|
#
|
246
|
-
#
|
262
|
+
# === +UIDPLUS+ extension
|
247
263
|
# See {[RFC4315 §3]}[https://www.rfc-editor.org/rfc/rfc4315#section-3].
|
248
264
|
# * +APPENDUID+, #data is UIDPlusData. See IMAP#append.
|
249
265
|
# * +COPYUID+, #data is UIDPlusData. See IMAP#copy.
|
250
266
|
# * +UIDNOTSTICKY+, #data is +nil+. See IMAP#select.
|
251
267
|
#
|
252
|
-
#
|
268
|
+
# === +SEARCHRES+ extension
|
253
269
|
# See {[RFC5182]}[https://www.rfc-editor.org/rfc/rfc5182].
|
254
270
|
# * +NOTSAVED+, with a tagged +NO+ response, when the search result variable
|
255
271
|
# is not saved. #data is +nil+.
|
256
272
|
#
|
257
|
-
#
|
273
|
+
# === +RFC5530+ response codes
|
258
274
|
# See {[RFC5530]}[https://www.rfc-editor.org/rfc/rfc5530], "IMAP Response
|
259
275
|
# Codes" for the definition of the following response codes, which are all
|
260
276
|
# machine-readable annotations for the human-readable ResponseText#text, and
|
@@ -277,22 +293,22 @@ module Net
|
|
277
293
|
# * +ALREADYEXISTS+
|
278
294
|
# * +NONEXISTENT+
|
279
295
|
#
|
280
|
-
#
|
296
|
+
# === +QRESYNC+ extension
|
281
297
|
# See {[RFC7162]}[https://www.rfc-editor.org/rfc/rfc7162.html].
|
282
298
|
# * +CLOSED+, returned when the currently selected mailbox is closed
|
283
299
|
# implicitly by selecting or examining another mailbox. #data is +nil+.
|
284
300
|
#
|
285
|
-
#
|
301
|
+
# === +IMAP4rev2+ response codes
|
286
302
|
# See {[RFC9051]}[https://www.rfc-editor.org/rfc/rfc9051] {§7.1, "Server
|
287
303
|
# Responses - Status
|
288
304
|
# Responses"}[https://www.rfc-editor.org/rfc/rfc9051#section-7.1] for full
|
289
305
|
# descriptions of IMAP4rev2 response codes. IMAP4rev2 includes all of the
|
290
|
-
# response codes listed above (except "UNSEEN") and adds the following:
|
306
|
+
# response codes listed above (except "+UNSEEN+") and adds the following:
|
291
307
|
# * +HASCHILDREN+, with a tagged +NO+ response, when a mailbox delete failed
|
292
308
|
# because the server doesn't allow deletion of mailboxes with children.
|
293
309
|
# #data is +nil+.
|
294
310
|
#
|
295
|
-
#
|
311
|
+
# === +CONDSTORE+ extension
|
296
312
|
# See {[RFC7162]}[https://www.rfc-editor.org/rfc/rfc7162.html].
|
297
313
|
# * +NOMODSEQ+, when selecting a mailbox that does not support
|
298
314
|
# mod-sequences. #data is +nil+. See IMAP#select.
|
@@ -302,10 +318,17 @@ module Net
|
|
302
318
|
# since the +UNCHANGEDSINCE+ mod-sequence given to +STORE+ or <tt>UID
|
303
319
|
# STORE</tt>.
|
304
320
|
#
|
305
|
-
#
|
321
|
+
# === +OBJECTID+ extension
|
306
322
|
# See {[RFC8474]}[https://www.rfc-editor.org/rfc/rfc8474.html].
|
307
323
|
# * +MAILBOXID+, #data is a string
|
308
324
|
#
|
325
|
+
# == Extension compatibility
|
326
|
+
#
|
327
|
+
# Response codes are backwards compatible: Servers are allowed to send new
|
328
|
+
# response codes even if the client has not enabled the extension that
|
329
|
+
# defines them. When Net::IMAP does not know how to parse response
|
330
|
+
# code text, #data returns the unparsed string.
|
331
|
+
#
|
309
332
|
class ResponseCode < Struct.new(:name, :data)
|
310
333
|
##
|
311
334
|
# method: name
|
@@ -324,64 +347,8 @@ module Net
|
|
324
347
|
# code data can take.
|
325
348
|
end
|
326
349
|
|
327
|
-
#
|
328
|
-
#
|
329
|
-
#
|
330
|
-
# See [[UIDPLUS[https://www.rfc-editor.org/rfc/rfc4315.html]].
|
331
|
-
#
|
332
|
-
# ==== Capability requirement
|
333
|
-
#
|
334
|
-
# The +UIDPLUS+ capability[rdoc-ref:Net::IMAP#capability] must be supported.
|
335
|
-
# A server that supports +UIDPLUS+ should send a UIDPlusData object inside
|
336
|
-
# every TaggedResponse returned by the append[rdoc-ref:Net::IMAP#append],
|
337
|
-
# copy[rdoc-ref:Net::IMAP#copy], move[rdoc-ref:Net::IMAP#move], {uid
|
338
|
-
# copy}[rdoc-ref:Net::IMAP#uid_copy], and {uid
|
339
|
-
# move}[rdoc-ref:Net::IMAP#uid_move] commands---unless the destination
|
340
|
-
# mailbox reports +UIDNOTSTICKY+.
|
341
|
-
#
|
342
|
-
#--
|
343
|
-
# TODO: support MULTIAPPEND
|
344
|
-
#++
|
345
|
-
#
|
346
|
-
class UIDPlusData < Struct.new(:uidvalidity, :source_uids, :assigned_uids)
|
347
|
-
##
|
348
|
-
# method: uidvalidity
|
349
|
-
# :call-seq: uidvalidity -> nonzero uint32
|
350
|
-
#
|
351
|
-
# The UIDVALIDITY of the destination mailbox.
|
352
|
-
|
353
|
-
##
|
354
|
-
# method: source_uids
|
355
|
-
# :call-seq: source_uids -> nil or an array of nonzero uint32
|
356
|
-
#
|
357
|
-
# The UIDs of the copied or moved messages.
|
358
|
-
#
|
359
|
-
# Note:: Returns +nil+ for Net::IMAP#append.
|
360
|
-
|
361
|
-
##
|
362
|
-
# method: assigned_uids
|
363
|
-
# :call-seq: assigned_uids -> an array of nonzero uint32
|
364
|
-
#
|
365
|
-
# The newly assigned UIDs of the copied, moved, or appended messages.
|
366
|
-
#
|
367
|
-
# Note:: This always returns an array, even when it contains only one UID.
|
368
|
-
|
369
|
-
##
|
370
|
-
# :call-seq: uid_mapping -> nil or a hash
|
371
|
-
#
|
372
|
-
# Returns a hash mapping each source UID to the newly assigned destination
|
373
|
-
# UID.
|
374
|
-
#
|
375
|
-
# Note:: Returns +nil+ for Net::IMAP#append.
|
376
|
-
def uid_mapping
|
377
|
-
source_uids&.zip(assigned_uids)&.to_h
|
378
|
-
end
|
379
|
-
end
|
380
|
-
|
381
|
-
# Net::IMAP::MailboxList represents contents of the LIST response,
|
382
|
-
# representing a single mailbox path.
|
383
|
-
#
|
384
|
-
# Net::IMAP#list returns an array of MailboxList objects.
|
350
|
+
# MailboxList represents the data of an untagged +LIST+ response, for a
|
351
|
+
# _single_ mailbox path. IMAP#list returns an array of MailboxList objects.
|
385
352
|
#
|
386
353
|
class MailboxList < Struct.new(:attr, :delim, :name)
|
387
354
|
##
|
@@ -391,11 +358,11 @@ module Net
|
|
391
358
|
# Returns the name attributes. Each name attribute is a symbol capitalized
|
392
359
|
# by String#capitalize, such as :Noselect (not :NoSelect). For the
|
393
360
|
# semantics of each attribute, see:
|
394
|
-
# *
|
395
|
-
# *
|
396
|
-
# * Net::IMAP@SPECIAL-USE
|
361
|
+
# * Net::IMAP@Basic+Mailbox+Attributes
|
362
|
+
# * Net::IMAP@Mailbox+role+Attributes
|
397
363
|
# * The IANA {IMAP Mailbox Name Attributes
|
398
364
|
# registry}[https://www.iana.org/assignments/imap-mailbox-name-attributes/imap-mailbox-name-attributes.xhtml]
|
365
|
+
# has links to specifications for all standard mailbox attributes.
|
399
366
|
|
400
367
|
##
|
401
368
|
# method: delim
|
@@ -410,16 +377,16 @@ module Net
|
|
410
377
|
# Returns the mailbox name.
|
411
378
|
end
|
412
379
|
|
413
|
-
#
|
414
|
-
# This object can also be a response to GETQUOTAROOT. In the syntax
|
415
|
-
# specification below, the delimiter used with the "#" construct is a
|
416
|
-
# single space (SPACE).
|
380
|
+
# MailboxQuota represents the data of an untagged +QUOTA+ response.
|
417
381
|
#
|
418
|
-
#
|
382
|
+
# IMAP#getquota returns an array of MailboxQuota objects.
|
419
383
|
#
|
420
384
|
# Net::IMAP#getquotaroot returns an array containing both MailboxQuotaRoot
|
421
385
|
# and MailboxQuota objects.
|
422
386
|
#
|
387
|
+
# == Required capability
|
388
|
+
# Requires +QUOTA+ [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]]
|
389
|
+
# capability.
|
423
390
|
class MailboxQuota < Struct.new(:mailbox, :usage, :quota)
|
424
391
|
##
|
425
392
|
# method: mailbox
|
@@ -441,12 +408,14 @@ module Net
|
|
441
408
|
#
|
442
409
|
end
|
443
410
|
|
444
|
-
#
|
445
|
-
# response. (GETQUOTAROOT can also return Net::IMAP::MailboxQuota.)
|
411
|
+
# MailboxQuotaRoot represents the data of an untagged +QUOTAROOT+ response.
|
446
412
|
#
|
447
|
-
#
|
448
|
-
#
|
413
|
+
# IMAP#getquotaroot returns an array containing both MailboxQuotaRoot and
|
414
|
+
# MailboxQuota objects.
|
449
415
|
#
|
416
|
+
# == Required capability
|
417
|
+
# Requires +QUOTA+ [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]]
|
418
|
+
# capability.
|
450
419
|
class MailboxQuotaRoot < Struct.new(:mailbox, :quotaroots)
|
451
420
|
##
|
452
421
|
# method: mailbox
|
@@ -461,12 +430,13 @@ module Net
|
|
461
430
|
# Zero or more quotaroots that affect the quota on the specified mailbox.
|
462
431
|
end
|
463
432
|
|
464
|
-
#
|
433
|
+
# MailboxACLItem represents the data of an untagged +ACL+ response.
|
465
434
|
#
|
466
|
-
#
|
435
|
+
# IMAP#getacl returns an array of MailboxACLItem objects.
|
467
436
|
#
|
468
|
-
#
|
469
|
-
# +ACL+
|
437
|
+
# == Required capability
|
438
|
+
# Requires +ACL+ [RFC4314[https://www.rfc-editor.org/rfc/rfc4314]]
|
439
|
+
# capability.
|
470
440
|
class MailboxACLItem < Struct.new(:user, :rights, :mailbox)
|
471
441
|
##
|
472
442
|
# method: mailbox
|
@@ -488,11 +458,12 @@ module Net
|
|
488
458
|
# The access rights the indicated #user has to the #mailbox.
|
489
459
|
end
|
490
460
|
|
491
|
-
#
|
492
|
-
#
|
493
|
-
#
|
494
|
-
# Returned by Net::IMAP#namespace, contained inside a Namespaces object.
|
461
|
+
# Namespace represents a _single_ namespace, contained inside a Namespaces
|
462
|
+
# object.
|
495
463
|
#
|
464
|
+
# == Required capability
|
465
|
+
# Requires either +NAMESPACE+ [RFC2342[https://www.rfc-editor.org/rfc/rfc2342]]
|
466
|
+
# or +IMAP4rev2+ capability.
|
496
467
|
class Namespace < Struct.new(:prefix, :delim, :extensions)
|
497
468
|
##
|
498
469
|
# method: prefix
|
@@ -514,11 +485,14 @@ module Net
|
|
514
485
|
# Extension parameter semantics would be defined by the extension.
|
515
486
|
end
|
516
487
|
|
517
|
-
#
|
518
|
-
#
|
488
|
+
# Namespaces represents the data of an untagged +NAMESPACE+ response,
|
489
|
+
# returned by IMAP#namespace.
|
519
490
|
#
|
520
|
-
#
|
491
|
+
# Contains lists of #personal, #shared, and #other namespaces.
|
521
492
|
#
|
493
|
+
# == Required capability
|
494
|
+
# Requires either +NAMESPACE+ [RFC2342[https://www.rfc-editor.org/rfc/rfc2342]]
|
495
|
+
# or +IMAP4rev2+ capability.
|
522
496
|
class Namespaces < Struct.new(:personal, :other, :shared)
|
523
497
|
##
|
524
498
|
# method: personal
|
@@ -539,9 +513,9 @@ module Net
|
|
539
513
|
# Returns an array of Shared Namespace objects.
|
540
514
|
end
|
541
515
|
|
542
|
-
#
|
516
|
+
# StatusData represents the contents of an untagged +STATUS+ response.
|
543
517
|
#
|
544
|
-
#
|
518
|
+
# IMAP#status returns the contents of #attr.
|
545
519
|
class StatusData < Struct.new(:mailbox, :attr)
|
546
520
|
##
|
547
521
|
# method: mailbox
|
@@ -562,11 +536,11 @@ module Net
|
|
562
536
|
# [Note]
|
563
537
|
# When the #sender and #reply_to fields are absent or empty, they will
|
564
538
|
# return the same value as #from. Also, fields may return values that are
|
565
|
-
# invalid for well-formed [RFC5322[https://
|
539
|
+
# invalid for well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
566
540
|
# messages when the message is malformed or a draft message.
|
567
541
|
#
|
568
|
-
# See [{IMAP4rev1 §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501
|
569
|
-
# and [{IMAP4rev2 §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051
|
542
|
+
# See [{IMAP4rev1 §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501#section-7.4.2]]
|
543
|
+
# and [{IMAP4rev2 §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051#section-7.5.2]]
|
570
544
|
# for full description of the envelope fields, and
|
571
545
|
# Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
|
572
546
|
#
|
@@ -580,7 +554,7 @@ module Net
|
|
580
554
|
# Returns a string that represents the +Date+ header.
|
581
555
|
#
|
582
556
|
# [Note]
|
583
|
-
# For a well-formed [RFC5322[https://
|
557
|
+
# For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
584
558
|
# message, the #date field must not be +nil+. However it can be +nil+
|
585
559
|
# for a malformed or draft message.
|
586
560
|
|
@@ -606,7 +580,7 @@ module Net
|
|
606
580
|
# returns +nil+ for this envelope field.
|
607
581
|
#
|
608
582
|
# [Note]
|
609
|
-
# For a well-formed [RFC5322[https://
|
583
|
+
# For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
610
584
|
# message, the #from field must not be +nil+. However it can be +nil+
|
611
585
|
# for a malformed or draft message.
|
612
586
|
|
@@ -619,7 +593,7 @@ module Net
|
|
619
593
|
# [Note]
|
620
594
|
# If the <tt>Sender</tt> header is absent, or is present but empty, the
|
621
595
|
# server sets this field to be the same value as #from. Therefore, in a
|
622
|
-
# well-formed [RFC5322[https://
|
596
|
+
# well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] message,
|
623
597
|
# the #sender envelope field must not be +nil+. However it can be
|
624
598
|
# +nil+ for a malformed or draft message.
|
625
599
|
|
@@ -633,7 +607,7 @@ module Net
|
|
633
607
|
# [Note]
|
634
608
|
# If the <tt>Reply-To</tt> header is absent, or is present but empty,
|
635
609
|
# the server sets this field to be the same value as #from. Therefore,
|
636
|
-
# in a well-formed [RFC5322[https://
|
610
|
+
# in a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
637
611
|
# message, the #reply_to envelope field must not be +nil+. However it
|
638
612
|
# can be +nil+ for a malformed or draft message.
|
639
613
|
|
@@ -662,7 +636,7 @@ module Net
|
|
662
636
|
# Returns a string that represents the <tt>In-Reply-To</tt> header.
|
663
637
|
#
|
664
638
|
# [Note]
|
665
|
-
# For a well-formed [RFC5322[https://
|
639
|
+
# For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
666
640
|
# message, the #in_reply_to field, if present, must not be empty. But
|
667
641
|
# it can still return an empty string for malformed messages.
|
668
642
|
#
|
@@ -678,7 +652,7 @@ module Net
|
|
678
652
|
# Returns a string that represents the <tt>Message-ID</tt>.
|
679
653
|
#
|
680
654
|
# [Note]
|
681
|
-
# For a well-formed [RFC5322[https://
|
655
|
+
# For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
682
656
|
# message, the #message_id field, if present, must not be empty. But it
|
683
657
|
# can still return an empty string for malformed messages.
|
684
658
|
#
|
@@ -692,10 +666,10 @@ module Net
|
|
692
666
|
# parsed into its component parts by the server. Address objects are
|
693
667
|
# returned within Envelope fields.
|
694
668
|
#
|
695
|
-
#
|
669
|
+
# == Group syntax
|
696
670
|
#
|
697
671
|
# When the #host field is +nil+, this is a special form of address structure
|
698
|
-
# that indicates the [RFC5322[https://
|
672
|
+
# that indicates the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] group
|
699
673
|
# syntax. If the #mailbox name field is also +nil+, this is an end-of-group
|
700
674
|
# marker (semicolon in RFC-822 syntax). If the #mailbox name field is
|
701
675
|
# non-+NIL+, this is the start of a group marker, and the mailbox #name
|
@@ -705,7 +679,7 @@ module Net
|
|
705
679
|
# method: name
|
706
680
|
# :call-seq: name -> string or nil
|
707
681
|
#
|
708
|
-
# Returns the [RFC5322[https://
|
682
|
+
# Returns the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] address
|
709
683
|
# +display-name+ (or the mailbox +phrase+ in the RFC-822 grammar).
|
710
684
|
|
711
685
|
##
|
@@ -715,28 +689,28 @@ module Net
|
|
715
689
|
# Returns the route from RFC-822 route-addr.
|
716
690
|
#
|
717
691
|
# Note:: Generating this obsolete route addressing syntax is not allowed
|
718
|
-
# by [RFC5322[https://
|
692
|
+
# by [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]. However,
|
719
693
|
# addresses with this syntax must still be accepted and parsed.
|
720
694
|
|
721
695
|
##
|
722
696
|
# method: mailbox
|
723
697
|
# :call-seq: mailbox -> string or nil
|
724
698
|
#
|
725
|
-
# Returns the [RFC5322[https://
|
699
|
+
# Returns the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] address
|
726
700
|
# +local-part+, if #host is not +nil+.
|
727
701
|
#
|
728
702
|
# When #host is +nil+, this returns
|
729
|
-
# an [RFC5322[https://
|
703
|
+
# an [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] group name and a +nil+
|
730
704
|
# mailbox indicates the end of a group.
|
731
705
|
|
732
706
|
##
|
733
707
|
# method: host
|
734
708
|
# :call-seq: host -> string or nil
|
735
709
|
#
|
736
|
-
# Returns the [RFC5322[https://
|
710
|
+
# Returns the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] addr-spec
|
737
711
|
# +domain+ name.
|
738
712
|
#
|
739
|
-
# +nil+ indicates [RFC5322[https://
|
713
|
+
# +nil+ indicates [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] group
|
740
714
|
# syntax.
|
741
715
|
end
|
742
716
|
|
@@ -748,14 +722,14 @@ module Net
|
|
748
722
|
# :call-seq: dsp_type -> string
|
749
723
|
#
|
750
724
|
# Returns the content disposition type, as defined by
|
751
|
-
# [DISPOSITION[https://
|
725
|
+
# [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]].
|
752
726
|
|
753
727
|
##
|
754
728
|
# method: param
|
755
729
|
# :call-seq: param -> hash
|
756
730
|
#
|
757
731
|
# Returns a hash representing parameters of the Content-Disposition
|
758
|
-
# field, as defined by [DISPOSITION[https://
|
732
|
+
# field, as defined by [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]].
|
759
733
|
end
|
760
734
|
|
761
735
|
# Net::IMAP::ThreadMember represents a thread-node returned
|
@@ -794,12 +768,12 @@ module Net
|
|
794
768
|
# FetchData#attr value. Although these classes don't share a base class,
|
795
769
|
# this module can be used to pattern match all of them.
|
796
770
|
#
|
797
|
-
# See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501
|
798
|
-
# and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051
|
771
|
+
# See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501#section-7.4.2]
|
772
|
+
# and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051#section-7.5.2-4.9]
|
799
773
|
# for full description of all +BODYSTRUCTURE+ fields, and also
|
800
774
|
# Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
|
801
775
|
#
|
802
|
-
#
|
776
|
+
# == Classes that include BodyStructure
|
803
777
|
# BodyTypeBasic:: Represents any message parts that are not handled by
|
804
778
|
# BodyTypeText, BodyTypeMessage, or BodyTypeMultipart.
|
805
779
|
# BodyTypeText:: Used by <tt>text/*</tt> parts. Contains all of the
|
@@ -817,8 +791,8 @@ module Net
|
|
817
791
|
# message parts, unless they have a <tt>Content-Type</tt> that is handled by
|
818
792
|
# BodyTypeText, BodyTypeMessage, or BodyTypeMultipart.
|
819
793
|
#
|
820
|
-
# See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501
|
821
|
-
# and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051
|
794
|
+
# See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501#section-7.4.2]
|
795
|
+
# and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051#section-7.5.2-4.9]
|
822
796
|
# for full description of all +BODYSTRUCTURE+ fields, and also
|
823
797
|
# Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
|
824
798
|
#
|
@@ -835,45 +809,45 @@ module Net
|
|
835
809
|
# :call-seq: media_type -> string
|
836
810
|
#
|
837
811
|
# The top-level media type as defined in
|
838
|
-
# [MIME-IMB[https://
|
812
|
+
# [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
|
839
813
|
|
840
814
|
##
|
841
815
|
# method: subtype
|
842
816
|
# :call-seq: subtype -> string
|
843
817
|
#
|
844
818
|
# The media subtype name as defined in
|
845
|
-
# [MIME-IMB[https://
|
819
|
+
# [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
|
846
820
|
|
847
821
|
##
|
848
822
|
# method: param
|
849
823
|
# :call-seq: param -> string
|
850
824
|
#
|
851
825
|
# Returns a hash that represents parameters as defined in
|
852
|
-
# [MIME-IMB[https://
|
826
|
+
# [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
|
853
827
|
|
854
828
|
##
|
855
829
|
# method: content_id
|
856
830
|
# :call-seq: content_id -> string
|
857
831
|
#
|
858
832
|
# Returns a string giving the content id as defined
|
859
|
-
# in [MIME-IMB[https://
|
860
|
-
# {§7}[https://
|
833
|
+
# in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]
|
834
|
+
# {§7}[https://www.rfc-editor.org/rfc/rfc2045#section-7].
|
861
835
|
|
862
836
|
##
|
863
837
|
# method: description
|
864
838
|
# :call-seq: description -> string
|
865
839
|
#
|
866
840
|
# Returns a string giving the content description as defined
|
867
|
-
# in [MIME-IMB[https://
|
868
|
-
# {§8}[https://
|
841
|
+
# in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]
|
842
|
+
# {§8}[https://www.rfc-editor.org/rfc/rfc2045#section-8].
|
869
843
|
|
870
844
|
##
|
871
845
|
# method: encoding
|
872
846
|
# :call-seq: encoding -> string
|
873
847
|
#
|
874
848
|
# Returns a string giving the content transfer encoding as defined
|
875
|
-
# in [MIME-IMB[https://
|
876
|
-
# {§6}[https://
|
849
|
+
# in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]
|
850
|
+
# {§6}[https://www.rfc-editor.org/rfc/rfc2045#section-6].
|
877
851
|
|
878
852
|
##
|
879
853
|
# method: size
|
@@ -886,7 +860,7 @@ module Net
|
|
886
860
|
# :call-seq: md5 -> string
|
887
861
|
#
|
888
862
|
# Returns a string giving the body MD5 value as defined in
|
889
|
-
# [MD5[https://
|
863
|
+
# [MD5[https://www.rfc-editor.org/rfc/rfc1864]].
|
890
864
|
|
891
865
|
##
|
892
866
|
# method: disposition
|
@@ -894,7 +868,7 @@ module Net
|
|
894
868
|
#
|
895
869
|
# Returns a ContentDisposition object giving the content
|
896
870
|
# disposition, as defined by
|
897
|
-
# [DISPOSITION[https://
|
871
|
+
# [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]].
|
898
872
|
|
899
873
|
##
|
900
874
|
# method: language
|
@@ -939,7 +913,8 @@ module Net
|
|
939
913
|
# for something else?
|
940
914
|
#++
|
941
915
|
def media_subtype
|
942
|
-
warn("media_subtype is obsolete, use subtype instead.\n",
|
916
|
+
warn("media_subtype is obsolete, use subtype instead.\n",
|
917
|
+
uplevel: 1, category: :deprecated)
|
943
918
|
return subtype
|
944
919
|
end
|
945
920
|
end
|
@@ -984,7 +959,8 @@ module Net
|
|
984
959
|
# generate a warning message to +stderr+, then return
|
985
960
|
# the value of +subtype+.
|
986
961
|
def media_subtype
|
987
|
-
warn("media_subtype is obsolete, use subtype instead.\n",
|
962
|
+
warn("media_subtype is obsolete, use subtype instead.\n",
|
963
|
+
uplevel: 1, category: :deprecated)
|
988
964
|
return subtype
|
989
965
|
end
|
990
966
|
end
|
@@ -1040,77 +1016,6 @@ module Net
|
|
1040
1016
|
end
|
1041
1017
|
end
|
1042
1018
|
|
1043
|
-
# BodyTypeAttachment is not used and will be removed in an upcoming release.
|
1044
|
-
#
|
1045
|
-
# === Bug Analysis
|
1046
|
-
#
|
1047
|
-
# \IMAP body structures are parenthesized lists and assign their fields
|
1048
|
-
# positionally, so missing fields change the interpretation of all
|
1049
|
-
# following fields. Additionally, different body types have a different
|
1050
|
-
# number of required fields, followed by optional "extension" fields.
|
1051
|
-
#
|
1052
|
-
# BodyTypeAttachment was previously returned when a "message/rfc822" part,
|
1053
|
-
# which should be sent as <tt>body-type-msg</tt> with ten required fields,
|
1054
|
-
# was actually sent as a <tt>body-type-basic</tt> with _seven_ required
|
1055
|
-
# fields.
|
1056
|
-
#
|
1057
|
-
# basic => type, subtype, param, id, desc, enc, octets, md5=nil, dsp=nil, lang=nil, loc=nil, *ext
|
1058
|
-
# msg => type, subtype, param, id, desc, enc, octets, envelope, body, lines, md5=nil, ...
|
1059
|
-
#
|
1060
|
-
# Normally, +envelope+ and +md5+ are incompatible, but Net::IMAP leniently
|
1061
|
-
# allowed buggy servers to send +NIL+ for +envelope+. As a result, when a
|
1062
|
-
# server sent a <tt>message/rfc822</tt> part with +NIL+ for +md5+ and a
|
1063
|
-
# non-<tt>NIL</tt> +dsp+, Net::IMAP misinterpreted the
|
1064
|
-
# <tt>Content-Disposition</tt> as if it were a strange body type. In all
|
1065
|
-
# reported cases, the <tt>Content-Disposition</tt> was "attachment", so
|
1066
|
-
# BodyTypeAttachment was created as the workaround.
|
1067
|
-
#
|
1068
|
-
# === Current behavior
|
1069
|
-
#
|
1070
|
-
# When interpreted strictly, +envelope+ and +md5+ are incompatible. So the
|
1071
|
-
# current parsing algorithm peeks ahead after it has received the seventh
|
1072
|
-
# body field. If the next token is not the start of an +envelope+, we assume
|
1073
|
-
# the server has incorrectly sent us a <tt>body-type-basic</tt> and return
|
1074
|
-
# BodyTypeBasic. As a result, what was previously BodyTypeMessage#body =>
|
1075
|
-
# BodyTypeAttachment is now BodyTypeBasic#disposition => ContentDisposition.
|
1076
|
-
#
|
1077
|
-
class BodyTypeAttachment < Struct.new(:dsp_type, :_unused_, :param)
|
1078
|
-
# *invalid for BodyTypeAttachment*
|
1079
|
-
def media_type
|
1080
|
-
warn(<<~WARN, uplevel: 1)
|
1081
|
-
BodyTypeAttachment#media_type is obsolete. Use dsp_type instead.
|
1082
|
-
WARN
|
1083
|
-
dsp_type
|
1084
|
-
end
|
1085
|
-
|
1086
|
-
# *invalid for BodyTypeAttachment*
|
1087
|
-
def subtype
|
1088
|
-
warn("BodyTypeAttachment#subtype is obsolete.\n", uplevel: 1)
|
1089
|
-
nil
|
1090
|
-
end
|
1091
|
-
|
1092
|
-
##
|
1093
|
-
# method: dsp_type
|
1094
|
-
# :call-seq: dsp_type -> string
|
1095
|
-
#
|
1096
|
-
# Returns the content disposition type, as defined by
|
1097
|
-
# [DISPOSITION[https://tools.ietf.org/html/rfc2183]].
|
1098
|
-
|
1099
|
-
##
|
1100
|
-
# method: param
|
1101
|
-
# :call-seq: param -> hash
|
1102
|
-
#
|
1103
|
-
# Returns a hash representing parameters of the Content-Disposition
|
1104
|
-
# field, as defined by [DISPOSITION[https://tools.ietf.org/html/rfc2183]].
|
1105
|
-
|
1106
|
-
##
|
1107
|
-
def multipart?
|
1108
|
-
return false
|
1109
|
-
end
|
1110
|
-
end
|
1111
|
-
|
1112
|
-
deprecate_constant :BodyTypeAttachment
|
1113
|
-
|
1114
1019
|
# Net::IMAP::BodyTypeMultipart represents body structures of messages and
|
1115
1020
|
# message parts, when <tt>Content-Type</tt> is <tt>multipart/*</tt>.
|
1116
1021
|
class BodyTypeMultipart < Struct.new(:media_type, :subtype,
|
@@ -1131,7 +1036,7 @@ module Net
|
|
1131
1036
|
# call-seq: subtype -> string
|
1132
1037
|
#
|
1133
1038
|
# Returns the content subtype name
|
1134
|
-
# as defined in [MIME-IMB[https://
|
1039
|
+
# as defined in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
|
1135
1040
|
|
1136
1041
|
##
|
1137
1042
|
# method: parts
|
@@ -1145,7 +1050,7 @@ module Net
|
|
1145
1050
|
# call-seq: param -> hash
|
1146
1051
|
#
|
1147
1052
|
# Returns a hash that represents parameters
|
1148
|
-
# as defined in [MIME-IMB[https://
|
1053
|
+
# as defined in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
|
1149
1054
|
|
1150
1055
|
##
|
1151
1056
|
# method: disposition
|
@@ -1182,29 +1087,11 @@ module Net
|
|
1182
1087
|
# generate a warning message to +stderr+, then return
|
1183
1088
|
# the value of +subtype+.
|
1184
1089
|
def media_subtype
|
1185
|
-
warn("media_subtype is obsolete, use subtype instead.\n",
|
1090
|
+
warn("media_subtype is obsolete, use subtype instead.\n",
|
1091
|
+
uplevel: 1, category: :deprecated)
|
1186
1092
|
return subtype
|
1187
1093
|
end
|
1188
1094
|
end
|
1189
1095
|
|
1190
|
-
# === Obsolete
|
1191
|
-
# BodyTypeExtension is not used and will be removed in an upcoming release.
|
1192
|
-
#
|
1193
|
-
# >>>
|
1194
|
-
# BodyTypeExtension was (incorrectly) used for <tt>message/*</tt> parts
|
1195
|
-
# (besides <tt>message/rfc822</tt>, which correctly uses BodyTypeMessage).
|
1196
|
-
#
|
1197
|
-
# Net::IMAP now (correctly) parses all message types (other than
|
1198
|
-
# <tt>message/rfc822</tt> or <tt>message/global</tt>) as BodyTypeBasic.
|
1199
|
-
class BodyTypeExtension < Struct.new(:media_type, :subtype,
|
1200
|
-
:params, :content_id,
|
1201
|
-
:description, :encoding, :size)
|
1202
|
-
def multipart?
|
1203
|
-
return false
|
1204
|
-
end
|
1205
|
-
end
|
1206
|
-
|
1207
|
-
deprecate_constant :BodyTypeExtension
|
1208
|
-
|
1209
1096
|
end
|
1210
1097
|
end
|