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

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.
@@ -539,6 +539,12 @@ module Net
539
539
  # ESearchResult#partial return data.
540
540
  # - Updates #uid_fetch with the +partial+ modifier.
541
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
+ #
542
548
  # == References
543
549
  #
544
550
  # [{IMAP4rev1}[https://www.rfc-editor.org/rfc/rfc3501.html]]::
@@ -569,57 +575,57 @@ module Net
569
575
  # Gahrns, M., "IMAP4 Multi-Accessed Mailbox Practice", RFC 2180, DOI
570
576
  # 10.17487/RFC2180, July 1997, <https://www.rfc-editor.org/info/rfc2180>.
571
577
  #
572
- # [UTF7[https://tools.ietf.org/html/rfc2152]]::
578
+ # [UTF7[https://www.rfc-editor.org/rfc/rfc2152]]::
573
579
  # Goldsmith, D. and M. Davis, "UTF-7 A Mail-Safe Transformation Format of
574
580
  # Unicode", RFC 2152, DOI 10.17487/RFC2152, May 1997,
575
581
  # <https://www.rfc-editor.org/info/rfc2152>.
576
582
  #
577
583
  # === Message envelope and body structure
578
584
  #
579
- # [RFC5322[https://tools.ietf.org/html/rfc5322]]::
585
+ # [RFC5322[https://www.rfc-editor.org/rfc/rfc5322]]::
580
586
  # Resnick, P., Ed., "Internet Message Format",
581
587
  # RFC 5322, DOI 10.17487/RFC5322, October 2008,
582
588
  # <https://www.rfc-editor.org/info/rfc5322>.
583
589
  #
584
590
  # <em>Note: obsoletes</em>
585
- # RFC-2822[https://tools.ietf.org/html/rfc2822]<em> (April 2001) and</em>
586
- # 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>
587
593
  #
588
- # [CHARSET[https://tools.ietf.org/html/rfc2978]]::
594
+ # [CHARSET[https://www.rfc-editor.org/rfc/rfc2978]]::
589
595
  # Freed, N. and J. Postel, "IANA Charset Registration Procedures", BCP 19,
590
596
  # RFC 2978, DOI 10.17487/RFC2978, October 2000,
591
597
  # <https://www.rfc-editor.org/info/rfc2978>.
592
598
  #
593
- # [DISPOSITION[https://tools.ietf.org/html/rfc2183]]::
599
+ # [DISPOSITION[https://www.rfc-editor.org/rfc/rfc2183]]::
594
600
  # Troost, R., Dorner, S., and K. Moore, Ed., "Communicating Presentation
595
601
  # Information in Internet Messages: The Content-Disposition Header
596
602
  # Field", RFC 2183, DOI 10.17487/RFC2183, August 1997,
597
603
  # <https://www.rfc-editor.org/info/rfc2183>.
598
604
  #
599
- # [MIME-IMB[https://tools.ietf.org/html/rfc2045]]::
605
+ # [MIME-IMB[https://www.rfc-editor.org/rfc/rfc2045]]::
600
606
  # Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions
601
607
  # (MIME) Part One: Format of Internet Message Bodies",
602
608
  # RFC 2045, DOI 10.17487/RFC2045, November 1996,
603
609
  # <https://www.rfc-editor.org/info/rfc2045>.
604
610
  #
605
- # [MIME-IMT[https://tools.ietf.org/html/rfc2046]]::
611
+ # [MIME-IMT[https://www.rfc-editor.org/rfc/rfc2046]]::
606
612
  # Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions
607
613
  # (MIME) Part Two: Media Types", RFC 2046, DOI 10.17487/RFC2046,
608
614
  # November 1996, <https://www.rfc-editor.org/info/rfc2046>.
609
615
  #
610
- # [MIME-HDRS[https://tools.ietf.org/html/rfc2047]]::
616
+ # [MIME-HDRS[https://www.rfc-editor.org/rfc/rfc2047]]::
611
617
  # Moore, K., "MIME (Multipurpose Internet Mail Extensions) Part Three:
612
618
  # Message Header Extensions for Non-ASCII Text",
613
619
  # RFC 2047, DOI 10.17487/RFC2047, November 1996,
614
620
  # <https://www.rfc-editor.org/info/rfc2047>.
615
621
  #
616
- # [RFC2231[https://tools.ietf.org/html/rfc2231]]::
622
+ # [RFC2231[https://www.rfc-editor.org/rfc/rfc2231]]::
617
623
  # Freed, N. and K. Moore, "MIME Parameter Value and Encoded Word
618
624
  # Extensions: Character Sets, Languages, and Continuations",
619
625
  # RFC 2231, DOI 10.17487/RFC2231, November 1997,
620
626
  # <https://www.rfc-editor.org/info/rfc2231>.
621
627
  #
622
- # [I18n-HDRS[https://tools.ietf.org/html/rfc6532]]::
628
+ # [I18n-HDRS[https://www.rfc-editor.org/rfc/rfc6532]]::
623
629
  # Yang, A., Steele, S., and N. Freed, "Internationalized Email Headers",
624
630
  # RFC 6532, DOI 10.17487/RFC6532, February 2012,
625
631
  # <https://www.rfc-editor.org/info/rfc6532>.
@@ -635,12 +641,12 @@ module Net
635
641
  # RFC 2557, DOI 10.17487/RFC2557, March 1999,
636
642
  # <https://www.rfc-editor.org/info/rfc2557>.
637
643
  #
638
- # [MD5[https://tools.ietf.org/html/rfc1864]]::
644
+ # [MD5[https://www.rfc-editor.org/rfc/rfc1864]]::
639
645
  # Myers, J. and M. Rose, "The Content-MD5 Header Field",
640
646
  # RFC 1864, DOI 10.17487/RFC1864, October 1995,
641
647
  # <https://www.rfc-editor.org/info/rfc1864>.
642
648
  #
643
- # [RFC3503[https://tools.ietf.org/html/rfc3503]]::
649
+ # [RFC3503[https://www.rfc-editor.org/rfc/rfc3503]]::
644
650
  # Melnikov, A., "Message Disposition Notification (MDN)
645
651
  # profile for Internet Message Access Protocol (IMAP)",
646
652
  # RFC 3503, DOI 10.17487/RFC3503, March 2003,
@@ -648,27 +654,27 @@ module Net
648
654
  #
649
655
  # === \IMAP Extensions
650
656
  #
651
- # [QUOTA[https://tools.ietf.org/html/rfc9208]]::
657
+ # [QUOTA[https://www.rfc-editor.org/rfc/rfc9208]]::
652
658
  # Melnikov, A., "IMAP QUOTA Extension", RFC 9208, DOI 10.17487/RFC9208,
653
659
  # March 2022, <https://www.rfc-editor.org/info/rfc9208>.
654
660
  #
655
661
  # <em>Note: obsoletes</em>
656
- # 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>.
657
663
  # <em>Net::IMAP does not fully support the RFC9208 updates yet.</em>
658
- # [IDLE[https://tools.ietf.org/html/rfc2177]]::
664
+ # [IDLE[https://www.rfc-editor.org/rfc/rfc2177]]::
659
665
  # Leiba, B., "IMAP4 IDLE command", RFC 2177, DOI 10.17487/RFC2177,
660
666
  # June 1997, <https://www.rfc-editor.org/info/rfc2177>.
661
- # [NAMESPACE[https://tools.ietf.org/html/rfc2342]]::
667
+ # [NAMESPACE[https://www.rfc-editor.org/rfc/rfc2342]]::
662
668
  # Gahrns, M. and C. Newman, "IMAP4 Namespace", RFC 2342,
663
669
  # DOI 10.17487/RFC2342, May 1998, <https://www.rfc-editor.org/info/rfc2342>.
664
- # [ID[https://tools.ietf.org/html/rfc2971]]::
670
+ # [ID[https://www.rfc-editor.org/rfc/rfc2971]]::
665
671
  # Showalter, T., "IMAP4 ID extension", RFC 2971, DOI 10.17487/RFC2971,
666
672
  # October 2000, <https://www.rfc-editor.org/info/rfc2971>.
667
- # [BINARY[https://tools.ietf.org/html/rfc3516]]::
673
+ # [BINARY[https://www.rfc-editor.org/rfc/rfc3516]]::
668
674
  # Nerenberg, L., "IMAP4 Binary Content Extension", RFC 3516,
669
675
  # DOI 10.17487/RFC3516, April 2003,
670
676
  # <https://www.rfc-editor.org/info/rfc3516>.
671
- # [ACL[https://tools.ietf.org/html/rfc4314]]::
677
+ # [ACL[https://www.rfc-editor.org/rfc/rfc4314]]::
672
678
  # Melnikov, A., "IMAP4 Access Control List (ACL) Extension", RFC 4314,
673
679
  # DOI 10.17487/RFC4314, December 2005,
674
680
  # <https://www.rfc-editor.org/info/rfc4314>.
@@ -676,33 +682,33 @@ module Net
676
682
  # Crispin, M., "Internet Message Access Protocol (\IMAP) - UIDPLUS
677
683
  # extension", RFC 4315, DOI 10.17487/RFC4315, December 2005,
678
684
  # <https://www.rfc-editor.org/info/rfc4315>.
679
- # [SORT[https://tools.ietf.org/html/rfc5256]]::
685
+ # [SORT[https://www.rfc-editor.org/rfc/rfc5256]]::
680
686
  # Crispin, M. and K. Murchison, "Internet Message Access Protocol - SORT and
681
687
  # THREAD Extensions", RFC 5256, DOI 10.17487/RFC5256, June 2008,
682
688
  # <https://www.rfc-editor.org/info/rfc5256>.
683
- # [THREAD[https://tools.ietf.org/html/rfc5256]]::
689
+ # [THREAD[https://www.rfc-editor.org/rfc/rfc5256]]::
684
690
  # Crispin, M. and K. Murchison, "Internet Message Access Protocol - SORT and
685
691
  # THREAD Extensions", RFC 5256, DOI 10.17487/RFC5256, June 2008,
686
692
  # <https://www.rfc-editor.org/info/rfc5256>.
687
693
  # [RFC5530[https://www.rfc-editor.org/rfc/rfc5530.html]]::
688
694
  # Gulbrandsen, A., "IMAP Response Codes", RFC 5530, DOI 10.17487/RFC5530,
689
695
  # May 2009, <https://www.rfc-editor.org/info/rfc5530>.
690
- # [MOVE[https://tools.ietf.org/html/rfc6851]]::
696
+ # [MOVE[https://www.rfc-editor.org/rfc/rfc6851]]::
691
697
  # Gulbrandsen, A. and N. Freed, Ed., "Internet Message Access Protocol
692
698
  # (\IMAP) - MOVE Extension", RFC 6851, DOI 10.17487/RFC6851, January 2013,
693
699
  # <https://www.rfc-editor.org/info/rfc6851>.
694
- # [UTF8=ACCEPT[https://tools.ietf.org/html/rfc6855]]::
695
- # [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]]::
696
702
  # Resnick, P., Ed., Newman, C., Ed., and S. Shen, Ed.,
697
703
  # "IMAP Support for UTF-8", RFC 6855, DOI 10.17487/RFC6855, March 2013,
698
704
  # <https://www.rfc-editor.org/info/rfc6855>.
699
- # [CONDSTORE[https://tools.ietf.org/html/rfc7162]]::
700
- # [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]]::
701
707
  # Melnikov, A. and D. Cridland, "IMAP Extensions: Quick Flag Changes
702
708
  # Resynchronization (CONDSTORE) and Quick Mailbox Resynchronization
703
709
  # (QRESYNC)", RFC 7162, DOI 10.17487/RFC7162, May 2014,
704
710
  # <https://www.rfc-editor.org/info/rfc7162>.
705
- # [OBJECTID[https://tools.ietf.org/html/rfc8474]]::
711
+ # [OBJECTID[https://www.rfc-editor.org/rfc/rfc8474]]::
706
712
  # Gondwana, B., Ed., "IMAP Extension for Object Identifiers",
707
713
  # RFC 8474, DOI 10.17487/RFC8474, September 2018,
708
714
  # <https://www.rfc-editor.org/info/rfc8474>.
@@ -711,6 +717,11 @@ module Net
711
717
  # "IMAP PARTIAL Extension for Paged SEARCH and FETCH", RFC 9394,
712
718
  # DOI 10.17487/RFC9394, June 2023,
713
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>.
714
725
  #
715
726
  # === IANA registries
716
727
  # * {IMAP Capabilities}[http://www.iana.org/assignments/imap4-capabilities]
@@ -724,7 +735,7 @@ module Net
724
735
  # * {GSSAPI/Kerberos/SASL Service Names}[https://www.iana.org/assignments/gssapi-service-names/gssapi-service-names.xhtml]:
725
736
  # +imap+
726
737
  # * {Character sets}[https://www.iana.org/assignments/character-sets/character-sets.xhtml]
727
- # ===== For currently unsupported features:
738
+ # ==== For currently unsupported features:
728
739
  # * {IMAP Quota Resource Types}[http://www.iana.org/assignments/imap4-capabilities#imap-capabilities-2]
729
740
  # * {LIST-EXTENDED options and responses}[https://www.iana.org/assignments/imap-list-extended/imap-list-extended.xhtml]
730
741
  # * {IMAP METADATA Server Entry and Mailbox Entry Registries}[https://www.iana.org/assignments/imap-metadata/imap-metadata.xhtml]
@@ -733,7 +744,7 @@ module Net
733
744
  # * {IMAP URLAUTH Authorization Mechanism Registry}[https://www.iana.org/assignments/urlauth-authorization-mechanism-registry/urlauth-authorization-mechanism-registry.xhtml]
734
745
  #
735
746
  class IMAP < Protocol
736
- VERSION = "0.5.4"
747
+ VERSION = "0.5.6"
737
748
 
738
749
  # Aliases for supported capabilities, to be used with the #enable command.
739
750
  ENABLE_ALIASES = {
@@ -1135,12 +1146,12 @@ module Net
1135
1146
  # )
1136
1147
  # end
1137
1148
  #
1138
- # See [ID[https://tools.ietf.org/html/rfc2971]] for field definitions.
1149
+ # See [ID[https://www.rfc-editor.org/rfc/rfc2971]] for field definitions.
1139
1150
  #
1140
1151
  # ==== Capabilities
1141
1152
  #
1142
1153
  # The server's capabilities must include +ID+
1143
- # [RFC2971[https://tools.ietf.org/html/rfc2971]].
1154
+ # [RFC2971[https://www.rfc-editor.org/rfc/rfc2971]].
1144
1155
  def id(client_id=nil)
1145
1156
  synchronize do
1146
1157
  send_command("ID", ClientID.new(client_id))
@@ -1228,13 +1239,21 @@ module Net
1228
1239
  #
1229
1240
  def starttls(**options)
1230
1241
  @ssl_ctx_params, @ssl_ctx = build_ssl_ctx(options)
1231
- send_command("STARTTLS") do |resp|
1242
+ error = nil
1243
+ ok = send_command("STARTTLS") do |resp|
1232
1244
  if resp.kind_of?(TaggedResponse) && resp.name == "OK"
1233
1245
  clear_cached_capabilities
1234
1246
  clear_responses
1235
1247
  start_tls_session
1236
1248
  end
1249
+ rescue Exception => error
1250
+ raise # note that the error backtrace is in the receiver_thread
1251
+ end
1252
+ if error
1253
+ disconnect
1254
+ raise error
1237
1255
  end
1256
+ ok
1238
1257
  end
1239
1258
 
1240
1259
  # :call-seq:
@@ -1563,7 +1582,7 @@ module Net
1563
1582
  # servers, then folder creation (and listing, moving, etc) can lead to
1564
1583
  # errors.
1565
1584
  #
1566
- # From RFC2342[https://tools.ietf.org/html/rfc2342]:
1585
+ # From RFC2342[https://www.rfc-editor.org/rfc/rfc2342]:
1567
1586
  # >>>
1568
1587
  # <em>Although typically a server will support only a single Personal
1569
1588
  # Namespace, and a single Other User's Namespace, circumstances exist
@@ -1592,8 +1611,8 @@ module Net
1592
1611
  #
1593
1612
  # ==== Capabilities
1594
1613
  #
1595
- # The server's capabilities must include +NAMESPACE+
1596
- # [RFC2342[https://tools.ietf.org/html/rfc2342]].
1614
+ # The server's capabilities must include either +IMAP4rev2+ or +NAMESPACE+
1615
+ # [RFC2342[https://www.rfc-editor.org/rfc/rfc2342]].
1597
1616
  def namespace
1598
1617
  synchronize do
1599
1618
  send_command("NAMESPACE")
@@ -1655,7 +1674,7 @@ module Net
1655
1674
  # ==== Capabilities
1656
1675
  #
1657
1676
  # The server's capabilities must include +QUOTA+
1658
- # [RFC2087[https://tools.ietf.org/html/rfc2087]].
1677
+ # [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]].
1659
1678
  def getquotaroot(mailbox)
1660
1679
  synchronize do
1661
1680
  send_command("GETQUOTAROOT", mailbox)
@@ -1676,7 +1695,7 @@ module Net
1676
1695
  # ==== Capabilities
1677
1696
  #
1678
1697
  # The server's capabilities must include +QUOTA+
1679
- # [RFC2087[https://tools.ietf.org/html/rfc2087]].
1698
+ # [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]].
1680
1699
  def getquota(mailbox)
1681
1700
  synchronize do
1682
1701
  send_command("GETQUOTA", mailbox)
@@ -1694,7 +1713,7 @@ module Net
1694
1713
  # ==== Capabilities
1695
1714
  #
1696
1715
  # The server's capabilities must include +QUOTA+
1697
- # [RFC2087[https://tools.ietf.org/html/rfc2087]].
1716
+ # [RFC2087[https://www.rfc-editor.org/rfc/rfc2087]].
1698
1717
  def setquota(mailbox, quota)
1699
1718
  if quota.nil?
1700
1719
  data = '()'
@@ -1714,7 +1733,7 @@ module Net
1714
1733
  # ==== Capabilities
1715
1734
  #
1716
1735
  # The server's capabilities must include +ACL+
1717
- # [RFC4314[https://tools.ietf.org/html/rfc4314]].
1736
+ # [RFC4314[https://www.rfc-editor.org/rfc/rfc4314]].
1718
1737
  def setacl(mailbox, user, rights)
1719
1738
  if rights.nil?
1720
1739
  send_command("SETACL", mailbox, user, "")
@@ -1732,7 +1751,7 @@ module Net
1732
1751
  # ==== Capabilities
1733
1752
  #
1734
1753
  # The server's capabilities must include +ACL+
1735
- # [RFC4314[https://tools.ietf.org/html/rfc4314]].
1754
+ # [RFC4314[https://www.rfc-editor.org/rfc/rfc4314]].
1736
1755
  def getacl(mailbox)
1737
1756
  synchronize do
1738
1757
  send_command("GETACL", mailbox)
@@ -1893,8 +1912,8 @@ module Net
1893
1912
  #
1894
1913
  # ==== Capabilities
1895
1914
  #
1896
- # The server's capabilities must include +UNSELECT+
1897
- # [RFC3691[https://tools.ietf.org/html/rfc3691]].
1915
+ # The server's capabilities must include either +IMAP4rev2+ or +UNSELECT+
1916
+ # [RFC3691[https://www.rfc-editor.org/rfc/rfc3691]].
1898
1917
  def unselect
1899
1918
  send_command("UNSELECT")
1900
1919
  end
@@ -1921,8 +1940,8 @@ module Net
1921
1940
  #
1922
1941
  # ==== Capabilities
1923
1942
  #
1924
- # When either QRESYNC[https://tools.ietf.org/html/rfc7162] or
1925
- # UIDONLY[https://tools.ietf.org/html/rfc9586] are enabled, #expunge
1943
+ # When either QRESYNC[https://www.rfc-editor.org/rfc/rfc7162] or
1944
+ # UIDONLY[https://www.rfc-editor.org/rfc/rfc9586] are enabled, #expunge
1926
1945
  # returns VanishedData, which contains UIDs---<em>not message sequence
1927
1946
  # numbers</em>.
1928
1947
  def expunge
@@ -2366,6 +2385,9 @@ module Net
2366
2385
  # result = imap.search(["SUBJECT", "hi there", "not", "new"])
2367
2386
  # #=> Net::IMAP::SearchResult[1, 6, 7, 8, modseq: 5594]
2368
2387
  # result.modseq # => 5594
2388
+ #
2389
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled,
2390
+ # the +SEARCH+ command is prohibited. Use #uid_search instead.
2369
2391
  def search(...)
2370
2392
  search_internal("SEARCH", ...)
2371
2393
  end
@@ -2383,6 +2405,16 @@ module Net
2383
2405
  # capability has been enabled.
2384
2406
  #
2385
2407
  # See #search for documentation of parameters.
2408
+ #
2409
+ # ==== Capabilities
2410
+ #
2411
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled,
2412
+ # #uid_search must be used instead of #search, and the <tt><message
2413
+ # set></tt> search criterion is prohibited. Use +ALL+ or <tt>UID
2414
+ # sequence-set</tt> instead.
2415
+ #
2416
+ # Otherwise, #uid_search is updated by extensions in the same way as
2417
+ # #search.
2386
2418
  def uid_search(...)
2387
2419
  search_internal("UID SEARCH", ...)
2388
2420
  end
@@ -2397,8 +2429,8 @@ module Net
2397
2429
  # to {SequenceSet[...]}[rdoc-ref:SequenceSet@Creating+sequence+sets].
2398
2430
  # (For UIDs, use #uid_fetch instead.)
2399
2431
  #
2400
- # +attr+ is a list of attributes to fetch; see the documentation
2401
- # for FetchData for a list of valid attributes.
2432
+ # +attr+ is a list of attributes to fetch; see FetchStruct documentation for
2433
+ # a list of supported attributes.
2402
2434
  #
2403
2435
  # +changedsince+ is an optional integer mod-sequence. It limits results to
2404
2436
  # messages with a mod-sequence greater than +changedsince+.
@@ -2427,19 +2459,22 @@ module Net
2427
2459
  #
2428
2460
  # ==== Capabilities
2429
2461
  #
2430
- # Many extensions define new message +attr+ names. See FetchData for a list
2431
- # of supported extension fields.
2462
+ # Many extensions define new message +attr+ names. See FetchStruct for a
2463
+ # list of supported extension fields.
2432
2464
  #
2433
2465
  # The server's capabilities must include +CONDSTORE+
2434
- # {[RFC7162]}[https://tools.ietf.org/html/rfc7162] in order to use the
2466
+ # {[RFC7162]}[https://www.rfc-editor.org/rfc/rfc7162] in order to use the
2435
2467
  # +changedsince+ argument. Using +changedsince+ implicitly enables the
2436
2468
  # +CONDSTORE+ extension.
2469
+ #
2470
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled, the
2471
+ # +FETCH+ command is prohibited. Use #uid_fetch instead.
2437
2472
  def fetch(...)
2438
2473
  fetch_internal("FETCH", ...)
2439
2474
  end
2440
2475
 
2441
2476
  # :call-seq:
2442
- # uid_fetch(set, attr, changedsince: nil, partial: nil) -> array of FetchData
2477
+ # uid_fetch(set, attr, changedsince: nil, partial: nil) -> array of FetchData (or UIDFetchData)
2443
2478
  #
2444
2479
  # Sends a {UID FETCH command [IMAP4rev1 §6.4.8]}[https://www.rfc-editor.org/rfc/rfc3501#section-6.4.8]
2445
2480
  # to retrieve data associated with a message in the mailbox.
@@ -2491,7 +2526,11 @@ module Net
2491
2526
  # {[RFC9394]}[https://rfc-editor.org/rfc/rfc9394] in order to use the
2492
2527
  # +partial+ argument.
2493
2528
  #
2494
- # Otherwise, the same as #fetch.
2529
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled,
2530
+ # #uid_fetch must be used instead of #fetch, and UIDFetchData will be
2531
+ # returned instead of FetchData.
2532
+ #
2533
+ # Otherwise, #uid_fetch is updated by extensions in the same way as #fetch.
2495
2534
  def uid_fetch(...)
2496
2535
  fetch_internal("UID FETCH", ...)
2497
2536
  end
@@ -2536,15 +2575,18 @@ module Net
2536
2575
  # Extensions may define new data items to be used with #store.
2537
2576
  #
2538
2577
  # The server's capabilities must include +CONDSTORE+
2539
- # {[RFC7162]}[https://tools.ietf.org/html/rfc7162] in order to use the
2578
+ # {[RFC7162]}[https://www.rfc-editor.org/rfc/rfc7162] in order to use the
2540
2579
  # +unchangedsince+ argument. Using +unchangedsince+ implicitly enables the
2541
2580
  # +CONDSTORE+ extension.
2581
+ #
2582
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled, the
2583
+ # +STORE+ command is prohibited. Use #uid_store instead.
2542
2584
  def store(set, attr, flags, unchangedsince: nil)
2543
2585
  store_internal("STORE", set, attr, flags, unchangedsince: unchangedsince)
2544
2586
  end
2545
2587
 
2546
2588
  # :call-seq:
2547
- # uid_store(set, attr, value, unchangedsince: nil) -> array of FetchData
2589
+ # uid_store(set, attr, value, unchangedsince: nil) -> array of FetchData (or UIDFetchData)
2548
2590
  #
2549
2591
  # Sends a {UID STORE command [IMAP4rev1 §6.4.8]}[https://www.rfc-editor.org/rfc/rfc3501#section-6.4.8]
2550
2592
  # to alter data associated with messages in the mailbox, in particular their
@@ -2556,7 +2598,12 @@ module Net
2556
2598
  # Related: #store
2557
2599
  #
2558
2600
  # ==== Capabilities
2559
- # Same as #store.
2601
+ #
2602
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled,
2603
+ # #uid_store must be used instead of #store, and UIDFetchData will be
2604
+ # returned instead of FetchData.
2605
+ #
2606
+ # Otherwise, #uid_store is updated by extensions in the same way as #store.
2560
2607
  def uid_store(set, attr, flags, unchangedsince: nil)
2561
2608
  store_internal("UID STORE", set, attr, flags, unchangedsince: unchangedsince)
2562
2609
  end
@@ -2575,6 +2622,9 @@ module Net
2575
2622
  # with UIDPlusData. This will report the UIDVALIDITY of the destination
2576
2623
  # mailbox, the UID set of the source messages, and the assigned UID set of
2577
2624
  # the moved messages.
2625
+ #
2626
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled, the
2627
+ # +COPY+ command is prohibited. Use #uid_copy instead.
2578
2628
  def copy(set, mailbox)
2579
2629
  copy_internal("COPY", set, mailbox)
2580
2630
  end
@@ -2587,7 +2637,10 @@ module Net
2587
2637
  #
2588
2638
  # ==== Capabilities
2589
2639
  #
2590
- # +UIDPLUS+ affects #uid_copy the same way it affects #copy.
2640
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] in enabled,
2641
+ # #uid_copy must be used instead of #copy.
2642
+ #
2643
+ # Otherwise, #uid_copy is updated by extensions in the same way as #copy.
2591
2644
  def uid_copy(set, mailbox)
2592
2645
  copy_internal("UID COPY", set, mailbox)
2593
2646
  end
@@ -2602,8 +2655,8 @@ module Net
2602
2655
  #
2603
2656
  # ==== Capabilities
2604
2657
  #
2605
- # The server's capabilities must include +MOVE+
2606
- # [RFC6851[https://tools.ietf.org/html/rfc6851]].
2658
+ # The server's capabilities must include either +IMAP4rev2+ or +MOVE+
2659
+ # [RFC6851[https://www.rfc-editor.org/rfc/rfc6851]].
2607
2660
  #
2608
2661
  # If +UIDPLUS+ [RFC4315[https://www.rfc-editor.org/rfc/rfc4315.html]] is
2609
2662
  # supported, the server's response should include a +COPYUID+ response code
@@ -2611,6 +2664,8 @@ module Net
2611
2664
  # mailbox, the UID set of the source messages, and the assigned UID set of
2612
2665
  # the moved messages.
2613
2666
  #
2667
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled, the
2668
+ # +MOVE+ command is prohibited. Use #uid_move instead.
2614
2669
  def move(set, mailbox)
2615
2670
  copy_internal("MOVE", set, mailbox)
2616
2671
  end
@@ -2626,9 +2681,13 @@ module Net
2626
2681
  #
2627
2682
  # ==== Capabilities
2628
2683
  #
2629
- # Same as #move: The server's capabilities must include +MOVE+
2630
- # [RFC6851[https://tools.ietf.org/html/rfc6851]]. +UIDPLUS+ also affects
2631
- # #uid_move the same way it affects #move.
2684
+ # The server's capabilities must include either +IMAP4rev2+ or +MOVE+
2685
+ # [RFC6851[https://www.rfc-editor.org/rfc/rfc6851]].
2686
+ #
2687
+ # When UIDONLY[https://www.rfc-editor.org/rfc/rfc9586.html] is enabled,
2688
+ # #uid_move must be used instead of #move.
2689
+ #
2690
+ # Otherwise, #uid_move is updated by extensions in the same way as #move.
2632
2691
  def uid_move(set, mailbox)
2633
2692
  copy_internal("UID MOVE", set, mailbox)
2634
2693
  end
@@ -2654,7 +2713,7 @@ module Net
2654
2713
  # ==== Capabilities
2655
2714
  #
2656
2715
  # The server's capabilities must include +SORT+
2657
- # [RFC5256[https://tools.ietf.org/html/rfc5256]].
2716
+ # [RFC5256[https://www.rfc-editor.org/rfc/rfc5256]].
2658
2717
  def sort(sort_keys, search_keys, charset)
2659
2718
  return sort_internal("SORT", sort_keys, search_keys, charset)
2660
2719
  end
@@ -2669,7 +2728,7 @@ module Net
2669
2728
  # ==== Capabilities
2670
2729
  #
2671
2730
  # The server's capabilities must include +SORT+
2672
- # [RFC5256[https://tools.ietf.org/html/rfc5256]].
2731
+ # [RFC5256[https://www.rfc-editor.org/rfc/rfc5256]].
2673
2732
  def uid_sort(sort_keys, search_keys, charset)
2674
2733
  return sort_internal("UID SORT", sort_keys, search_keys, charset)
2675
2734
  end
@@ -2694,7 +2753,7 @@ module Net
2694
2753
  # ==== Capabilities
2695
2754
  #
2696
2755
  # The server's capabilities must include +THREAD+
2697
- # [RFC5256[https://tools.ietf.org/html/rfc5256]].
2756
+ # [RFC5256[https://www.rfc-editor.org/rfc/rfc5256]].
2698
2757
  def thread(algorithm, search_keys, charset)
2699
2758
  return thread_internal("THREAD", algorithm, search_keys, charset)
2700
2759
  end
@@ -2708,7 +2767,7 @@ module Net
2708
2767
  # ==== Capabilities
2709
2768
  #
2710
2769
  # The server's capabilities must include +THREAD+
2711
- # [RFC5256[https://tools.ietf.org/html/rfc5256]].
2770
+ # [RFC5256[https://www.rfc-editor.org/rfc/rfc5256]].
2712
2771
  def uid_thread(algorithm, search_keys, charset)
2713
2772
  return thread_internal("UID THREAD", algorithm, search_keys, charset)
2714
2773
  end
@@ -2727,8 +2786,8 @@ module Net
2727
2786
  # ==== Capabilities
2728
2787
  #
2729
2788
  # The server's capabilities must include
2730
- # +ENABLE+ [RFC5161[https://tools.ietf.org/html/rfc5161]]
2731
- # or +IMAP4REV2+ [RFC9051[https://tools.ietf.org/html/rfc9051]].
2789
+ # +ENABLE+ [RFC5161[https://www.rfc-editor.org/rfc/rfc5161]]
2790
+ # or +IMAP4REV2+ [RFC9051[https://www.rfc-editor.org/rfc/rfc9051]].
2732
2791
  #
2733
2792
  # Additionally, the server capabilities must include a capability matching
2734
2793
  # each enabled extension (usually the same name as the enabled extension).
@@ -2747,7 +2806,7 @@ module Net
2747
2806
  # <tt>"UTF8=ACCEPT"</tt> or <tt>"IMAP4rev2"</tt>, depending on server
2748
2807
  # capabilities.
2749
2808
  #
2750
- # [<tt>"UTF8=ACCEPT"</tt> [RFC6855[https://tools.ietf.org/html/rfc6855]]]
2809
+ # [<tt>"UTF8=ACCEPT"</tt> [RFC6855[https://www.rfc-editor.org/rfc/rfc6855]]]
2751
2810
  #
2752
2811
  # The server's capabilities must include <tt>UTF8=ACCEPT</tt> _or_
2753
2812
  # <tt>UTF8=ONLY</tt>.
@@ -2766,13 +2825,23 @@ module Net
2766
2825
  # encoding, even if they generally contain UTF-8 data, if they are
2767
2826
  # text at all.
2768
2827
  #
2769
- # [<tt>"UTF8=ONLY"</tt> [RFC6855[https://tools.ietf.org/html/rfc6855]]]
2828
+ # [<tt>"UTF8=ONLY"</tt> [RFC6855[https://www.rfc-editor.org/rfc/rfc6855]]]
2770
2829
  #
2771
2830
  # A server that reports the <tt>UTF8=ONLY</tt> capability _requires_ that
2772
2831
  # the client <tt>enable("UTF8=ACCEPT")</tt> before any mailboxes may be
2773
2832
  # selected. For convenience, <tt>enable("UTF8=ONLY")</tt> is aliased to
2774
2833
  # <tt>enable("UTF8=ACCEPT")</tt>.
2775
2834
  #
2835
+ # [+UIDONLY+ {[RFC9586]}[https://www.rfc-editor.org/rfc/rfc9586.pdf]]
2836
+ #
2837
+ # When UIDONLY is enabled, the #fetch, #store, #search, #copy, and #move
2838
+ # commands are prohibited and result in a tagged BAD response. Clients
2839
+ # should instead use uid_fetch, uid_store, uid_search, uid_copy, or
2840
+ # uid_move, respectively. All +FETCH+ responses that would be returned are
2841
+ # replaced by +UIDFETCH+ responses. All +EXPUNGED+ responses that would be
2842
+ # returned are replaced by +VANISHED+ responses. The "<sequence set>"
2843
+ # uid_search criterion is prohibited.
2844
+ #
2776
2845
  # ===== Unsupported capabilities
2777
2846
  #
2778
2847
  # *Note:* Some extensions that use ENABLE permit the server to send syntax
@@ -2828,8 +2897,8 @@ module Net
2828
2897
  #
2829
2898
  # ==== Capabilities
2830
2899
  #
2831
- # The server's capabilities must include +IDLE+
2832
- # [RFC2177[https://tools.ietf.org/html/rfc2177]].
2900
+ # The server's capabilities must include either +IMAP4rev2+ or +IDLE+
2901
+ # [RFC2177[https://www.rfc-editor.org/rfc/rfc2177]].
2833
2902
  def idle(timeout = nil, &response_handler)
2834
2903
  raise LocalJumpError, "no block given" unless response_handler
2835
2904
 
@@ -3458,15 +3527,9 @@ module Net
3458
3527
  }
3459
3528
  end
3460
3529
 
3461
- synchronize do
3462
- clear_responses("FETCH")
3463
- if mod
3464
- send_command(cmd, set, attr, mod)
3465
- else
3466
- send_command(cmd, set, attr)
3467
- end
3468
- clear_responses("FETCH")
3469
- end
3530
+ args = [cmd, set, attr]
3531
+ args << mod if mod
3532
+ send_command_returning_fetch_results(*args)
3470
3533
  end
3471
3534
 
3472
3535
  def store_internal(cmd, set, attr, flags, unchangedsince: nil)
@@ -3474,10 +3537,17 @@ module Net
3474
3537
  args = [SequenceSet.new(set)]
3475
3538
  args << ["UNCHANGEDSINCE", Integer(unchangedsince)] if unchangedsince
3476
3539
  args << attr << flags
3540
+ send_command_returning_fetch_results(cmd, *args)
3541
+ end
3542
+
3543
+ def send_command_returning_fetch_results(...)
3477
3544
  synchronize do
3478
3545
  clear_responses("FETCH")
3479
- send_command(cmd, *args)
3480
- clear_responses("FETCH")
3546
+ clear_responses("UIDFETCH")
3547
+ send_command(...)
3548
+ fetches = clear_responses("FETCH")
3549
+ uidfetches = clear_responses("UIDFETCH")
3550
+ uidfetches.any? ? uidfetches : fetches
3481
3551
  end
3482
3552
  end
3483
3553