net-imap 0.5.2 → 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.

data/lib/net/imap.rb CHANGED
@@ -25,8 +25,8 @@ module Net
25
25
 
26
26
  # Net::IMAP implements Internet Message Access Protocol (\IMAP) client
27
27
  # functionality. The protocol is described
28
- # in {IMAP4rev1 [RFC3501]}[https://tools.ietf.org/html/rfc3501]
29
- # and {IMAP4rev2 [RFC9051]}[https://tools.ietf.org/html/rfc9051].
28
+ # in {IMAP4rev1 [RFC3501]}[https://www.rfc-editor.org/rfc/rfc3501]
29
+ # and {IMAP4rev2 [RFC9051]}[https://www.rfc-editor.org/rfc/rfc9051].
30
30
  #
31
31
  # == \IMAP Overview
32
32
  #
@@ -299,15 +299,15 @@ module Net
299
299
  # === Core \IMAP commands
300
300
  #
301
301
  # The following commands are defined either by
302
- # the [IMAP4rev1[https://tools.ietf.org/html/rfc3501]] base specification, or
302
+ # the [IMAP4rev1[https://www.rfc-editor.org/rfc/rfc3501]] base specification, or
303
303
  # by one of the following extensions:
304
- # [IDLE[https://tools.ietf.org/html/rfc2177]],
305
- # [NAMESPACE[https://tools.ietf.org/html/rfc2342]],
306
- # [UNSELECT[https://tools.ietf.org/html/rfc3691]],
307
- # [ENABLE[https://tools.ietf.org/html/rfc5161]],
308
- # [MOVE[https://tools.ietf.org/html/rfc6851]].
304
+ # [IDLE[https://www.rfc-editor.org/rfc/rfc2177]],
305
+ # [NAMESPACE[https://www.rfc-editor.org/rfc/rfc2342]],
306
+ # [UNSELECT[https://www.rfc-editor.org/rfc/rfc3691]],
307
+ # [ENABLE[https://www.rfc-editor.org/rfc/rfc5161]],
308
+ # [MOVE[https://www.rfc-editor.org/rfc/rfc6851]].
309
309
  # These extensions are widely supported by modern IMAP4rev1 servers and have
310
- # all been integrated into [IMAP4rev2[https://tools.ietf.org/html/rfc9051]].
310
+ # all been integrated into [IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051]].
311
311
  # <em>*NOTE:* Net::IMAP doesn't support IMAP4rev2 yet.</em>
312
312
  #
313
313
  # ==== Any state
@@ -404,7 +404,7 @@ module Net
404
404
  #
405
405
  # ==== RFC9051: +IMAP4rev2+
406
406
  #
407
- # Although IMAP4rev2[https://tools.ietf.org/html/rfc9051] is not supported
407
+ # Although IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051] is not supported
408
408
  # yet, Net::IMAP supports several extensions that have been folded into it:
409
409
  # +ENABLE+, +IDLE+, +MOVE+, +NAMESPACE+, +SASL-IR+, +UIDPLUS+, +UNSELECT+,
410
410
  # <tt>STATUS=SIZE</tt>, and the fetch side of +BINARY+.
@@ -424,13 +424,13 @@ module Net
424
424
  # - #setquota: sets the resource limits for a given quota root.
425
425
  #
426
426
  # ==== RFC2177: +IDLE+
427
- # Folded into IMAP4rev2[https://tools.ietf.org/html/rfc9051] and also included
427
+ # Folded into IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051] and also included
428
428
  # above with {Core IMAP commands}[rdoc-ref:Net::IMAP@Core+IMAP+commands].
429
429
  # - #idle: Allows the server to send updates to the client, without the client
430
430
  # needing to poll using #noop.
431
431
  #
432
432
  # ==== RFC2342: +NAMESPACE+
433
- # Folded into IMAP4rev2[https://tools.ietf.org/html/rfc9051] and also included
433
+ # Folded into IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051] and also included
434
434
  # above with {Core IMAP commands}[rdoc-ref:Net::IMAP@Core+IMAP+commands].
435
435
  # - #namespace: Returns mailbox namespaces, with path prefixes and delimiters.
436
436
  #
@@ -439,7 +439,7 @@ module Net
439
439
  #
440
440
  # ==== RFC3516: +BINARY+
441
441
  # The fetch side of +BINARY+ has been folded into
442
- # IMAP4rev2[https://tools.ietf.org/html/rfc9051].
442
+ # IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051].
443
443
  # - Updates #fetch and #uid_fetch with the +BINARY+, +BINARY.PEEK+, and
444
444
  # +BINARY.SIZE+ items. See FetchData#binary and FetchData#binary_size.
445
445
  #
@@ -447,7 +447,7 @@ module Net
447
447
  # *NOTE:* The binary extension the #append command is _not_ supported yet.
448
448
  #
449
449
  # ==== RFC3691: +UNSELECT+
450
- # Folded into IMAP4rev2[https://tools.ietf.org/html/rfc9051] and also included
450
+ # Folded into IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051] and also included
451
451
  # above with {Core IMAP commands}[rdoc-ref:Net::IMAP@Core+IMAP+commands].
452
452
  # - #unselect: Closes the mailbox and returns to the "_authenticated_" state,
453
453
  # without expunging any messages.
@@ -459,7 +459,7 @@ module Net
459
459
  # *NOTE:* +DELETEACL+, +LISTRIGHTS+, and +MYRIGHTS+ are not supported yet.
460
460
  #
461
461
  # ==== RFC4315: +UIDPLUS+
462
- # Folded into IMAP4rev2[https://tools.ietf.org/html/rfc9051] and also included
462
+ # Folded into IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051] and also included
463
463
  # above with {Core IMAP commands}[rdoc-ref:Net::IMAP@Core+IMAP+commands].
464
464
  # - #uid_expunge: Restricts #expunge to only remove the specified UIDs.
465
465
  # - Updates #select, #examine with the +UIDNOTSTICKY+ ResponseCode
@@ -467,15 +467,15 @@ module Net
467
467
  # - Updates #copy, #move with the +COPYUID+ ResponseCode
468
468
  #
469
469
  # ==== RFC4731: +ESEARCH+
470
- # Folded into IMAP4rev2[https://tools.ietf.org/html/rfc9051].
470
+ # Folded into IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051].
471
471
  # - Updates #search, #uid_search with +return+ options and ESearchResult.
472
472
  #
473
473
  # ==== RFC4959: +SASL-IR+
474
- # Folded into IMAP4rev2[https://tools.ietf.org/html/rfc9051].
474
+ # Folded into IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051].
475
475
  # - Updates #authenticate with the option to send an initial response.
476
476
  #
477
477
  # ==== RFC5161: +ENABLE+
478
- # Folded into IMAP4rev2[https://tools.ietf.org/html/rfc9051] and also included
478
+ # Folded into IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051] and also included
479
479
  # above with {Core IMAP commands}[rdoc-ref:Net::IMAP@Core+IMAP+commands].
480
480
  # - #enable: Enables backwards incompatible server extensions.
481
481
  #
@@ -499,7 +499,7 @@ module Net
499
499
  # +X-GM-THRID+, but Gmail does not support it (as of 2023-11-10).
500
500
  #
501
501
  # ==== RFC6851: +MOVE+
502
- # Folded into IMAP4rev2[https://tools.ietf.org/html/rfc9051] and also included
502
+ # Folded into IMAP4rev2[https://www.rfc-editor.org/rfc/rfc9051] and also included
503
503
  # above with {Core IMAP commands}[rdoc-ref:Net::IMAP@Core+IMAP+commands].
504
504
  # - #move, #uid_move: Moves the specified messages to the end of the
505
505
  # specified destination mailbox, expunging them from the current mailbox.
@@ -534,6 +534,17 @@ module Net
534
534
  # See FetchData#emailid and FetchData#emailid.
535
535
  # - Updates #status with support for the +MAILBOXID+ status attribute.
536
536
  #
537
+ # ==== RFC9394: +PARTIAL+
538
+ # - Updates #search, #uid_search with the +PARTIAL+ return option which adds
539
+ # ESearchResult#partial return data.
540
+ # - Updates #uid_fetch with the +partial+ modifier.
541
+ #
542
+ # ==== RFC9586: +UIDONLY+
543
+ # - Updates #enable with +UIDONLY+ parameter.
544
+ # - Updates #uid_fetch and #uid_store to return +UIDFETCH+ response.
545
+ # - Updates #expunge and #uid_expunge to return +VANISHED+ response.
546
+ # - Prohibits use of message sequence numbers in responses or requests.
547
+ #
537
548
  # == References
538
549
  #
539
550
  # [{IMAP4rev1}[https://www.rfc-editor.org/rfc/rfc3501.html]]::
@@ -564,57 +575,57 @@ module Net
564
575
  # Gahrns, M., "IMAP4 Multi-Accessed Mailbox Practice", RFC 2180, DOI
565
576
  # 10.17487/RFC2180, July 1997, <https://www.rfc-editor.org/info/rfc2180>.
566
577
  #
567
- # [UTF7[https://tools.ietf.org/html/rfc2152]]::
578
+ # [UTF7[https://www.rfc-editor.org/rfc/rfc2152]]::
568
579
  # Goldsmith, D. and M. Davis, "UTF-7 A Mail-Safe Transformation Format of
569
580
  # Unicode", RFC 2152, DOI 10.17487/RFC2152, May 1997,
570
581
  # <https://www.rfc-editor.org/info/rfc2152>.
571
582
  #
572
583
  # === Message envelope and body structure
573
584
  #
574
- # [RFC5322[https://tools.ietf.org/html/rfc5322]]::
585
+ # [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]::
575
586
  # Resnick, P., Ed., "Internet Message Format",
576
587
  # RFC 5322, DOI 10.17487/RFC5322, October 2008,
577
588
  # <https://www.rfc-editor.org/info/rfc5322>.
578
589
  #
579
590
  # <em>Note: obsoletes</em>
580
- # RFC-2822[https://tools.ietf.org/html/rfc2822]<em> (April 2001) and</em>
581
- # RFC-822[https://tools.ietf.org/html/rfc822]<em> (August 1982).</em>
591
+ # RFC-2822[https://www.rfc-editor.org/rfc/rfc2822]<em> (April 2001) and</em>
592
+ # RFC-822[https://www.rfc-editor.org/rfc/rfc822]<em> (August 1982).</em>
582
593
  #
583
- # [CHARSET[https://tools.ietf.org/html/rfc2978]]::
594
+ # [CHARSET[https://www.rfc-editor.org/rfc/rfc2978]]::
584
595
  # Freed, N. and J. Postel, "IANA Charset Registration Procedures", BCP 19,
585
596
  # RFC 2978, DOI 10.17487/RFC2978, October 2000,
586
597
  # <https://www.rfc-editor.org/info/rfc2978>.
587
598
  #
588
- # [DISPOSITION[https://tools.ietf.org/html/rfc2183]]::
599
+ # [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]]::
589
600
  # Troost, R., Dorner, S., and K. Moore, Ed., "Communicating Presentation
590
601
  # Information in Internet Messages: The Content-Disposition Header
591
602
  # Field", RFC 2183, DOI 10.17487/RFC2183, August 1997,
592
603
  # <https://www.rfc-editor.org/info/rfc2183>.
593
604
  #
594
- # [MIME-IMB[https://tools.ietf.org/html/rfc2045]]::
605
+ # [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]::
595
606
  # Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions
596
607
  # (MIME) Part One: Format of Internet Message Bodies",
597
608
  # RFC 2045, DOI 10.17487/RFC2045, November 1996,
598
609
  # <https://www.rfc-editor.org/info/rfc2045>.
599
610
  #
600
- # [MIME-IMT[https://tools.ietf.org/html/rfc2046]]::
611
+ # [MIME-IMT[https://www.rfc-editor.org/rfc/rfc2046]]::
601
612
  # Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions
602
613
  # (MIME) Part Two: Media Types", RFC 2046, DOI 10.17487/RFC2046,
603
614
  # November 1996, <https://www.rfc-editor.org/info/rfc2046>.
604
615
  #
605
- # [MIME-HDRS[https://tools.ietf.org/html/rfc2047]]::
616
+ # [MIME-HDRS[https://www.rfc-editor.org/rfc/rfc2047]]::
606
617
  # Moore, K., "MIME (Multipurpose Internet Mail Extensions) Part Three:
607
618
  # Message Header Extensions for Non-ASCII Text",
608
619
  # RFC 2047, DOI 10.17487/RFC2047, November 1996,
609
620
  # <https://www.rfc-editor.org/info/rfc2047>.
610
621
  #
611
- # [RFC2231[https://tools.ietf.org/html/rfc2231]]::
622
+ # [RFC2231[https://www.rfc-editor.org/rfc/rfc2231]]::
612
623
  # Freed, N. and K. Moore, "MIME Parameter Value and Encoded Word
613
624
  # Extensions: Character Sets, Languages, and Continuations",
614
625
  # RFC 2231, DOI 10.17487/RFC2231, November 1997,
615
626
  # <https://www.rfc-editor.org/info/rfc2231>.
616
627
  #
617
- # [I18n-HDRS[https://tools.ietf.org/html/rfc6532]]::
628
+ # [I18n-HDRS[https://www.rfc-editor.org/rfc/rfc6532]]::
618
629
  # Yang, A., Steele, S., and N. Freed, "Internationalized Email Headers",
619
630
  # RFC 6532, DOI 10.17487/RFC6532, February 2012,
620
631
  # <https://www.rfc-editor.org/info/rfc6532>.
@@ -630,12 +641,12 @@ module Net
630
641
  # RFC 2557, DOI 10.17487/RFC2557, March 1999,
631
642
  # <https://www.rfc-editor.org/info/rfc2557>.
632
643
  #
633
- # [MD5[https://tools.ietf.org/html/rfc1864]]::
644
+ # [MD5[https://www.rfc-editor.org/rfc/rfc1864]]::
634
645
  # Myers, J. and M. Rose, "The Content-MD5 Header Field",
635
646
  # RFC 1864, DOI 10.17487/RFC1864, October 1995,
636
647
  # <https://www.rfc-editor.org/info/rfc1864>.
637
648
  #
638
- # [RFC3503[https://tools.ietf.org/html/rfc3503]]::
649
+ # [RFC3503[https://www.rfc-editor.org/rfc/rfc3503]]::
639
650
  # Melnikov, A., "Message Disposition Notification (MDN)
640
651
  # profile for Internet Message Access Protocol (IMAP)",
641
652
  # RFC 3503, DOI 10.17487/RFC3503, March 2003,
@@ -643,27 +654,27 @@ module Net
643
654
  #
644
655
  # === \IMAP Extensions
645
656
  #
646
- # [QUOTA[https://tools.ietf.org/html/rfc9208]]::
657
+ # [QUOTA[https://www.rfc-editor.org/rfc/rfc9208]]::
647
658
  # Melnikov, A., "IMAP QUOTA Extension", RFC 9208, DOI 10.17487/RFC9208,
648
659
  # March 2022, <https://www.rfc-editor.org/info/rfc9208>.
649
660
  #
650
661
  # <em>Note: obsoletes</em>
651
- # RFC-2087[https://tools.ietf.org/html/rfc2087]<em> (January 1997)</em>.
662
+ # RFC-2087[https://www.rfc-editor.org/rfc/rfc2087]<em> (January 1997)</em>.
652
663
  # <em>Net::IMAP does not fully support the RFC9208 updates yet.</em>
653
- # [IDLE[https://tools.ietf.org/html/rfc2177]]::
664
+ # [IDLE[https://www.rfc-editor.org/rfc/rfc2177]]::
654
665
  # Leiba, B., "IMAP4 IDLE command", RFC 2177, DOI 10.17487/RFC2177,
655
666
  # June 1997, <https://www.rfc-editor.org/info/rfc2177>.
656
- # [NAMESPACE[https://tools.ietf.org/html/rfc2342]]::
667
+ # [NAMESPACE[https://www.rfc-editor.org/rfc/rfc2342]]::
657
668
  # Gahrns, M. and C. Newman, "IMAP4 Namespace", RFC 2342,
658
669
  # DOI 10.17487/RFC2342, May 1998, <https://www.rfc-editor.org/info/rfc2342>.
659
- # [ID[https://tools.ietf.org/html/rfc2971]]::
670
+ # [ID[https://www.rfc-editor.org/rfc/rfc2971]]::
660
671
  # Showalter, T., "IMAP4 ID extension", RFC 2971, DOI 10.17487/RFC2971,
661
672
  # October 2000, <https://www.rfc-editor.org/info/rfc2971>.
662
- # [BINARY[https://tools.ietf.org/html/rfc3516]]::
673
+ # [BINARY[https://www.rfc-editor.org/rfc/rfc3516]]::
663
674
  # Nerenberg, L., "IMAP4 Binary Content Extension", RFC 3516,
664
675
  # DOI 10.17487/RFC3516, April 2003,
665
676
  # <https://www.rfc-editor.org/info/rfc3516>.
666
- # [ACL[https://tools.ietf.org/html/rfc4314]]::
677
+ # [ACL[https://www.rfc-editor.org/rfc/rfc4314]]::
667
678
  # Melnikov, A., "IMAP4 Access Control List (ACL) Extension", RFC 4314,
668
679
  # DOI 10.17487/RFC4314, December 2005,
669
680
  # <https://www.rfc-editor.org/info/rfc4314>.
@@ -671,36 +682,46 @@ module Net
671
682
  # Crispin, M., "Internet Message Access Protocol (\IMAP) - UIDPLUS
672
683
  # extension", RFC 4315, DOI 10.17487/RFC4315, December 2005,
673
684
  # <https://www.rfc-editor.org/info/rfc4315>.
674
- # [SORT[https://tools.ietf.org/html/rfc5256]]::
685
+ # [SORT[https://www.rfc-editor.org/rfc/rfc5256]]::
675
686
  # Crispin, M. and K. Murchison, "Internet Message Access Protocol - SORT and
676
687
  # THREAD Extensions", RFC 5256, DOI 10.17487/RFC5256, June 2008,
677
688
  # <https://www.rfc-editor.org/info/rfc5256>.
678
- # [THREAD[https://tools.ietf.org/html/rfc5256]]::
689
+ # [THREAD[https://www.rfc-editor.org/rfc/rfc5256]]::
679
690
  # Crispin, M. and K. Murchison, "Internet Message Access Protocol - SORT and
680
691
  # THREAD Extensions", RFC 5256, DOI 10.17487/RFC5256, June 2008,
681
692
  # <https://www.rfc-editor.org/info/rfc5256>.
682
693
  # [RFC5530[https://www.rfc-editor.org/rfc/rfc5530.html]]::
683
694
  # Gulbrandsen, A., "IMAP Response Codes", RFC 5530, DOI 10.17487/RFC5530,
684
695
  # May 2009, <https://www.rfc-editor.org/info/rfc5530>.
685
- # [MOVE[https://tools.ietf.org/html/rfc6851]]::
696
+ # [MOVE[https://www.rfc-editor.org/rfc/rfc6851]]::
686
697
  # Gulbrandsen, A. and N. Freed, Ed., "Internet Message Access Protocol
687
698
  # (\IMAP) - MOVE Extension", RFC 6851, DOI 10.17487/RFC6851, January 2013,
688
699
  # <https://www.rfc-editor.org/info/rfc6851>.
689
- # [UTF8=ACCEPT[https://tools.ietf.org/html/rfc6855]]::
690
- # [UTF8=ONLY[https://tools.ietf.org/html/rfc6855]]::
700
+ # [UTF8=ACCEPT[https://www.rfc-editor.org/rfc/rfc6855]]::
701
+ # [UTF8=ONLY[https://www.rfc-editor.org/rfc/rfc6855]]::
691
702
  # Resnick, P., Ed., Newman, C., Ed., and S. Shen, Ed.,
692
703
  # "IMAP Support for UTF-8", RFC 6855, DOI 10.17487/RFC6855, March 2013,
693
704
  # <https://www.rfc-editor.org/info/rfc6855>.
694
- # [CONDSTORE[https://tools.ietf.org/html/rfc7162]]::
695
- # [QRESYNC[https://tools.ietf.org/html/rfc7162]]::
705
+ # [CONDSTORE[https://www.rfc-editor.org/rfc/rfc7162]]::
706
+ # [QRESYNC[https://www.rfc-editor.org/rfc/rfc7162]]::
696
707
  # Melnikov, A. and D. Cridland, "IMAP Extensions: Quick Flag Changes
697
708
  # Resynchronization (CONDSTORE) and Quick Mailbox Resynchronization
698
709
  # (QRESYNC)", RFC 7162, DOI 10.17487/RFC7162, May 2014,
699
710
  # <https://www.rfc-editor.org/info/rfc7162>.
700
- # [OBJECTID[https://tools.ietf.org/html/rfc8474]]::
711
+ # [OBJECTID[https://www.rfc-editor.org/rfc/rfc8474]]::
701
712
  # Gondwana, B., Ed., "IMAP Extension for Object Identifiers",
702
713
  # RFC 8474, DOI 10.17487/RFC8474, September 2018,
703
714
  # <https://www.rfc-editor.org/info/rfc8474>.
715
+ # [PARTIAL[https://www.rfc-editor.org/info/rfc9394]]::
716
+ # Melnikov, A., Achuthan, A., Nagulakonda, V., and L. Alves,
717
+ # "IMAP PARTIAL Extension for Paged SEARCH and FETCH", RFC 9394,
718
+ # DOI 10.17487/RFC9394, June 2023,
719
+ # <https://www.rfc-editor.org/info/rfc9394>.
720
+ # [UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.pdf]]::
721
+ # Melnikov, A., Achuthan, A., Nagulakonda, V., Singh, A., and L. Alves,
722
+ # "\IMAP Extension for Using and Returning Unique Identifiers (UIDs) Only",
723
+ # RFC 9586, DOI 10.17487/RFC9586, May 2024,
724
+ # <https://www.rfc-editor.org/info/rfc9586>.
704
725
  #
705
726
  # === IANA registries
706
727
  # * {IMAP Capabilities}[http://www.iana.org/assignments/imap4-capabilities]
@@ -714,7 +735,7 @@ module Net
714
735
  # * {GSSAPI/Kerberos/SASL Service Names}[https://www.iana.org/assignments/gssapi-service-names/gssapi-service-names.xhtml]:
715
736
  # +imap+
716
737
  # * {Character sets}[https://www.iana.org/assignments/character-sets/character-sets.xhtml]
717
- # ===== For currently unsupported features:
738
+ # ==== For currently unsupported features:
718
739
  # * {IMAP Quota Resource Types}[http://www.iana.org/assignments/imap4-capabilities#imap-capabilities-2]
719
740
  # * {LIST-EXTENDED options and responses}[https://www.iana.org/assignments/imap-list-extended/imap-list-extended.xhtml]
720
741
  # * {IMAP METADATA Server Entry and Mailbox Entry Registries}[https://www.iana.org/assignments/imap-metadata/imap-metadata.xhtml]
@@ -723,7 +744,7 @@ module Net
723
744
  # * {IMAP URLAUTH Authorization Mechanism Registry}[https://www.iana.org/assignments/urlauth-authorization-mechanism-registry/urlauth-authorization-mechanism-registry.xhtml]
724
745
  #
725
746
  class IMAP < Protocol
726
- VERSION = "0.5.2"
747
+ VERSION = "0.5.5"
727
748
 
728
749
  # Aliases for supported capabilities, to be used with the #enable command.
729
750
  ENABLE_ALIASES = {
@@ -1125,12 +1146,12 @@ module Net
1125
1146
  # )
1126
1147
  # end
1127
1148
  #
1128
- # See [ID[https://tools.ietf.org/html/rfc2971]] for field definitions.
1149
+ # See [ID[https://www.rfc-editor.org/rfc/rfc2971]] for field definitions.
1129
1150
  #
1130
1151
  # ==== Capabilities
1131
1152
  #
1132
1153
  # The server's capabilities must include +ID+
1133
- # [RFC2971[https://tools.ietf.org/html/rfc2971]].
1154
+ # [RFC2971[https://www.rfc-editor.org/rfc/rfc2971]].
1134
1155
  def id(client_id=nil)
1135
1156
  synchronize do
1136
1157
  send_command("ID", ClientID.new(client_id))
@@ -1553,7 +1574,7 @@ module Net
1553
1574
  # servers, then folder creation (and listing, moving, etc) can lead to
1554
1575
  # errors.
1555
1576
  #
1556
- # From RFC2342[https://tools.ietf.org/html/rfc2342]:
1577
+ # From RFC2342[https://www.rfc-editor.org/rfc/rfc2342]:
1557
1578
  # >>>
1558
1579
  # <em>Although typically a server will support only a single Personal
1559
1580
  # Namespace, and a single Other User's Namespace, circumstances exist
@@ -1582,8 +1603,8 @@ module Net
1582
1603
  #
1583
1604
  # ==== Capabilities
1584
1605
  #
1585
- # The server's capabilities must include +NAMESPACE+
1586
- # [RFC2342[https://tools.ietf.org/html/rfc2342]].
1606
+ # The server's capabilities must include either +IMAP4rev2+ or +NAMESPACE+
1607
+ # [RFC2342[https://www.rfc-editor.org/rfc/rfc2342]].
1587
1608
  def namespace
1588
1609
  synchronize do
1589
1610
  send_command("NAMESPACE")
@@ -1645,7 +1666,7 @@ module Net
1645
1666
  # ==== Capabilities
1646
1667
  #
1647
1668
  # The server's capabilities must include +QUOTA+
1648
- # [RFC2087[https://tools.ietf.org/html/rfc2087]].
1669
+ # [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]].
1649
1670
  def getquotaroot(mailbox)
1650
1671
  synchronize do
1651
1672
  send_command("GETQUOTAROOT", mailbox)
@@ -1666,7 +1687,7 @@ module Net
1666
1687
  # ==== Capabilities
1667
1688
  #
1668
1689
  # The server's capabilities must include +QUOTA+
1669
- # [RFC2087[https://tools.ietf.org/html/rfc2087]].
1690
+ # [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]].
1670
1691
  def getquota(mailbox)
1671
1692
  synchronize do
1672
1693
  send_command("GETQUOTA", mailbox)
@@ -1684,7 +1705,7 @@ module Net
1684
1705
  # ==== Capabilities
1685
1706
  #
1686
1707
  # The server's capabilities must include +QUOTA+
1687
- # [RFC2087[https://tools.ietf.org/html/rfc2087]].
1708
+ # [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]].
1688
1709
  def setquota(mailbox, quota)
1689
1710
  if quota.nil?
1690
1711
  data = '()'
@@ -1704,7 +1725,7 @@ module Net
1704
1725
  # ==== Capabilities
1705
1726
  #
1706
1727
  # The server's capabilities must include +ACL+
1707
- # [RFC4314[https://tools.ietf.org/html/rfc4314]].
1728
+ # [RFC4314[https://www.rfc-editor.org/rfc/rfc4314]].
1708
1729
  def setacl(mailbox, user, rights)
1709
1730
  if rights.nil?
1710
1731
  send_command("SETACL", mailbox, user, "")
@@ -1722,7 +1743,7 @@ module Net
1722
1743
  # ==== Capabilities
1723
1744
  #
1724
1745
  # The server's capabilities must include +ACL+
1725
- # [RFC4314[https://tools.ietf.org/html/rfc4314]].
1746
+ # [RFC4314[https://www.rfc-editor.org/rfc/rfc4314]].
1726
1747
  def getacl(mailbox)
1727
1748
  synchronize do
1728
1749
  send_command("GETACL", mailbox)
@@ -1883,54 +1904,70 @@ module Net
1883
1904
  #
1884
1905
  # ==== Capabilities
1885
1906
  #
1886
- # The server's capabilities must include +UNSELECT+
1887
- # [RFC3691[https://tools.ietf.org/html/rfc3691]].
1907
+ # The server's capabilities must include either +IMAP4rev2+ or +UNSELECT+
1908
+ # [RFC3691[https://www.rfc-editor.org/rfc/rfc3691]].
1888
1909
  def unselect
1889
1910
  send_command("UNSELECT")
1890
1911
  end
1891
1912
 
1913
+ # call-seq:
1914
+ # expunge -> array of message sequence numbers
1915
+ # expunge -> VanishedData of UIDs
1916
+ #
1892
1917
  # Sends an {EXPUNGE command [IMAP4rev1 §6.4.3]}[https://www.rfc-editor.org/rfc/rfc3501#section-6.4.3]
1893
- # Sends a EXPUNGE command to permanently remove from the currently
1894
- # selected mailbox all messages that have the \Deleted flag set.
1918
+ # to permanently remove all messages with the +\Deleted+ flag from the
1919
+ # currently selected mailbox.
1920
+ #
1921
+ # Returns either an array of expunged message <em>sequence numbers</em> or
1922
+ # (when the appropriate capability is enabled) VanishedData of expunged
1923
+ # UIDs. Previously unhandled +EXPUNGE+ or +VANISHED+ responses are merged
1924
+ # with the direct response to this command. <tt>VANISHED (EARLIER)</tt>
1925
+ # responses will _not_ be merged.
1926
+ #
1927
+ # When no messages have been expunged, an empty array is returned,
1928
+ # regardless of which extensions are enabled. In a future release, an empty
1929
+ # VanishedData may be returned, based on the currently enabled extensions.
1895
1930
  #
1896
1931
  # Related: #uid_expunge
1932
+ #
1933
+ # ==== Capabilities
1934
+ #
1935
+ # When either QRESYNC[https://www.rfc-editor.org/rfc/rfc7162] or
1936
+ # UIDONLY[https://www.rfc-editor.org/rfc/rfc9586] are enabled, #expunge
1937
+ # returns VanishedData, which contains UIDs---<em>not message sequence
1938
+ # numbers</em>.
1897
1939
  def expunge
1898
- synchronize do
1899
- send_command("EXPUNGE")
1900
- clear_responses("EXPUNGE")
1901
- end
1940
+ expunge_internal("EXPUNGE")
1902
1941
  end
1903
1942
 
1943
+ # call-seq:
1944
+ # uid_expunge{uid_set) -> array of message sequence numbers
1945
+ # uid_expunge{uid_set) -> VanishedData of UIDs
1946
+ #
1904
1947
  # Sends a {UID EXPUNGE command [RFC4315 §2.1]}[https://www.rfc-editor.org/rfc/rfc4315#section-2.1]
1905
1948
  # {[IMAP4rev2 §6.4.9]}[https://www.rfc-editor.org/rfc/rfc9051#section-6.4.9]
1906
1949
  # to permanently remove all messages that have both the <tt>\\Deleted</tt>
1907
1950
  # flag set and a UID that is included in +uid_set+.
1908
1951
  #
1952
+ # Returns the same result type as #expunge.
1953
+ #
1909
1954
  # By using #uid_expunge instead of #expunge when resynchronizing with
1910
1955
  # the server, the client can ensure that it does not inadvertantly
1911
1956
  # remove any messages that have been marked as <tt>\\Deleted</tt> by other
1912
1957
  # clients between the time that the client was last connected and
1913
1958
  # the time the client resynchronizes.
1914
1959
  #
1915
- # *Note:*
1916
- # >>>
1917
- # Although the command takes a set of UIDs for its argument, the
1918
- # server still returns regular EXPUNGE responses, which contain
1919
- # a <em>sequence number</em>. These will be deleted from
1920
- # #responses and this method returns them as an array of
1921
- # <em>sequence number</em> integers.
1922
- #
1923
1960
  # Related: #expunge
1924
1961
  #
1925
1962
  # ==== Capabilities
1926
1963
  #
1927
- # The server's capabilities must include +UIDPLUS+
1964
+ # The server's capabilities must include either +IMAP4rev2+ or +UIDPLUS+
1928
1965
  # [RFC4315[https://www.rfc-editor.org/rfc/rfc4315.html]].
1966
+ #
1967
+ # Otherwise, #uid_expunge is updated by extensions in the same way as
1968
+ # #expunge.
1929
1969
  def uid_expunge(uid_set)
1930
- synchronize do
1931
- send_command("UID EXPUNGE", SequenceSet.new(uid_set))
1932
- clear_responses("EXPUNGE")
1933
- end
1970
+ expunge_internal("UID EXPUNGE", SequenceSet.new(uid_set))
1934
1971
  end
1935
1972
 
1936
1973
  # :call-seq:
@@ -1942,7 +1979,7 @@ module Net
1942
1979
  # and returns either a SearchResult or an ESearchResult. SearchResult
1943
1980
  # inherits from Array (for backward compatibility) but adds
1944
1981
  # SearchResult#modseq when the +CONDSTORE+ capability has been enabled.
1945
- # ESearchResult also implements to_a{rdoc-ref:ESearchResult#to_a}, for
1982
+ # ESearchResult also implements {#to_a}[rdoc-ref:ESearchResult#to_a], for
1946
1983
  # compatibility with SearchResult.
1947
1984
  #
1948
1985
  # +criteria+ is one or more search keys and their arguments, which may be
@@ -1955,8 +1992,9 @@ module Net
1955
1992
  # the server to return an ESearchResult instead of a SearchResult, but some
1956
1993
  # servers disobey this requirement. <em>Requires an extended search
1957
1994
  # capability, such as +ESEARCH+ or +IMAP4rev2+.</em>
1958
- # See {"Argument translation"}[rdoc-ref:#search@Argument+translation]
1959
- # and {"Return options"}[rdoc-ref:#search@Return+options], below.
1995
+ # See {"Argument translation"}[rdoc-ref:#search@Argument+translation] and
1996
+ # {"Supported return options"}[rdoc-ref:#search@Supported+return+options],
1997
+ # below.
1960
1998
  #
1961
1999
  # +charset+ is the name of the {registered character
1962
2000
  # set}[https://www.iana.org/assignments/character-sets/character-sets.xhtml]
@@ -2066,33 +2104,58 @@ module Net
2066
2104
  # <em>*WARNING:* This is vulnerable to injection attacks when external
2067
2105
  # inputs are used.</em>
2068
2106
  #
2069
- # ==== Return options
2107
+ # ==== Supported return options
2070
2108
  #
2071
2109
  # For full definitions of the standard return options and return data, see
2072
2110
  # the relevant RFCs.
2073
2111
  #
2074
- # ===== +ESEARCH+ or +IMAP4rev2+
2075
- #
2076
- # The following return options require either +ESEARCH+ or +IMAP4rev2+.
2077
- # See [{RFC4731 §3.1}[https://rfc-editor.org/rfc/rfc4731#section-3.1]] or
2078
- # [{IMAP4rev2 §6.4.4}[https://www.rfc-editor.org/rfc/rfc9051.html#section-6.4.4]].
2079
- #
2080
2112
  # [+ALL+]
2081
2113
  # Returns ESearchResult#all with a SequenceSet of all matching sequence
2082
2114
  # numbers or UIDs. This is the default, when return options are empty.
2083
2115
  #
2084
2116
  # For compatibility with SearchResult, ESearchResult#to_a returns an
2085
2117
  # Array of message sequence numbers or UIDs.
2118
+ #
2119
+ # <em>Requires either the +ESEARCH+ or +IMAP4rev2+ capabability.</em>
2120
+ # {[RFC4731]}[https://rfc-editor.org/rfc/rfc4731]
2121
+ # {[RFC9051]}[https://rfc-editor.org/rfc/rfc9051]
2122
+ #
2086
2123
  # [+COUNT+]
2087
2124
  # Returns ESearchResult#count with the number of matching messages.
2125
+ #
2126
+ # <em>Requires either the +ESEARCH+ or +IMAP4rev2+ capabability.</em>
2127
+ # {[RFC4731]}[https://rfc-editor.org/rfc/rfc4731]
2128
+ # {[RFC9051]}[https://rfc-editor.org/rfc/rfc9051]
2129
+ #
2088
2130
  # [+MAX+]
2089
2131
  # Returns ESearchResult#max with the highest matching sequence number or
2090
2132
  # UID.
2133
+ #
2134
+ # <em>Requires either the +ESEARCH+ or +IMAP4rev2+ capabability.</em>
2135
+ # {[RFC4731]}[https://rfc-editor.org/rfc/rfc4731]
2136
+ # {[RFC9051]}[https://rfc-editor.org/rfc/rfc9051]
2137
+ #
2091
2138
  # [+MIN+]
2092
2139
  # Returns ESearchResult#min with the lowest matching sequence number or
2093
2140
  # UID.
2094
2141
  #
2095
- # ===== +CONDSTORE+
2142
+ # <em>Requires either the +ESEARCH+ or +IMAP4rev2+ capabability.</em>
2143
+ # {[RFC4731]}[https://rfc-editor.org/rfc/rfc4731]
2144
+ # {[RFC9051]}[https://rfc-editor.org/rfc/rfc9051]
2145
+ #
2146
+ # [+PARTIAL+ _range_]
2147
+ # Returns ESearchResult#partial with a SequenceSet of a subset of
2148
+ # matching sequence numbers or UIDs, as selected by _range_. As with
2149
+ # sequence numbers, the first result is +1+: <tt>1..500</tt> selects the
2150
+ # first 500 search results (in mailbox order), <tt>501..1000</tt> the
2151
+ # second 500, and so on. _range_ may also be negative: <tt>-500..-1</tt>
2152
+ # selects the last 500 search results.
2153
+ #
2154
+ # <em>Requires either the <tt>CONTEXT=SEARCH</tt> or +PARTIAL+ capabability.</em>
2155
+ # {[RFC5267]}[https://rfc-editor.org/rfc/rfc5267]
2156
+ # {[RFC9394]}[https://rfc-editor.org/rfc/rfc9394]
2157
+ #
2158
+ # ===== +MODSEQ+ return data
2096
2159
  #
2097
2160
  # ESearchResult#modseq return data does not have a corresponding return
2098
2161
  # option. Instead, it is returned if the +MODSEQ+ search key is used or
@@ -2104,8 +2167,8 @@ module Net
2104
2167
  #
2105
2168
  # {RFC4466 §2.6}[https://www.rfc-editor.org/rfc/rfc4466.html#section-2.6]
2106
2169
  # defines standard syntax for search extensions. Net::IMAP allows sending
2107
- # unknown search return options and will parse unknown search extensions'
2108
- # return values into ExtensionData. Please note that this is an
2170
+ # unsupported search return options and will parse unsupported search
2171
+ # extensions' return values into ExtensionData. Please note that this is an
2109
2172
  # intentionally _unstable_ API. Future releases may return different
2110
2173
  # (incompatible) objects, <em>without deprecation or warning</em>.
2111
2174
  #
@@ -2314,6 +2377,9 @@ module Net
2314
2377
  # result = imap.search(["SUBJECT", "hi there", "not", "new"])
2315
2378
  # #=> Net::IMAP::SearchResult[1, 6, 7, 8, modseq: 5594]
2316
2379
  # result.modseq # => 5594
2380
+ #
2381
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled,
2382
+ # the +SEARCH+ command is prohibited. Use #uid_search instead.
2317
2383
  def search(...)
2318
2384
  search_internal("SEARCH", ...)
2319
2385
  end
@@ -2331,6 +2397,16 @@ module Net
2331
2397
  # capability has been enabled.
2332
2398
  #
2333
2399
  # See #search for documentation of parameters.
2400
+ #
2401
+ # ==== Capabilities
2402
+ #
2403
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled,
2404
+ # #uid_search must be used instead of #search, and the <tt><message
2405
+ # set></tt> search criterion is prohibited. Use +ALL+ or <tt>UID
2406
+ # sequence-set</tt> instead.
2407
+ #
2408
+ # Otherwise, #uid_search is updated by extensions in the same way as
2409
+ # #search.
2334
2410
  def uid_search(...)
2335
2411
  search_internal("UID SEARCH", ...)
2336
2412
  end
@@ -2341,24 +2417,19 @@ module Net
2341
2417
  # Sends a {FETCH command [IMAP4rev1 §6.4.5]}[https://www.rfc-editor.org/rfc/rfc3501#section-6.4.5]
2342
2418
  # to retrieve data associated with a message in the mailbox.
2343
2419
  #
2344
- # The +set+ parameter is a number or a range between two numbers,
2345
- # or an array of those. The number is a message sequence number,
2346
- # where -1 represents a '*' for use in range notation like 100..-1
2347
- # being interpreted as '100:*'. Beware that the +exclude_end?+
2348
- # property of a Range object is ignored, and the contents of a
2349
- # range are independent of the order of the range endpoints as per
2350
- # the protocol specification, so 1...5, 5..1 and 5...1 are all
2351
- # equivalent to 1..5.
2420
+ # +set+ is the message sequence numbers to fetch, and may be any valid input
2421
+ # to {SequenceSet[...]}[rdoc-ref:SequenceSet@Creating+sequence+sets].
2422
+ # (For UIDs, use #uid_fetch instead.)
2352
2423
  #
2353
- # +attr+ is a list of attributes to fetch; see the documentation
2354
- # for FetchData for a list of valid attributes.
2424
+ # +attr+ is a list of attributes to fetch; see FetchStruct documentation for
2425
+ # a list of supported attributes.
2355
2426
  #
2356
2427
  # +changedsince+ is an optional integer mod-sequence. It limits results to
2357
2428
  # messages with a mod-sequence greater than +changedsince+.
2358
2429
  #
2359
2430
  # The return value is an array of FetchData.
2360
2431
  #
2361
- # Related: #uid_search, FetchData
2432
+ # Related: #uid_fetch, FetchData
2362
2433
  #
2363
2434
  # ==== For example:
2364
2435
  #
@@ -2380,37 +2451,80 @@ module Net
2380
2451
  #
2381
2452
  # ==== Capabilities
2382
2453
  #
2383
- # Many extensions define new message +attr+ names. See FetchData for a list
2384
- # of supported extension fields.
2454
+ # Many extensions define new message +attr+ names. See FetchStruct for a
2455
+ # list of supported extension fields.
2385
2456
  #
2386
2457
  # The server's capabilities must include +CONDSTORE+
2387
- # {[RFC7162]}[https://tools.ietf.org/html/rfc7162] in order to use the
2458
+ # {[RFC7162]}[https://www.rfc-editor.org/rfc/rfc7162] in order to use the
2388
2459
  # +changedsince+ argument. Using +changedsince+ implicitly enables the
2389
2460
  # +CONDSTORE+ extension.
2390
- def fetch(set, attr, mod = nil, changedsince: nil)
2391
- fetch_internal("FETCH", set, attr, mod, changedsince: changedsince)
2461
+ #
2462
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled, the
2463
+ # +FETCH+ command is prohibited. Use #uid_fetch instead.
2464
+ def fetch(...)
2465
+ fetch_internal("FETCH", ...)
2392
2466
  end
2393
2467
 
2394
2468
  # :call-seq:
2395
- # uid_fetch(set, attr, changedsince: nil) -> array of FetchData
2469
+ # uid_fetch(set, attr, changedsince: nil, partial: nil) -> array of FetchData (or UIDFetchData)
2396
2470
  #
2397
2471
  # Sends a {UID FETCH command [IMAP4rev1 §6.4.8]}[https://www.rfc-editor.org/rfc/rfc3501#section-6.4.8]
2398
2472
  # to retrieve data associated with a message in the mailbox.
2399
2473
  #
2400
- # Similar to #fetch, but the +set+ parameter contains unique identifiers
2401
- # instead of message sequence numbers.
2474
+ # +set+ is the message UIDs to fetch, and may be any valid input to
2475
+ # {SequenceSet[...]}[rdoc-ref:SequenceSet@Creating+sequence+sets].
2476
+ # (For message sequence numbers, use #fetch instead.)
2402
2477
  #
2478
+ # +attr+ behaves the same as with #fetch.
2403
2479
  # >>>
2404
2480
  # *Note:* Servers _MUST_ implicitly include the +UID+ message data item as
2405
2481
  # part of any +FETCH+ response caused by a +UID+ command, regardless of
2406
2482
  # whether a +UID+ was specified as a message data item to the +FETCH+.
2407
2483
  #
2484
+ # +changedsince+ (optional) behaves the same as with #fetch.
2485
+ #
2486
+ # +partial+ is an optional range to limit the number of results returned.
2487
+ # It's useful when +set+ contains an unknown number of messages.
2488
+ # <tt>1..500</tt> returns the first 500 messages in +set+ (in mailbox
2489
+ # order), <tt>501..1000</tt> the second 500, and so on. +partial+ may also
2490
+ # be negative: <tt>-500..-1</tt> selects the last 500 messages in +set+.
2491
+ # <em>Requires the +PARTIAL+ capabability.</em>
2492
+ # {[RFC9394]}[https://rfc-editor.org/rfc/rfc9394]
2493
+ #
2494
+ # For example:
2495
+ #
2496
+ # # Without partial, the size of the results may be unknown beforehand:
2497
+ # results = imap.uid_fetch(next_uid_to_fetch.., %w(UID FLAGS))
2498
+ # # ... maybe wait for a long time ... and allocate a lot of memory ...
2499
+ # results.size # => 0..2**32-1
2500
+ # process results # may also take a long time and use a lot of memory...
2501
+ #
2502
+ # # Using partial, the results may be paginated:
2503
+ # loop do
2504
+ # results = imap.uid_fetch(next_uid_to_fetch.., %w(UID FLAGS),
2505
+ # partial: 1..500)
2506
+ # # fetch should return quickly and allocate little memory
2507
+ # results.size # => 0..500
2508
+ # break if results.empty?
2509
+ # next_uid_to_fetch = results.last.uid + 1
2510
+ # process results
2511
+ # end
2512
+ #
2408
2513
  # Related: #fetch, FetchData
2409
2514
  #
2410
2515
  # ==== Capabilities
2411
- # Same as #fetch.
2412
- def uid_fetch(set, attr, mod = nil, changedsince: nil)
2413
- fetch_internal("UID FETCH", set, attr, mod, changedsince: changedsince)
2516
+ #
2517
+ # The server's capabilities must include +PARTIAL+
2518
+ # {[RFC9394]}[https://rfc-editor.org/rfc/rfc9394] in order to use the
2519
+ # +partial+ argument.
2520
+ #
2521
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled,
2522
+ # #uid_fetch must be used instead of #fetch, and UIDFetchData will be
2523
+ # returned instead of FetchData.
2524
+ #
2525
+ # Otherwise, #uid_fetch is updated by extensions in the same way as #fetch.
2526
+ def uid_fetch(...)
2527
+ fetch_internal("UID FETCH", ...)
2414
2528
  end
2415
2529
 
2416
2530
  # :call-seq:
@@ -2453,15 +2567,18 @@ module Net
2453
2567
  # Extensions may define new data items to be used with #store.
2454
2568
  #
2455
2569
  # The server's capabilities must include +CONDSTORE+
2456
- # {[RFC7162]}[https://tools.ietf.org/html/rfc7162] in order to use the
2570
+ # {[RFC7162]}[https://www.rfc-editor.org/rfc/rfc7162] in order to use the
2457
2571
  # +unchangedsince+ argument. Using +unchangedsince+ implicitly enables the
2458
2572
  # +CONDSTORE+ extension.
2573
+ #
2574
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled, the
2575
+ # +STORE+ command is prohibited. Use #uid_store instead.
2459
2576
  def store(set, attr, flags, unchangedsince: nil)
2460
2577
  store_internal("STORE", set, attr, flags, unchangedsince: unchangedsince)
2461
2578
  end
2462
2579
 
2463
2580
  # :call-seq:
2464
- # uid_store(set, attr, value, unchangedsince: nil) -> array of FetchData
2581
+ # uid_store(set, attr, value, unchangedsince: nil) -> array of FetchData (or UIDFetchData)
2465
2582
  #
2466
2583
  # Sends a {UID STORE command [IMAP4rev1 §6.4.8]}[https://www.rfc-editor.org/rfc/rfc3501#section-6.4.8]
2467
2584
  # to alter data associated with messages in the mailbox, in particular their
@@ -2473,7 +2590,12 @@ module Net
2473
2590
  # Related: #store
2474
2591
  #
2475
2592
  # ==== Capabilities
2476
- # Same as #store.
2593
+ #
2594
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled,
2595
+ # #uid_store must be used instead of #store, and UIDFetchData will be
2596
+ # returned instead of FetchData.
2597
+ #
2598
+ # Otherwise, #uid_store is updated by extensions in the same way as #store.
2477
2599
  def uid_store(set, attr, flags, unchangedsince: nil)
2478
2600
  store_internal("UID STORE", set, attr, flags, unchangedsince: unchangedsince)
2479
2601
  end
@@ -2492,6 +2614,9 @@ module Net
2492
2614
  # with UIDPlusData. This will report the UIDVALIDITY of the destination
2493
2615
  # mailbox, the UID set of the source messages, and the assigned UID set of
2494
2616
  # the moved messages.
2617
+ #
2618
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled, the
2619
+ # +COPY+ command is prohibited. Use #uid_copy instead.
2495
2620
  def copy(set, mailbox)
2496
2621
  copy_internal("COPY", set, mailbox)
2497
2622
  end
@@ -2504,7 +2629,10 @@ module Net
2504
2629
  #
2505
2630
  # ==== Capabilities
2506
2631
  #
2507
- # +UIDPLUS+ affects #uid_copy the same way it affects #copy.
2632
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] in enabled,
2633
+ # #uid_copy must be used instead of #copy.
2634
+ #
2635
+ # Otherwise, #uid_copy is updated by extensions in the same way as #copy.
2508
2636
  def uid_copy(set, mailbox)
2509
2637
  copy_internal("UID COPY", set, mailbox)
2510
2638
  end
@@ -2519,8 +2647,8 @@ module Net
2519
2647
  #
2520
2648
  # ==== Capabilities
2521
2649
  #
2522
- # The server's capabilities must include +MOVE+
2523
- # [RFC6851[https://tools.ietf.org/html/rfc6851]].
2650
+ # The server's capabilities must include either +IMAP4rev2+ or +MOVE+
2651
+ # [RFC6851[https://www.rfc-editor.org/rfc/rfc6851]].
2524
2652
  #
2525
2653
  # If +UIDPLUS+ [RFC4315[https://www.rfc-editor.org/rfc/rfc4315.html]] is
2526
2654
  # supported, the server's response should include a +COPYUID+ response code
@@ -2528,6 +2656,8 @@ module Net
2528
2656
  # mailbox, the UID set of the source messages, and the assigned UID set of
2529
2657
  # the moved messages.
2530
2658
  #
2659
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled, the
2660
+ # +MOVE+ command is prohibited. Use #uid_move instead.
2531
2661
  def move(set, mailbox)
2532
2662
  copy_internal("MOVE", set, mailbox)
2533
2663
  end
@@ -2543,9 +2673,13 @@ module Net
2543
2673
  #
2544
2674
  # ==== Capabilities
2545
2675
  #
2546
- # Same as #move: The server's capabilities must include +MOVE+
2547
- # [RFC6851[https://tools.ietf.org/html/rfc6851]]. +UIDPLUS+ also affects
2548
- # #uid_move the same way it affects #move.
2676
+ # The server's capabilities must include either +IMAP4rev2+ or +MOVE+
2677
+ # [RFC6851[https://www.rfc-editor.org/rfc/rfc6851]].
2678
+ #
2679
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled,
2680
+ # #uid_move must be used instead of #move.
2681
+ #
2682
+ # Otherwise, #uid_move is updated by extensions in the same way as #move.
2549
2683
  def uid_move(set, mailbox)
2550
2684
  copy_internal("UID MOVE", set, mailbox)
2551
2685
  end
@@ -2571,7 +2705,7 @@ module Net
2571
2705
  # ==== Capabilities
2572
2706
  #
2573
2707
  # The server's capabilities must include +SORT+
2574
- # [RFC5256[https://tools.ietf.org/html/rfc5256]].
2708
+ # [RFC5256[https://www.rfc-editor.org/rfc/rfc5256]].
2575
2709
  def sort(sort_keys, search_keys, charset)
2576
2710
  return sort_internal("SORT", sort_keys, search_keys, charset)
2577
2711
  end
@@ -2586,7 +2720,7 @@ module Net
2586
2720
  # ==== Capabilities
2587
2721
  #
2588
2722
  # The server's capabilities must include +SORT+
2589
- # [RFC5256[https://tools.ietf.org/html/rfc5256]].
2723
+ # [RFC5256[https://www.rfc-editor.org/rfc/rfc5256]].
2590
2724
  def uid_sort(sort_keys, search_keys, charset)
2591
2725
  return sort_internal("UID SORT", sort_keys, search_keys, charset)
2592
2726
  end
@@ -2611,7 +2745,7 @@ module Net
2611
2745
  # ==== Capabilities
2612
2746
  #
2613
2747
  # The server's capabilities must include +THREAD+
2614
- # [RFC5256[https://tools.ietf.org/html/rfc5256]].
2748
+ # [RFC5256[https://www.rfc-editor.org/rfc/rfc5256]].
2615
2749
  def thread(algorithm, search_keys, charset)
2616
2750
  return thread_internal("THREAD", algorithm, search_keys, charset)
2617
2751
  end
@@ -2625,7 +2759,7 @@ module Net
2625
2759
  # ==== Capabilities
2626
2760
  #
2627
2761
  # The server's capabilities must include +THREAD+
2628
- # [RFC5256[https://tools.ietf.org/html/rfc5256]].
2762
+ # [RFC5256[https://www.rfc-editor.org/rfc/rfc5256]].
2629
2763
  def uid_thread(algorithm, search_keys, charset)
2630
2764
  return thread_internal("UID THREAD", algorithm, search_keys, charset)
2631
2765
  end
@@ -2644,8 +2778,8 @@ module Net
2644
2778
  # ==== Capabilities
2645
2779
  #
2646
2780
  # The server's capabilities must include
2647
- # +ENABLE+ [RFC5161[https://tools.ietf.org/html/rfc5161]]
2648
- # or +IMAP4REV2+ [RFC9051[https://tools.ietf.org/html/rfc9051]].
2781
+ # +ENABLE+ [RFC5161[https://www.rfc-editor.org/rfc/rfc5161]]
2782
+ # or +IMAP4REV2+ [RFC9051[https://www.rfc-editor.org/rfc/rfc9051]].
2649
2783
  #
2650
2784
  # Additionally, the server capabilities must include a capability matching
2651
2785
  # each enabled extension (usually the same name as the enabled extension).
@@ -2664,7 +2798,7 @@ module Net
2664
2798
  # <tt>"UTF8=ACCEPT"</tt> or <tt>"IMAP4rev2"</tt>, depending on server
2665
2799
  # capabilities.
2666
2800
  #
2667
- # [<tt>"UTF8=ACCEPT"</tt> [RFC6855[https://tools.ietf.org/html/rfc6855]]]
2801
+ # [<tt>"UTF8=ACCEPT"</tt> [RFC6855[https://www.rfc-editor.org/rfc/rfc6855]]]
2668
2802
  #
2669
2803
  # The server's capabilities must include <tt>UTF8=ACCEPT</tt> _or_
2670
2804
  # <tt>UTF8=ONLY</tt>.
@@ -2683,13 +2817,23 @@ module Net
2683
2817
  # encoding, even if they generally contain UTF-8 data, if they are
2684
2818
  # text at all.
2685
2819
  #
2686
- # [<tt>"UTF8=ONLY"</tt> [RFC6855[https://tools.ietf.org/html/rfc6855]]]
2820
+ # [<tt>"UTF8=ONLY"</tt> [RFC6855[https://www.rfc-editor.org/rfc/rfc6855]]]
2687
2821
  #
2688
2822
  # A server that reports the <tt>UTF8=ONLY</tt> capability _requires_ that
2689
2823
  # the client <tt>enable("UTF8=ACCEPT")</tt> before any mailboxes may be
2690
2824
  # selected. For convenience, <tt>enable("UTF8=ONLY")</tt> is aliased to
2691
2825
  # <tt>enable("UTF8=ACCEPT")</tt>.
2692
2826
  #
2827
+ # [+UIDONLY+ {[RFC9586]}[https://www.rfc-editor.org/rfc/rfc9586.pdf]]
2828
+ #
2829
+ # When UIDONLY is enabled, the #fetch, #store, #search, #copy, and #move
2830
+ # commands are prohibited and result in a tagged BAD response. Clients
2831
+ # should instead use uid_fetch, uid_store, uid_search, uid_copy, or
2832
+ # uid_move, respectively. All +FETCH+ responses that would be returned are
2833
+ # replaced by +UIDFETCH+ responses. All +EXPUNGED+ responses that would be
2834
+ # returned are replaced by +VANISHED+ responses. The "<sequence set>"
2835
+ # uid_search criterion is prohibited.
2836
+ #
2693
2837
  # ===== Unsupported capabilities
2694
2838
  #
2695
2839
  # *Note:* Some extensions that use ENABLE permit the server to send syntax
@@ -2745,8 +2889,8 @@ module Net
2745
2889
  #
2746
2890
  # ==== Capabilities
2747
2891
  #
2748
- # The server's capabilities must include +IDLE+
2749
- # [RFC2177[https://tools.ietf.org/html/rfc2177]].
2892
+ # The server's capabilities must include either +IMAP4rev2+ or +IDLE+
2893
+ # [RFC2177[https://www.rfc-editor.org/rfc/rfc2177]].
2750
2894
  def idle(timeout = nil, &response_handler)
2751
2895
  raise LocalJumpError, "no block given" unless response_handler
2752
2896
 
@@ -3261,6 +3405,22 @@ module Net
3261
3405
  end
3262
3406
  end
3263
3407
 
3408
+ def expunge_internal(...)
3409
+ synchronize do
3410
+ send_command(...)
3411
+ expunged_array = clear_responses("EXPUNGE")
3412
+ vanished_array = extract_responses("VANISHED") { !_1.earlier? }
3413
+ if vanished_array.empty?
3414
+ expunged_array
3415
+ elsif vanished_array.length == 1
3416
+ vanished_array.first
3417
+ else
3418
+ merged_uids = SequenceSet[*vanished_array.map(&:uids)]
3419
+ VanishedData[uids: merged_uids, earlier: false]
3420
+ end
3421
+ end
3422
+ end
3423
+
3264
3424
  RETURN_WHOLE = /\ARETURN\z/i
3265
3425
  RETURN_START = /\ARETURN\b/i
3266
3426
  private_constant :RETURN_WHOLE, :RETURN_START
@@ -3306,24 +3466,14 @@ module Net
3306
3466
  ]
3307
3467
  return_opts.map {|opt|
3308
3468
  case opt
3309
- when Symbol then opt.to_s
3310
- when Range then partial_range_last_or_seqset(opt)
3311
- else opt
3469
+ when Symbol then opt.to_s
3470
+ when PartialRange::Negative then PartialRange[opt]
3471
+ when Range then SequenceSet[opt]
3472
+ else opt
3312
3473
  end
3313
3474
  }
3314
3475
  end
3315
3476
 
3316
- def partial_range_last_or_seqset(range)
3317
- case [range.begin, range.end]
3318
- in [Integer => first, Integer => last] if first.negative? && last.negative?
3319
- # partial-range-last [RFC9394]
3320
- first <= last or raise DataFormatError, "empty range: %p" % [range]
3321
- "#{first}:#{last}"
3322
- else
3323
- SequenceSet[range]
3324
- end
3325
- end
3326
-
3327
3477
  def search_internal(cmd, ...)
3328
3478
  args, esearch = search_args(...)
3329
3479
  synchronize do
@@ -3350,7 +3500,12 @@ module Net
3350
3500
  end
3351
3501
  end
3352
3502
 
3353
- def fetch_internal(cmd, set, attr, mod = nil, changedsince: nil)
3503
+ def fetch_internal(cmd, set, attr, mod = nil, partial: nil, changedsince: nil)
3504
+ set = SequenceSet[set]
3505
+ if partial
3506
+ mod ||= []
3507
+ mod << "PARTIAL" << PartialRange[partial]
3508
+ end
3354
3509
  if changedsince
3355
3510
  mod ||= []
3356
3511
  mod << "CHANGEDSINCE" << Integer(changedsince)
@@ -3364,15 +3519,9 @@ module Net
3364
3519
  }
3365
3520
  end
3366
3521
 
3367
- synchronize do
3368
- clear_responses("FETCH")
3369
- if mod
3370
- send_command(cmd, SequenceSet.new(set), attr, mod)
3371
- else
3372
- send_command(cmd, SequenceSet.new(set), attr)
3373
- end
3374
- clear_responses("FETCH")
3375
- end
3522
+ args = [cmd, set, attr]
3523
+ args << mod if mod
3524
+ send_command_returning_fetch_results(*args)
3376
3525
  end
3377
3526
 
3378
3527
  def store_internal(cmd, set, attr, flags, unchangedsince: nil)
@@ -3380,10 +3529,17 @@ module Net
3380
3529
  args = [SequenceSet.new(set)]
3381
3530
  args << ["UNCHANGEDSINCE", Integer(unchangedsince)] if unchangedsince
3382
3531
  args << attr << flags
3532
+ send_command_returning_fetch_results(cmd, *args)
3533
+ end
3534
+
3535
+ def send_command_returning_fetch_results(...)
3383
3536
  synchronize do
3384
3537
  clear_responses("FETCH")
3385
- send_command(cmd, *args)
3386
- clear_responses("FETCH")
3538
+ clear_responses("UIDFETCH")
3539
+ send_command(...)
3540
+ fetches = clear_responses("FETCH")
3541
+ uidfetches = clear_responses("UIDFETCH")
3542
+ uidfetches.any? ? uidfetches : fetches
3387
3543
  end
3388
3544
  end
3389
3545