net-imap 0.4.12 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of net-imap might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +7 -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 +61 -48
- data/lib/net/imap/config/attr_accessors.rb +75 -0
- data/lib/net/imap/config/attr_inheritance.rb +90 -0
- data/lib/net/imap/config/attr_type_coercion.rb +61 -0
- data/lib/net/imap/config.rb +402 -0
- 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 +8 -5
- 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 +126 -193
- data/lib/net/imap/response_parser/parser_utils.rb +11 -6
- data/lib/net/imap/response_parser.rb +159 -21
- 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 +28 -24
- data/lib/net/imap/stringprep/nameprep.rb +1 -1
- data/lib/net/imap/stringprep/trace.rb +4 -4
- data/lib/net/imap/vanished_data.rb +56 -0
- data/lib/net/imap.rb +1001 -319
- data/net-imap.gemspec +3 -3
- data/rakelib/rfcs.rake +2 -0
- data/rakelib/string_prep_tables_generator.rb +2 -0
- metadata +11 -10
- data/.github/dependabot.yml +0 -6
- data/.github/workflows/pages.yml +0 -46
- data/.github/workflows/push_gem.yml +0 -48
- data/.github/workflows/test.yml +0 -31
- data/.gitignore +0 -12
- data/.mailmap +0 -13
@@ -2,9 +2,12 @@
|
|
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 :VanishedData, "#{__dir__}/vanished_data"
|
8
11
|
|
9
12
|
# Net::IMAP::ContinuationRequest represents command continuation requests.
|
10
13
|
#
|
@@ -157,13 +160,20 @@ module Net
|
|
157
160
|
# The raw response data.
|
158
161
|
end
|
159
162
|
|
160
|
-
#
|
163
|
+
# ResponseText represents texts of responses.
|
161
164
|
#
|
162
165
|
# The text may be prefixed by a ResponseCode.
|
163
166
|
#
|
164
|
-
# ResponseText is returned from TaggedResponse#data
|
165
|
-
# UntaggedResponse#data
|
166
|
-
# "
|
167
|
+
# ResponseText is returned from TaggedResponse#data or
|
168
|
+
# UntaggedResponse#data for
|
169
|
+
# {"status responses"}[https://www.rfc-editor.org/rfc/rfc3501#section-7.1]:
|
170
|
+
# * every TaggedResponse, name[rdoc-ref:TaggedResponse#name] is always
|
171
|
+
# "+OK+", "+NO+", or "+BAD+".
|
172
|
+
# * any UntaggedResponse when name[rdoc-ref:UntaggedResponse#name] is
|
173
|
+
# "+OK+", "+NO+", "+BAD+", "+PREAUTH+", or "+BYE+".
|
174
|
+
#
|
175
|
+
# Note that these "status responses" are confusingly _not_ the same as the
|
176
|
+
# +STATUS+ UntaggedResponse (see IMAP#status and StatusData).
|
167
177
|
class ResponseText < Struct.new(:code, :text)
|
168
178
|
# Used to avoid an allocation when ResponseText is empty
|
169
179
|
EMPTY = new(nil, "").freeze
|
@@ -181,32 +191,35 @@ module Net
|
|
181
191
|
# Returns the response text, not including any response code
|
182
192
|
end
|
183
193
|
|
184
|
-
#
|
185
|
-
#
|
186
|
-
#
|
187
|
-
#
|
194
|
+
# ResponseCode represents an \IMAP response code, which can be retrieved
|
195
|
+
# from ResponseText#code for
|
196
|
+
# {"status responses"}[https://www.rfc-editor.org/rfc/rfc3501#section-7.1]:
|
197
|
+
# * every TaggedResponse, name[rdoc-ref:TaggedResponse#name] is always
|
198
|
+
# "+OK+", "+NO+", or "+BAD+".
|
199
|
+
# * any UntaggedResponse when name[rdoc-ref:UntaggedResponse#name] is
|
200
|
+
# "+OK+", "+NO+", "+BAD+", "+PREAUTH+", or "+BYE+".
|
201
|
+
#
|
202
|
+
# Note that these "status responses" are confusingly _not_ the same as the
|
203
|
+
# +STATUS+ UntaggedResponse (see IMAP#status and StatusData).
|
188
204
|
#
|
189
205
|
# Some response codes come with additional data which will be parsed by
|
190
206
|
# Net::IMAP. Others return +nil+ for #data, but are used as a
|
191
207
|
# machine-readable annotation for the human-readable ResponseText#text in
|
192
|
-
# the same response.
|
193
|
-
# code text, #data returns the unparsed string.
|
208
|
+
# the same response.
|
194
209
|
#
|
195
210
|
# Untagged response code #data is pushed directly onto Net::IMAP#responses,
|
196
211
|
# keyed by #name, unless it is removed by the command that generated it.
|
197
212
|
# Use Net::IMAP#add_response_handler to view tagged response codes for
|
198
213
|
# command methods that do not return their TaggedResponse.
|
199
214
|
#
|
215
|
+
# == Standard response codes
|
216
|
+
#
|
200
217
|
# \IMAP extensions may define new codes and the data that comes with them.
|
201
218
|
# The IANA {IMAP Response
|
202
219
|
# Codes}[https://www.iana.org/assignments/imap-response-codes/imap-response-codes.xhtml]
|
203
220
|
# 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
221
|
#
|
209
|
-
#
|
222
|
+
# === +IMAP4rev1+ response codes
|
210
223
|
# See [IMAP4rev1[https://www.rfc-editor.org/rfc/rfc3501]] {§7.1, "Server
|
211
224
|
# Responses - Status
|
212
225
|
# Responses"}[https://www.rfc-editor.org/rfc/rfc3501#section-7.1] for full
|
@@ -237,24 +250,24 @@ module Net
|
|
237
250
|
# the <tt>\Seen</tt> flag set.
|
238
251
|
# <em>DEPRECATED by IMAP4rev2.</em>
|
239
252
|
#
|
240
|
-
#
|
253
|
+
# === +BINARY+ extension
|
241
254
|
# See {[RFC3516]}[https://www.rfc-editor.org/rfc/rfc3516].
|
242
255
|
# * +UNKNOWN-CTE+, with a tagged +NO+ response, when the server does not
|
243
256
|
# known how to decode a CTE (content-transfer-encoding). #data is +nil+.
|
244
257
|
# See IMAP#fetch.
|
245
258
|
#
|
246
|
-
#
|
259
|
+
# === +UIDPLUS+ extension
|
247
260
|
# See {[RFC4315 §3]}[https://www.rfc-editor.org/rfc/rfc4315#section-3].
|
248
261
|
# * +APPENDUID+, #data is UIDPlusData. See IMAP#append.
|
249
262
|
# * +COPYUID+, #data is UIDPlusData. See IMAP#copy.
|
250
263
|
# * +UIDNOTSTICKY+, #data is +nil+. See IMAP#select.
|
251
264
|
#
|
252
|
-
#
|
265
|
+
# === +SEARCHRES+ extension
|
253
266
|
# See {[RFC5182]}[https://www.rfc-editor.org/rfc/rfc5182].
|
254
267
|
# * +NOTSAVED+, with a tagged +NO+ response, when the search result variable
|
255
268
|
# is not saved. #data is +nil+.
|
256
269
|
#
|
257
|
-
#
|
270
|
+
# === +RFC5530+ response codes
|
258
271
|
# See {[RFC5530]}[https://www.rfc-editor.org/rfc/rfc5530], "IMAP Response
|
259
272
|
# Codes" for the definition of the following response codes, which are all
|
260
273
|
# machine-readable annotations for the human-readable ResponseText#text, and
|
@@ -277,22 +290,22 @@ module Net
|
|
277
290
|
# * +ALREADYEXISTS+
|
278
291
|
# * +NONEXISTENT+
|
279
292
|
#
|
280
|
-
#
|
293
|
+
# === +QRESYNC+ extension
|
281
294
|
# See {[RFC7162]}[https://www.rfc-editor.org/rfc/rfc7162.html].
|
282
295
|
# * +CLOSED+, returned when the currently selected mailbox is closed
|
283
296
|
# implicitly by selecting or examining another mailbox. #data is +nil+.
|
284
297
|
#
|
285
|
-
#
|
298
|
+
# === +IMAP4rev2+ response codes
|
286
299
|
# See {[RFC9051]}[https://www.rfc-editor.org/rfc/rfc9051] {§7.1, "Server
|
287
300
|
# Responses - Status
|
288
301
|
# Responses"}[https://www.rfc-editor.org/rfc/rfc9051#section-7.1] for full
|
289
302
|
# descriptions of IMAP4rev2 response codes. IMAP4rev2 includes all of the
|
290
|
-
# response codes listed above (except "UNSEEN") and adds the following:
|
303
|
+
# response codes listed above (except "+UNSEEN+") and adds the following:
|
291
304
|
# * +HASCHILDREN+, with a tagged +NO+ response, when a mailbox delete failed
|
292
305
|
# because the server doesn't allow deletion of mailboxes with children.
|
293
306
|
# #data is +nil+.
|
294
307
|
#
|
295
|
-
#
|
308
|
+
# === +CONDSTORE+ extension
|
296
309
|
# See {[RFC7162]}[https://www.rfc-editor.org/rfc/rfc7162.html].
|
297
310
|
# * +NOMODSEQ+, when selecting a mailbox that does not support
|
298
311
|
# mod-sequences. #data is +nil+. See IMAP#select.
|
@@ -302,10 +315,17 @@ module Net
|
|
302
315
|
# since the +UNCHANGEDSINCE+ mod-sequence given to +STORE+ or <tt>UID
|
303
316
|
# STORE</tt>.
|
304
317
|
#
|
305
|
-
#
|
318
|
+
# === +OBJECTID+ extension
|
306
319
|
# See {[RFC8474]}[https://www.rfc-editor.org/rfc/rfc8474.html].
|
307
320
|
# * +MAILBOXID+, #data is a string
|
308
321
|
#
|
322
|
+
# == Extension compatibility
|
323
|
+
#
|
324
|
+
# Response codes are backwards compatible: Servers are allowed to send new
|
325
|
+
# response codes even if the client has not enabled the extension that
|
326
|
+
# defines them. When Net::IMAP does not know how to parse response
|
327
|
+
# code text, #data returns the unparsed string.
|
328
|
+
#
|
309
329
|
class ResponseCode < Struct.new(:name, :data)
|
310
330
|
##
|
311
331
|
# method: name
|
@@ -324,14 +344,9 @@ module Net
|
|
324
344
|
# code data can take.
|
325
345
|
end
|
326
346
|
|
327
|
-
#
|
328
|
-
#
|
329
|
-
#
|
330
|
-
# See [[UIDPLUS[https://www.rfc-editor.org/rfc/rfc4315.html]].
|
331
|
-
#
|
332
|
-
# ==== Capability requirement
|
347
|
+
# UIDPlusData represents the ResponseCode#data that accompanies the
|
348
|
+
# +APPENDUID+ and +COPYUID+ {response codes}[rdoc-ref:ResponseCode].
|
333
349
|
#
|
334
|
-
# The +UIDPLUS+ capability[rdoc-ref:Net::IMAP#capability] must be supported.
|
335
350
|
# A server that supports +UIDPLUS+ should send a UIDPlusData object inside
|
336
351
|
# every TaggedResponse returned by the append[rdoc-ref:Net::IMAP#append],
|
337
352
|
# copy[rdoc-ref:Net::IMAP#copy], move[rdoc-ref:Net::IMAP#move], {uid
|
@@ -339,9 +354,9 @@ module Net
|
|
339
354
|
# move}[rdoc-ref:Net::IMAP#uid_move] commands---unless the destination
|
340
355
|
# mailbox reports +UIDNOTSTICKY+.
|
341
356
|
#
|
342
|
-
|
343
|
-
#
|
344
|
-
|
357
|
+
# == Required capability
|
358
|
+
# Requires either +UIDPLUS+ [RFC4315[https://www.rfc-editor.org/rfc/rfc4315]]
|
359
|
+
# or +IMAP4rev2+ capability.
|
345
360
|
#
|
346
361
|
class UIDPlusData < Struct.new(:uidvalidity, :source_uids, :assigned_uids)
|
347
362
|
##
|
@@ -378,10 +393,8 @@ module Net
|
|
378
393
|
end
|
379
394
|
end
|
380
395
|
|
381
|
-
#
|
382
|
-
#
|
383
|
-
#
|
384
|
-
# Net::IMAP#list returns an array of MailboxList objects.
|
396
|
+
# MailboxList represents the data of an untagged +LIST+ response, for a
|
397
|
+
# _single_ mailbox path. IMAP#list returns an array of MailboxList objects.
|
385
398
|
#
|
386
399
|
class MailboxList < Struct.new(:attr, :delim, :name)
|
387
400
|
##
|
@@ -391,11 +404,11 @@ module Net
|
|
391
404
|
# Returns the name attributes. Each name attribute is a symbol capitalized
|
392
405
|
# by String#capitalize, such as :Noselect (not :NoSelect). For the
|
393
406
|
# semantics of each attribute, see:
|
394
|
-
# *
|
395
|
-
# *
|
396
|
-
# * Net::IMAP@SPECIAL-USE
|
407
|
+
# * Net::IMAP@Basic+Mailbox+Attributes
|
408
|
+
# * Net::IMAP@Mailbox+role+Attributes
|
397
409
|
# * The IANA {IMAP Mailbox Name Attributes
|
398
410
|
# registry}[https://www.iana.org/assignments/imap-mailbox-name-attributes/imap-mailbox-name-attributes.xhtml]
|
411
|
+
# has links to specifications for all standard mailbox attributes.
|
399
412
|
|
400
413
|
##
|
401
414
|
# method: delim
|
@@ -410,16 +423,16 @@ module Net
|
|
410
423
|
# Returns the mailbox name.
|
411
424
|
end
|
412
425
|
|
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).
|
426
|
+
# MailboxQuota represents the data of an untagged +QUOTA+ response.
|
417
427
|
#
|
418
|
-
#
|
428
|
+
# IMAP#getquota returns an array of MailboxQuota objects.
|
419
429
|
#
|
420
430
|
# Net::IMAP#getquotaroot returns an array containing both MailboxQuotaRoot
|
421
431
|
# and MailboxQuota objects.
|
422
432
|
#
|
433
|
+
# == Required capability
|
434
|
+
# Requires +QUOTA+ [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]]
|
435
|
+
# capability.
|
423
436
|
class MailboxQuota < Struct.new(:mailbox, :usage, :quota)
|
424
437
|
##
|
425
438
|
# method: mailbox
|
@@ -441,12 +454,14 @@ module Net
|
|
441
454
|
#
|
442
455
|
end
|
443
456
|
|
444
|
-
#
|
445
|
-
# response. (GETQUOTAROOT can also return Net::IMAP::MailboxQuota.)
|
457
|
+
# MailboxQuotaRoot represents the data of an untagged +QUOTAROOT+ response.
|
446
458
|
#
|
447
|
-
#
|
448
|
-
#
|
459
|
+
# IMAP#getquotaroot returns an array containing both MailboxQuotaRoot and
|
460
|
+
# MailboxQuota objects.
|
449
461
|
#
|
462
|
+
# == Required capability
|
463
|
+
# Requires +QUOTA+ [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]]
|
464
|
+
# capability.
|
450
465
|
class MailboxQuotaRoot < Struct.new(:mailbox, :quotaroots)
|
451
466
|
##
|
452
467
|
# method: mailbox
|
@@ -461,12 +476,13 @@ module Net
|
|
461
476
|
# Zero or more quotaroots that affect the quota on the specified mailbox.
|
462
477
|
end
|
463
478
|
|
464
|
-
#
|
479
|
+
# MailboxACLItem represents the data of an untagged +ACL+ response.
|
465
480
|
#
|
466
|
-
#
|
481
|
+
# IMAP#getacl returns an array of MailboxACLItem objects.
|
467
482
|
#
|
468
|
-
#
|
469
|
-
# +ACL+
|
483
|
+
# == Required capability
|
484
|
+
# Requires +ACL+ [RFC4314[https://www.rfc-editor.org/rfc/rfc4314]]
|
485
|
+
# capability.
|
470
486
|
class MailboxACLItem < Struct.new(:user, :rights, :mailbox)
|
471
487
|
##
|
472
488
|
# method: mailbox
|
@@ -488,11 +504,12 @@ module Net
|
|
488
504
|
# The access rights the indicated #user has to the #mailbox.
|
489
505
|
end
|
490
506
|
|
491
|
-
#
|
492
|
-
#
|
493
|
-
#
|
494
|
-
# Returned by Net::IMAP#namespace, contained inside a Namespaces object.
|
507
|
+
# Namespace represents a _single_ namespace, contained inside a Namespaces
|
508
|
+
# object.
|
495
509
|
#
|
510
|
+
# == Required capability
|
511
|
+
# Requires either +NAMESPACE+ [RFC2342[https://www.rfc-editor.org/rfc/rfc2342]]
|
512
|
+
# or +IMAP4rev2+ capability.
|
496
513
|
class Namespace < Struct.new(:prefix, :delim, :extensions)
|
497
514
|
##
|
498
515
|
# method: prefix
|
@@ -514,11 +531,14 @@ module Net
|
|
514
531
|
# Extension parameter semantics would be defined by the extension.
|
515
532
|
end
|
516
533
|
|
517
|
-
#
|
518
|
-
#
|
534
|
+
# Namespaces represents the data of an untagged +NAMESPACE+ response,
|
535
|
+
# returned by IMAP#namespace.
|
519
536
|
#
|
520
|
-
#
|
537
|
+
# Contains lists of #personal, #shared, and #other namespaces.
|
521
538
|
#
|
539
|
+
# == Required capability
|
540
|
+
# Requires either +NAMESPACE+ [RFC2342[https://www.rfc-editor.org/rfc/rfc2342]]
|
541
|
+
# or +IMAP4rev2+ capability.
|
522
542
|
class Namespaces < Struct.new(:personal, :other, :shared)
|
523
543
|
##
|
524
544
|
# method: personal
|
@@ -539,9 +559,9 @@ module Net
|
|
539
559
|
# Returns an array of Shared Namespace objects.
|
540
560
|
end
|
541
561
|
|
542
|
-
#
|
562
|
+
# StatusData represents the contents of an untagged +STATUS+ response.
|
543
563
|
#
|
544
|
-
#
|
564
|
+
# IMAP#status returns the contents of #attr.
|
545
565
|
class StatusData < Struct.new(:mailbox, :attr)
|
546
566
|
##
|
547
567
|
# method: mailbox
|
@@ -562,11 +582,11 @@ module Net
|
|
562
582
|
# [Note]
|
563
583
|
# When the #sender and #reply_to fields are absent or empty, they will
|
564
584
|
# return the same value as #from. Also, fields may return values that are
|
565
|
-
# invalid for well-formed [RFC5322[https://
|
585
|
+
# invalid for well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
566
586
|
# messages when the message is malformed or a draft message.
|
567
587
|
#
|
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
|
588
|
+
# See [{IMAP4rev1 §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501#section-7.4.2]]
|
589
|
+
# and [{IMAP4rev2 §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051#section-7.5.2]]
|
570
590
|
# for full description of the envelope fields, and
|
571
591
|
# Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
|
572
592
|
#
|
@@ -580,7 +600,7 @@ module Net
|
|
580
600
|
# Returns a string that represents the +Date+ header.
|
581
601
|
#
|
582
602
|
# [Note]
|
583
|
-
# For a well-formed [RFC5322[https://
|
603
|
+
# For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
584
604
|
# message, the #date field must not be +nil+. However it can be +nil+
|
585
605
|
# for a malformed or draft message.
|
586
606
|
|
@@ -606,7 +626,7 @@ module Net
|
|
606
626
|
# returns +nil+ for this envelope field.
|
607
627
|
#
|
608
628
|
# [Note]
|
609
|
-
# For a well-formed [RFC5322[https://
|
629
|
+
# For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
610
630
|
# message, the #from field must not be +nil+. However it can be +nil+
|
611
631
|
# for a malformed or draft message.
|
612
632
|
|
@@ -619,7 +639,7 @@ module Net
|
|
619
639
|
# [Note]
|
620
640
|
# If the <tt>Sender</tt> header is absent, or is present but empty, the
|
621
641
|
# server sets this field to be the same value as #from. Therefore, in a
|
622
|
-
# well-formed [RFC5322[https://
|
642
|
+
# well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] message,
|
623
643
|
# the #sender envelope field must not be +nil+. However it can be
|
624
644
|
# +nil+ for a malformed or draft message.
|
625
645
|
|
@@ -633,7 +653,7 @@ module Net
|
|
633
653
|
# [Note]
|
634
654
|
# If the <tt>Reply-To</tt> header is absent, or is present but empty,
|
635
655
|
# the server sets this field to be the same value as #from. Therefore,
|
636
|
-
# in a well-formed [RFC5322[https://
|
656
|
+
# in a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
637
657
|
# message, the #reply_to envelope field must not be +nil+. However it
|
638
658
|
# can be +nil+ for a malformed or draft message.
|
639
659
|
|
@@ -662,7 +682,7 @@ module Net
|
|
662
682
|
# Returns a string that represents the <tt>In-Reply-To</tt> header.
|
663
683
|
#
|
664
684
|
# [Note]
|
665
|
-
# For a well-formed [RFC5322[https://
|
685
|
+
# For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
666
686
|
# message, the #in_reply_to field, if present, must not be empty. But
|
667
687
|
# it can still return an empty string for malformed messages.
|
668
688
|
#
|
@@ -678,7 +698,7 @@ module Net
|
|
678
698
|
# Returns a string that represents the <tt>Message-ID</tt>.
|
679
699
|
#
|
680
700
|
# [Note]
|
681
|
-
# For a well-formed [RFC5322[https://
|
701
|
+
# For a well-formed [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]
|
682
702
|
# message, the #message_id field, if present, must not be empty. But it
|
683
703
|
# can still return an empty string for malformed messages.
|
684
704
|
#
|
@@ -692,10 +712,10 @@ module Net
|
|
692
712
|
# parsed into its component parts by the server. Address objects are
|
693
713
|
# returned within Envelope fields.
|
694
714
|
#
|
695
|
-
#
|
715
|
+
# == Group syntax
|
696
716
|
#
|
697
717
|
# When the #host field is +nil+, this is a special form of address structure
|
698
|
-
# that indicates the [RFC5322[https://
|
718
|
+
# that indicates the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] group
|
699
719
|
# syntax. If the #mailbox name field is also +nil+, this is an end-of-group
|
700
720
|
# marker (semicolon in RFC-822 syntax). If the #mailbox name field is
|
701
721
|
# non-+NIL+, this is the start of a group marker, and the mailbox #name
|
@@ -705,7 +725,7 @@ module Net
|
|
705
725
|
# method: name
|
706
726
|
# :call-seq: name -> string or nil
|
707
727
|
#
|
708
|
-
# Returns the [RFC5322[https://
|
728
|
+
# Returns the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] address
|
709
729
|
# +display-name+ (or the mailbox +phrase+ in the RFC-822 grammar).
|
710
730
|
|
711
731
|
##
|
@@ -715,28 +735,28 @@ module Net
|
|
715
735
|
# Returns the route from RFC-822 route-addr.
|
716
736
|
#
|
717
737
|
# Note:: Generating this obsolete route addressing syntax is not allowed
|
718
|
-
# by [RFC5322[https://
|
738
|
+
# by [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]. However,
|
719
739
|
# addresses with this syntax must still be accepted and parsed.
|
720
740
|
|
721
741
|
##
|
722
742
|
# method: mailbox
|
723
743
|
# :call-seq: mailbox -> string or nil
|
724
744
|
#
|
725
|
-
# Returns the [RFC5322[https://
|
745
|
+
# Returns the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] address
|
726
746
|
# +local-part+, if #host is not +nil+.
|
727
747
|
#
|
728
748
|
# When #host is +nil+, this returns
|
729
|
-
# an [RFC5322[https://
|
749
|
+
# an [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] group name and a +nil+
|
730
750
|
# mailbox indicates the end of a group.
|
731
751
|
|
732
752
|
##
|
733
753
|
# method: host
|
734
754
|
# :call-seq: host -> string or nil
|
735
755
|
#
|
736
|
-
# Returns the [RFC5322[https://
|
756
|
+
# Returns the [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] addr-spec
|
737
757
|
# +domain+ name.
|
738
758
|
#
|
739
|
-
# +nil+ indicates [RFC5322[https://
|
759
|
+
# +nil+ indicates [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]] group
|
740
760
|
# syntax.
|
741
761
|
end
|
742
762
|
|
@@ -748,14 +768,14 @@ module Net
|
|
748
768
|
# :call-seq: dsp_type -> string
|
749
769
|
#
|
750
770
|
# Returns the content disposition type, as defined by
|
751
|
-
# [DISPOSITION[https://
|
771
|
+
# [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]].
|
752
772
|
|
753
773
|
##
|
754
774
|
# method: param
|
755
775
|
# :call-seq: param -> hash
|
756
776
|
#
|
757
777
|
# Returns a hash representing parameters of the Content-Disposition
|
758
|
-
# field, as defined by [DISPOSITION[https://
|
778
|
+
# field, as defined by [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]].
|
759
779
|
end
|
760
780
|
|
761
781
|
# Net::IMAP::ThreadMember represents a thread-node returned
|
@@ -794,12 +814,12 @@ module Net
|
|
794
814
|
# FetchData#attr value. Although these classes don't share a base class,
|
795
815
|
# this module can be used to pattern match all of them.
|
796
816
|
#
|
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
|
817
|
+
# See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501#section-7.4.2]
|
818
|
+
# and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051#section-7.5.2-4.9]
|
799
819
|
# for full description of all +BODYSTRUCTURE+ fields, and also
|
800
820
|
# Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
|
801
821
|
#
|
802
|
-
#
|
822
|
+
# == Classes that include BodyStructure
|
803
823
|
# BodyTypeBasic:: Represents any message parts that are not handled by
|
804
824
|
# BodyTypeText, BodyTypeMessage, or BodyTypeMultipart.
|
805
825
|
# BodyTypeText:: Used by <tt>text/*</tt> parts. Contains all of the
|
@@ -817,8 +837,8 @@ module Net
|
|
817
837
|
# message parts, unless they have a <tt>Content-Type</tt> that is handled by
|
818
838
|
# BodyTypeText, BodyTypeMessage, or BodyTypeMultipart.
|
819
839
|
#
|
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
|
840
|
+
# See {[IMAP4rev1] §7.4.2}[https://www.rfc-editor.org/rfc/rfc3501#section-7.4.2]
|
841
|
+
# and {[IMAP4rev2] §7.5.2}[https://www.rfc-editor.org/rfc/rfc9051#section-7.5.2-4.9]
|
822
842
|
# for full description of all +BODYSTRUCTURE+ fields, and also
|
823
843
|
# Net::IMAP@Message+envelope+and+body+structure for other relevant RFCs.
|
824
844
|
#
|
@@ -835,45 +855,45 @@ module Net
|
|
835
855
|
# :call-seq: media_type -> string
|
836
856
|
#
|
837
857
|
# The top-level media type as defined in
|
838
|
-
# [MIME-IMB[https://
|
858
|
+
# [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
|
839
859
|
|
840
860
|
##
|
841
861
|
# method: subtype
|
842
862
|
# :call-seq: subtype -> string
|
843
863
|
#
|
844
864
|
# The media subtype name as defined in
|
845
|
-
# [MIME-IMB[https://
|
865
|
+
# [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
|
846
866
|
|
847
867
|
##
|
848
868
|
# method: param
|
849
869
|
# :call-seq: param -> string
|
850
870
|
#
|
851
871
|
# Returns a hash that represents parameters as defined in
|
852
|
-
# [MIME-IMB[https://
|
872
|
+
# [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
|
853
873
|
|
854
874
|
##
|
855
875
|
# method: content_id
|
856
876
|
# :call-seq: content_id -> string
|
857
877
|
#
|
858
878
|
# Returns a string giving the content id as defined
|
859
|
-
# in [MIME-IMB[https://
|
860
|
-
# {§7}[https://
|
879
|
+
# in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]
|
880
|
+
# {§7}[https://www.rfc-editor.org/rfc/rfc2045#section-7].
|
861
881
|
|
862
882
|
##
|
863
883
|
# method: description
|
864
884
|
# :call-seq: description -> string
|
865
885
|
#
|
866
886
|
# Returns a string giving the content description as defined
|
867
|
-
# in [MIME-IMB[https://
|
868
|
-
# {§8}[https://
|
887
|
+
# in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]
|
888
|
+
# {§8}[https://www.rfc-editor.org/rfc/rfc2045#section-8].
|
869
889
|
|
870
890
|
##
|
871
891
|
# method: encoding
|
872
892
|
# :call-seq: encoding -> string
|
873
893
|
#
|
874
894
|
# Returns a string giving the content transfer encoding as defined
|
875
|
-
# in [MIME-IMB[https://
|
876
|
-
# {§6}[https://
|
895
|
+
# in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]
|
896
|
+
# {§6}[https://www.rfc-editor.org/rfc/rfc2045#section-6].
|
877
897
|
|
878
898
|
##
|
879
899
|
# method: size
|
@@ -886,7 +906,7 @@ module Net
|
|
886
906
|
# :call-seq: md5 -> string
|
887
907
|
#
|
888
908
|
# Returns a string giving the body MD5 value as defined in
|
889
|
-
# [MD5[https://
|
909
|
+
# [MD5[https://www.rfc-editor.org/rfc/rfc1864]].
|
890
910
|
|
891
911
|
##
|
892
912
|
# method: disposition
|
@@ -894,7 +914,7 @@ module Net
|
|
894
914
|
#
|
895
915
|
# Returns a ContentDisposition object giving the content
|
896
916
|
# disposition, as defined by
|
897
|
-
# [DISPOSITION[https://
|
917
|
+
# [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]].
|
898
918
|
|
899
919
|
##
|
900
920
|
# method: language
|
@@ -939,7 +959,8 @@ module Net
|
|
939
959
|
# for something else?
|
940
960
|
#++
|
941
961
|
def media_subtype
|
942
|
-
warn("media_subtype is obsolete, use subtype instead.\n",
|
962
|
+
warn("media_subtype is obsolete, use subtype instead.\n",
|
963
|
+
uplevel: 1, category: :deprecated)
|
943
964
|
return subtype
|
944
965
|
end
|
945
966
|
end
|
@@ -984,7 +1005,8 @@ module Net
|
|
984
1005
|
# generate a warning message to +stderr+, then return
|
985
1006
|
# the value of +subtype+.
|
986
1007
|
def media_subtype
|
987
|
-
warn("media_subtype is obsolete, use subtype instead.\n",
|
1008
|
+
warn("media_subtype is obsolete, use subtype instead.\n",
|
1009
|
+
uplevel: 1, category: :deprecated)
|
988
1010
|
return subtype
|
989
1011
|
end
|
990
1012
|
end
|
@@ -1040,77 +1062,6 @@ module Net
|
|
1040
1062
|
end
|
1041
1063
|
end
|
1042
1064
|
|
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
1065
|
# Net::IMAP::BodyTypeMultipart represents body structures of messages and
|
1115
1066
|
# message parts, when <tt>Content-Type</tt> is <tt>multipart/*</tt>.
|
1116
1067
|
class BodyTypeMultipart < Struct.new(:media_type, :subtype,
|
@@ -1131,7 +1082,7 @@ module Net
|
|
1131
1082
|
# call-seq: subtype -> string
|
1132
1083
|
#
|
1133
1084
|
# Returns the content subtype name
|
1134
|
-
# as defined in [MIME-IMB[https://
|
1085
|
+
# as defined in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
|
1135
1086
|
|
1136
1087
|
##
|
1137
1088
|
# method: parts
|
@@ -1145,7 +1096,7 @@ module Net
|
|
1145
1096
|
# call-seq: param -> hash
|
1146
1097
|
#
|
1147
1098
|
# Returns a hash that represents parameters
|
1148
|
-
# as defined in [MIME-IMB[https://
|
1099
|
+
# as defined in [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]].
|
1149
1100
|
|
1150
1101
|
##
|
1151
1102
|
# method: disposition
|
@@ -1182,29 +1133,11 @@ module Net
|
|
1182
1133
|
# generate a warning message to +stderr+, then return
|
1183
1134
|
# the value of +subtype+.
|
1184
1135
|
def media_subtype
|
1185
|
-
warn("media_subtype is obsolete, use subtype instead.\n",
|
1136
|
+
warn("media_subtype is obsolete, use subtype instead.\n",
|
1137
|
+
uplevel: 1, category: :deprecated)
|
1186
1138
|
return subtype
|
1187
1139
|
end
|
1188
1140
|
end
|
1189
1141
|
|
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
1142
|
end
|
1210
1143
|
end
|