Provided by: python3-imapclient_3.0.1-2_all bug

NAME

       imapclient - IMAPClient Documentation

       Author Menno Finlay-Smits

       Version
              3.0.1

       Date   Jul 01, 2024

       Homepage
              http://imapclient.freshfoo.com

       Download
              http://pypi.python.org/pypi/IMAPClient/

       Source code
              https://github.com/mjs/imapclient

       Documentation
              http://imapclient.readthedocs.io/

       License
              New BSD License

       Forum/Support
              https://github.com/mjs/imapclient/discussions

INTRODUCTION

       IMAPClient is an easy-to-use, Pythonic and complete IMAP client library.

       Although  IMAPClient actually uses the imaplib module from the Python standard library under the hood, it
       provides a different API. Instead of requiring that the caller performs extra parsing work, return values
       are full parsed, readily usable and use sensible Python types. Exceptions are raised when problems  occur
       (no error checking of return values is required).

       IMAPClient  is  straightforward  to use, but it can be useful to have at least a general understanding of
       the IMAP protocol. RFC 3501 explains IMAP in detail. Other RFCs also apply to various extensions  to  the
       base protocol. These are referred to in the documentation below where relevant.

       Python versions 3.4 through 3.9 are officially supported.

GETTING STARTED

       Install IMAPClient:

          $ pip install imapclient

       See Installation for more details.

       The core of the IMAPClient API is the IMAPClient class. Instantiating this class, creates a connection to
       an IMAP account. Calling methods on the IMAPClient instance interacts with the server.

       The  following  example  shows  a  simple  interaction  with an IMAP server.  It displays the message ID,
       subject and date of the message for all messages in the INBOX folder.

          >>> from imapclient import IMAPClient
          >>> server = IMAPClient('imap.mailserver.com', use_uid=True)
          >>> server.login('someuser', 'somepassword')
          b'[CAPABILITY IMAP4rev1 LITERAL+ SASL-IR [...] LIST-STATUS QUOTA] Logged in'

          >>> select_info = server.select_folder('INBOX')
          >>> print('%d messages in INBOX' % select_info[b'EXISTS'])
          34 messages in INBOX

          >>> messages = server.search(['FROM', 'best-friend@domain.com'])
          >>> print("%d messages from our best friend" % len(messages))
          5 messages from our best friend

          >>> for msgid, data in server.fetch(messages, ['ENVELOPE']).items():
          >>>     envelope = data[b'ENVELOPE']
          >>>     print('ID #%d: "%s" received %s' % (msgid, envelope.subject.decode(), envelope.date))
          ID #62: "Our holidays photos" received 2017-07-20 21:47:42
          ID #55: "Re: did you book the hotel?" received 2017-06-26 10:38:09
          ID #53: "Re: did you book the hotel?" received 2017-06-25 22:02:58
          ID #44: "See that fun article about lobsters in Pacific ocean!" received 2017-06-09 09:49:47
          ID #46: "Planning for our next vacations" received 2017-05-12 10:29:30

          >>> server.logout()
          b'Logging out'

USER GUIDE

       This section describes how IMAPClient works and gives some examples to help you start.

   Installation
   Pip
       IMAPClient can easily be installed with pip:

          $ pip install imapclient

   From Source
       IMAPClient is developed on GitHub, you can find the code at mjs/imapclient.

       You can clone the public repository:

          $ git clone https://github.com/mjs/imapclient.git

       Once you have the sources, simply install IMAPClient with:

          $ cd imapclient
          $ pip install -e .

   Other versions
       The     source     distributions     of     all     IMAPClient     versions     are     available      at
       http://menno.io/projects/IMAPClient/.    Alternatively    you   can   also   use   the   PyPI   page   at
       https://pypi.python.org/pypi/IMAPClient/.

   IMAPClient Concepts
   Message Identifiers
       In the IMAP protocol, messages are identified using an integer. These message ids are specific to a given
       folder.

       There are two types of message identifiers in the IMAP protocol.

       One type is the message sequence number where the messages in a folder are numbered from 1 to N  where  N
       is  the  number  of  messages  in  the  folder.  These  numbers don't persist between sessions and may be
       reassigned after some operations such as an expunge.

       A more convenient approach is Unique Identifiers (UIDs). Unique Identifiers are integers assigned to each
       message by the IMAP server that will persist across  sessions.  They  do  not  change  when  folders  are
       expunged. Almost all IMAP servers support UIDs.

       Each call to the IMAP server can use either message sequence numbers or UIDs in the command arguments and
       return  values.  The  client specifies to the server which type of identifier should be used. You can set
       whether IMAPClient should use UIDs or message sequence number via the use_uid  argument  passed  when  an
       IMAPClient instance is created and the use_uid attribute. The use_uid attribute can be used to change the
       message id type between calls to the server. IMAPClient uses UIDs by default.

       Any  method  that  accepts message ids takes either a sequence containing message ids (eg. [1,2,3]), or a
       single message id integer, or a string representing sets and ranges of messages as supported by the  IMAP
       protocol (e.g. '50-65', '2:*' or '2,4:7,9,12:*').

   Message Flags
       An  IMAP  server  keeps  zero  or  more  flags for each message. These indicate certain properties of the
       message or can be used by IMAP clients to keep track of data related to a message.

       The IMAPClient package has constants for a number of commmonly used flags:

          DELETED = br'\Deleted'
          SEEN = br'\Seen'
          ANSWERED = br'\Answered'
          FLAGGED = br'\Flagged'
          DRAFT = br'\Draft'
          RECENT = br'\Recent'         # This flag is read-only

       Any method that accepts message flags takes either a sequence containing  message  flags  (eg.  [DELETED,
       'foo', 'Bar']) or a single message flag (eg.  'Foo').

   Folder Name Encoding
       Any  method  that  takes a folder name will accept a standard string or a unicode string. Unicode strings
       will be transparently encoded using modified UTF-7 as specified by RFC 3501#section-5.1.3.   This  allows
       for arbitrary unicode characters (eg. non-English characters) to be used in folder names.

       The  ampersand character ("&") has special meaning in IMAP folder names. IMAPClient automatically escapes
       and unescapes this character so that the caller doesn't have to.

       Automatic folder name encoding and decoding can be enabled or disabled with the folder_encode  attribute.
       It defaults to True.

       If folder_encode is True, all folder names returned by IMAPClient are always returned as unicode strings.
       If folder_encode is False, folder names are returned as str (Python 2) or bytes (Python 3).

   Working With Fetched Messages
       The  IMAP  protocol gives access to a limited amount of information about emails stored on the server. In
       depth analysis of a message usually requires downloading the full message and parsing its content.

       The email package of the Python standard library provides a reliable way to transform a raw email into  a
       convenient object.

          # Download unread emails and parse them into standard EmailMessage objects
          import email

          from imapclient import IMAPClient

          HOST = "imap.host.com"
          USERNAME = "someuser"
          PASSWORD = "secret"

          with IMAPClient(HOST) as server:
              server.login(USERNAME, PASSWORD)
              server.select_folder("INBOX", readonly=True)

              messages = server.search("UNSEEN")
              for uid, message_data in server.fetch(messages, "RFC822").items():
                  email_message = email.message_from_bytes(message_data[b"RFC822"])
                  print(uid, email_message.get("From"), email_message.get("Subject"))

   TLS/SSL
       IMAPClient  uses  sensible  TLS  parameter  defaults for encrypted connections and also allows for a high
       level of control of TLS parameters if required. It uses the built-in ssl package, provided  since  Python
       2.7.9 and 3.4.

       TLS parameters are controlled by passing a ssl.SSLContext when creating an IMAPClient instance (or to the
       starttls method when the STARTTLS is used). When ssl=True is used without passing a SSLContext, a default
       context  is used. The default context avoids the use of known insecure ciphers and SSL protocol versions,
       with certificate verification and hostname verification turned on. The default context  will  use  system
       installed certificate authority trust chains, if available.

       When  constructing  a custom context it is usually best to start with the default context, created by the
       ssl module, and modify it to suit your needs.

       The following example shows how to to disable certification verification and certificate host name checks
       if required.

          # Establish an encrypted connection to a server without checking its
          # certificate. This setup is insecure, DO NOT USE to connect to servers
          # over the Internet.

          import ssl

          from imapclient import IMAPClient

          HOST = "imap.host.com"
          USERNAME = "someuser"
          PASSWORD = "secret"

          ssl_context = ssl.create_default_context()

          # don't check if certificate hostname doesn't match target hostname
          ssl_context.check_hostname = False

          # don't check if the certificate is trusted by a certificate authority
          ssl_context.verify_mode = ssl.CERT_NONE

          with IMAPClient(HOST, ssl_context=ssl_context) as server:
              server.login(USERNAME, PASSWORD)
              # ...do something...

       The next example shows how to create a context that will use custom CA certificate. This is  required  to
       perform verification of a self-signed certificate used by the IMAP server.

          # Establish a secure connection to a server that does not have a certificate
          # signed by a trusted certificate authority (CA).

          import ssl

          from imapclient import IMAPClient

          HOST = "imap.host.com"
          USERNAME = "someuser"
          PASSWORD = "secret"

          ssl_context = ssl.create_default_context(cafile="/path/to/cacert.pem")

          with IMAPClient(HOST, ssl_context=ssl_context) as server:
              server.login(USERNAME, PASSWORD)
              # ...do something...

       If  your  operating system comes with an outdated list of CA certificates you can use the certifi package
       that provides an up-to-date set of trusted CAs:

          import certifi

          ssl_context = ssl.create_default_context(cafile=certifi.where())

       If the server supports it, you can also authenticate using a client certificate:

          import ssl

          ssl_context = ssl.create_default_context()
          ssl_context.load_cert_chain("/path/to/client_certificate.crt")

       The above examples show some of the most common TLS parameter customisations but  there  are  many  other
       tweaks are possible. Consult the Python 3 ssl package documentation for further options.

   Logging
       IMAPClient logs debug lines using the standard Python logging module. Its logger prefix is imapclient..

       One way to see debug messages from IMAPClient is to set up logging like this:

          import logging

          logging.basicConfig(
              format='%(asctime)s - %(levelname)s: %(message)s',
              level=logging.DEBUG
          )

       For advanced usage, please refer to the documentation logging module.

   Advanced Usage
       This document covers some more advanced features and tips for handling specific usages.

   Cleaning Up Connections
       To  communicate  with the server, IMAPClient establishes a TCP connection. It is important for long-lived
       processes to always close connections at some point to avoid leaking memory and file descriptors. This is
       usually done with the logout method:

          import imapclient

          c = imapclient.IMAPClient(host="imap.foo.org")
          c.login("bar@foo.org", "passwd")
          c.select_folder("INBOX")
          c.logout()

       However if an error is raised when selecting the folder, the connection may be left open.

       IMAPClient may be used as a context manager that automatically  closes  connections  when  they  are  not
       needed any more:

          import imapclient

          with imapclient.IMAPClient(host="imap.foo.org") as c:
              c.login("bar@foo.org", "passwd")
              c.select_folder("INBOX")

   Watching a Mailbox Using IDLE
       The  IDLE  extension allows an IMAP server to notify a client when something changes in a mailbox. It can
       be used as an alternative to polling to receive new messages.

       The concept is simple: the client connects to the server, selects a mailbox and enters the IDLE mode.  At
       this  point  the  server sends notifications whenever something happens in the selected mailbox until the
       client ends the IDLE mode by issuing a DONE command. This is explained in RFC 2177.

          # Open a connection in IDLE mode and wait for notifications from the
          # server.

          from imapclient import IMAPClient

          HOST = "imap.host.com"
          USERNAME = "someuser"
          PASSWORD = "password"

          server = IMAPClient(HOST)
          server.login(USERNAME, PASSWORD)
          server.select_folder("INBOX")

          # Start IDLE mode
          server.idle()
          print("Connection is now in IDLE mode, send yourself an email or quit with ^c")

          while True:
              try:
                  # Wait for up to 30 seconds for an IDLE response
                  responses = server.idle_check(timeout=30)
                  print("Server sent:", responses if responses else "nothing")
              except KeyboardInterrupt:
                  break

          server.idle_done()
          print("\nIDLE mode done")
          server.logout()

       Note that IMAPClient does not handle low-level socket errors that can happen when maintaining  long-lived
       TCP  connections.  Users  are  advised to renew the IDLE command every 10 minutes to avoid the connection
       from being abruptly closed.

   Interactive Sessions
       When developing program using IMAPClient is it sometimes useful to have  an  interactive  shell  to  play
       with.  IMAPClient  ships  with  a  module  that  lets you fire up an interactive shell with an IMAPClient
       instance connected to an IMAP server.

       Start a session like this:

          python -m imapclient.interact -H <host> -u <user> ...

       Various options are available to specify the IMAP server details. See the help (--help) for more details.
       You'll be prompted for a username and password if one isn't provided on the command line.

       It is also possible to pass connection details as a configuration file like this:

          python -m imapclient.interact -f <config file>

       See below for details of the configuration file format.

       If installed, IPython will be used as the embedded shell. Otherwise the basic built-in Python shell  will
       be used.

       The connected IMAPClient instance is available as the variable "c". Here's an example session:

          $ python -m imapclient.interact -H <host> -u <user> ...
          Connecting...
          Connected.

          IMAPClient instance is "c"
          In [1]: c.select_folder('inbox')
          Out[1]:
          {b'EXISTS': 2,
           b'FLAGS': (b'\\Answered',
               b'\\Flagged',
               b'\\Deleted',
               b'\\Seen',
               b'\\Draft'),
           b'PERMANENTFLAGS': (b'\\Answered',
               b'\\Flagged',
               b'\\Deleted',
               b'\\Seen',
               b'\\Draft'),
           b'READ-WRITE': True,
           b'RECENT': 0,
           b'UIDNEXT': 1339,
           b'UIDVALIDITY': 1239278212}

          In [2]: c.search()
          Out[2]: [1123, 1233]

          In [3]: c.logout()
          Out[3]: b'Logging out'

   Configuration File Format
       Both the IMAPClient interactive shell and the live tests take configuration files which specify how to to
       connect to an IMAP server. The configuration file format is the same for both.

       Configuration  files  use  the  INI format and must always have a section called DEFAULT. Here's a simple
       example:

          [DEFAULT]
          host = imap.mailserver.com
          username = bob
          password = sekret
          ssl = True

       The supported options are:
                           ┌──────────────────────┬────────┬──────────────────────────────┐
                           │ Name                 │ Type   │ Description                  │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ host                 │ string │ IMAP hostname to connect to. │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ username             │ string │ The username to authenticate │
                           │                      │        │ as.                          │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ password             │ string │ The  password  to  use  with │
                           │                      │        │ username.                    │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ port                 │ int    │ Server  port  to connect to. │
                           │                      │        │ Defaults to 143  unless  ssl │
                           │                      │        │ is True.                     │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ ssl                  │ bool   │ Use SSL/TLS to connect.      │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ starttls             │ bool   │ Use STARTTLS to connect.     │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ ssl_check_hostname   │ bool   │ If  true  and SSL is in use, │
                           │                      │        │ check    that    certificate │
                           │                      │        │ matches     the     hostname │
                           │                      │        │ (defaults to true)           │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ ssl_verify_cert      │ bool   │ If true and SSL is  in  use, │
                           │                      │        │ check  that  the certificate │
                           │                      │        │ is valid (defaults to true). │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ ssl_ca_file          │ string │ If SSL is true, use this  to │
                           │                      │        │ specify          certificate │
                           │                      │        │ authority certs to  validate │
                           │                      │        │ with.                        │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ timeout              │ int    │ Time   out   I/O  operations │
                           │                      │        │ after this many seconds.     │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ oauth2               │ bool   │ If  true,  use   OAUTH2   to │
                           │                      │        │ authenticate  (username  and │
                           │                      │        │ password are ignored).       │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ oauth2_client_id     │ string │ OAUTH2 client id.            │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ oauth2_client_secret │ string │ OAUTH2 client secret.        │
                           ├──────────────────────┼────────┼──────────────────────────────┤
                           │ oauth2_refresh_token │ string │ OAUTH2 token for  refreshing │
                           │                      │        │ the secret.                  │
                           └──────────────────────┴────────┴──────────────────────────────┘

       Acceptable  boolean values are "1", "yes", "true", and "on", for true; and "0", "no", "false", and "off",
       for false.

API REFERENCE

       This section describes public functions and classes of IMAPClient library.

   IMAPClient Class
       The primary class used by the imapclient package is the IMAPClient class. All interaction with  a  remote
       IMAP server is performed via an IMAPClient instance.

       class imapclient.IMAPClient(host: str, port: int = None, use_uid: bool = True, ssl: bool = True, stream:
       bool = False, ssl_context: SSLContext | None = None, timeout: float | None = None)
              A connection to the IMAP server specified by host is made when this class is instantiated.

              port defaults to 993, or 143 if ssl is False.

              If  use_uid is True unique message UIDs be used for all calls that accept message ids (defaults to
              True).

              If ssl is True (the default) a secure connection will be made.  Otherwise an  insecure  connection
              over plain text will be established.

              If ssl is True the optional ssl_context argument can be used to provide an ssl.SSLContext instance
              used  to control SSL/TLS connection parameters. If this is not provided a sensible default context
              will be used.

              If stream is True then host is used as the command to run to establish a connection  to  the  IMAP
              server (defaults to False). This is useful for exotic connection or authentication setups.

              Use  timeout  to specify a timeout for the socket connected to the IMAP server. The timeout can be
              either a float number, or an instance of imapclient.SocketTimeout.

              • If a single float number  is  passed,  the  same  timeout  delay  applies  during  the   initial
                connection to the server and for all future socket reads and writes.

              • In  case  of  a  SocketTimeout,  connection  timeout and read/write operations can have distinct
                timeouts.

              • The default is None, where no timeout is used.

              The normalise_times attribute specifies whether datetimes returned by fetch()  are  normalised  to
              the  local system time and include no timezone information (native), or are datetimes that include
              timezone information (aware). By default normalise_times is True  (times  are  normalised  to  the
              local system time). This attribute can be changed between fetch() calls if required.

              Can be used as a context manager to automatically close opened connections:

              >>> with IMAPClient(host="imap.foo.org") as client:
              ...     client.login("bar@foo.org", "passwd")

              AbortError
                     alias of abort

              Error  alias of error

              ReadOnlyError
                     alias of readonly

              add_flags(messages, flags, silent=False)
                     Add flags to messages in the currently selected folder.

                     flags should be a sequence of strings.

                     Returns the flags set for each modified message (see get_flags), or None if silent is true.

              add_gmail_labels(messages, labels, silent=False)
                     Add labels to messages in the currently selected folder.

                     labels should be a sequence of strings.

                     Returns  the  label set for each modified message (see get_gmail_labels), or None if silent
                     is true.

                     This only works with IMAP servers that support the X-GM-LABELS attribute (eg. Gmail).

              append(folder, msg, flags=(), msg_time=None)
                     Append a message to folder.

                     msg should be a string contains the full message including headers.

                     flags should be a sequence of message flags to set. If not specified no flags will be set.

                     msg_time is an optional datetime instance specifying the  date  and  time  to  set  on  the
                     message.  The  server  will set a time if it isn't specified. If msg_time contains timezone
                     information (tzinfo), this will be honoured. Otherwise the local machine's time  zone  sent
                     to the server.

                     Returns the APPEND response as returned by the server.

              capabilities()
                     Returns the server capability list.

                     If the session is authenticated and the server has returned an untagged CAPABILITY response
                     at  authentication  time, this response will be returned. Otherwise, the CAPABILITY command
                     will be issued to the server, with the results cached for future calls.

                     If the session is not yet authenticated, the capabilities requested at connection time will
                     be returned.

              close_folder()
                     Close the currently selected folder, returning the server response string.

              copy(messages, folder)
                     Copy one or more messages from the current folder to  folder.  Returns  the  COPY  response
                     string returned by the server.

              create_folder(folder)
                     Create folder on the server returning the server response string.

              delete_folder(folder)
                     Delete folder on the server returning the server response string.

              delete_messages(messages, silent=False)
                     Delete one or more messages from the currently selected folder.

                     Returns the flags set for each modified message (see get_flags).

              enable(*capabilities)
                     Activate one or more server side capability extensions.

                     Most  capabilities  do  not  need to be enabled. This is only required for extensions which
                     introduce backwards incompatible behaviour. Two capabilities which may require  enable  are
                     CONDSTORE and UTF8=ACCEPT.

                     A  list  of  the  requested  extensions  that  were  successfully  enabled on the server is
                     returned.

                     Once enabled each extension remains active until the IMAP connection is closed.

                     See RFC 5161 for more details.

              expunge(messages=None)
                     Use of the messages argument is discouraged.  Please see the uid_expunge method instead.

                     When, no messages are specified, remove all messages from  the  currently  selected  folder
                     that have the \Deleted flag set.

                     The  return  value  is the server response message followed by a list of expunge responses.
                     For example:

                        ('Expunge completed.',
                         [(2, 'EXPUNGE'),
                          (1, 'EXPUNGE'),
                          (0, 'RECENT')])

                     In this case, the responses indicate that the message with sequence numbers 2 and  1  where
                     deleted, leaving no recent messages in the folder.

                     See  RFC 3501#section-6.4.3 section 6.4.3 and RFC 3501#section-7.4.1 section 7.4.1 for more
                     details.

                     When messages are specified, remove  the  specified  messages  from  the  selected  folder,
                     provided  those  messages also have the \Deleted flag set. The return value is None in this
                     case.

                     Expunging messages by id(s) requires that use_uid is True for the client.

                     See RFC 4315#section-2.1 section 2.1 for more details.

              fetch(messages, data, modifiers=None)
                     Retrieve selected data associated with one or  more  messages  in  the  currently  selected
                     folder.

                     data  should be specified as a sequence of strings, one item per data selector, for example
                     ['INTERNALDATE', 'RFC822'].

                     modifiers are required for some extensions to the  IMAP  protocol  (eg.  RFC  4551).  These
                     should be a sequence of strings if specified, for example ['CHANGEDSINCE 123'].

                     A dictionary is returned, indexed by message number. Each item in this dictionary is also a
                     dictionary,  with  an  entry  corresponding  to  each item in data. Returned values will be
                     appropriately typed. For example, integer values  will  be  returned  as  Python  integers,
                     timestamps  will  be returned as datetime instances and ENVELOPE responses will be returned
                     as Envelope instances.

                     String data will generally be returned as bytes (Python 3) or str (Python 2).

                     In addition to an element for each data item, the  dict  returned  for  each  message  also
                     contains  a SEQ key containing the sequence number for the message. This allows for mapping
                     between the UID and sequence number (when the use_uid property is True).

                     Example:

                        >> c.fetch([3293, 3230], ['INTERNALDATE', 'FLAGS'])
                        {3230: {b'FLAGS': (b'\Seen',),
                                b'INTERNALDATE': datetime.datetime(2011, 1, 30, 13, 32, 9),
                                b'SEQ': 84},
                         3293: {b'FLAGS': (),
                                b'INTERNALDATE': datetime.datetime(2011, 2, 24, 19, 30, 36),
                                b'SEQ': 110}}

              find_special_folder(folder_flag)
                     Try to locate a special folder, like the Sent or Trash folder.

                     >>> server.find_special_folder(imapclient.SENT)
                     'INBOX.Sent'

                     This function tries its best to find the correct folder (if any) but uses  heuristics  when
                     the server is unable to precisely tell where special folders are located.

                     Returns the name of the folder if found, or None otherwise.

              folder_exists(folder)
                     Return True if folder exists on the server.

              folder_status(folder, what=None)
                     Return the status of folder.

                     what should be a sequence of status items to query. This defaults to ('MESSAGES', 'RECENT',
                     'UIDNEXT', 'UIDVALIDITY', 'UNSEEN').

                     Returns a dictionary of the status items for the folder with keys matching what.

              get_flags(messages)
                     Return the flags set for each message in messages from the currently selected folder.

                     The return value is a dictionary structured like this: { msgid1: (flag1, flag2, ... ), }.

              get_gmail_labels(messages)
                     Return the label set for each message in messages in the currently selected folder.

                     The return value is a dictionary structured like this: { msgid1: (label1, label2, ... ), }.

                     This only works with IMAP servers that support the X-GM-LABELS attribute (eg. Gmail).

              get_quota(mailbox='INBOX')
                     Get the quotas associated with a mailbox.

                     Returns a list of Quota objects.

              get_quota_root(mailbox)
                     Get the quota roots for a mailbox.

                     The  IMAP server responds with the quota root and the quotas associated so there is usually
                     no need to call get_quota after.

                     See RFC 2087 for more details.

                     Return a tuple of MailboxQuotaRoots and list of Quota associated

              getacl(folder)
                     Returns a list of (who, acl) tuples describing the access controls for folder.

              gmail_search(query, charset='UTF-8')
                     Search using Gmail's X-GM-RAW attribute.

                     query should be a valid Gmail search query string. For example:  has:attachment  in:unread.
                     The  search  string  may  be  unicode  and  will  be  encoded  using  the specified charset
                     (defaulting to UTF-8).

                     This method only works for IMAP servers that support X-GM-RAW, which is only likely  to  be
                     Gmail.

                     See
                     https://developers.google.com/gmail/imap_extensions#extension_of_the_search_command_x-gm-raw
                     for more info.

              has_capability(capability)
                     Return True if the IMAP server has the given capability.

              id_(parameters=None)
                     Issue the ID command, returning a dict of server implementation fields.

                     parameters  should be specified as a dictionary of field/value pairs, for example: {"name":
                     "IMAPClient", "version": "0.12"}

              idle() Put the server into IDLE mode.

                     In this mode the server will return unsolicited responses about  changes  to  the  selected
                     mailbox.  This  method returns immediately. Use idle_check() to look for IDLE responses and
                     idle_done() to stop IDLE mode.

                     NOTE:
                        Any other commands issued while the server is in IDLE mode will fail.

                     See RFC 2177 for more information about the IDLE extension.

              idle_check(timeout=None)
                     Check for any IDLE responses sent by the server.

                     This method should only be called if the server is in IDLE mode (see idle()).

                     By default, this method will block until an  IDLE  response  is  received.  If  timeout  is
                     provided,  the  call  will  block  for  at most this many seconds while waiting for an IDLE
                     response.

                     The return value is a list of received IDLE responses. These will  be  parsed  with  values
                     converted to appropriate types. For example:

                        [(b'OK', b'Still here'),
                         (1, b'EXISTS'),
                         (1, b'FETCH', (b'FLAGS', (b'\NotJunk',)))]

              idle_done()
                     Take the server out of IDLE mode.

                     This method should only be called if the server is already in IDLE mode.

                     The  return  value  is of the form (command_text, idle_responses) where command_text is the
                     text sent by the server when  the  IDLE  command  finished  (eg.  b'Idle  terminated')  and
                     idle_responses  is  a  list  of  parsed  idle  responses  received  since  the last call to
                     idle_check() (if any). These are returned in parsed form as per idle_check().

              list_folders(directory='', pattern='*')
                     Get a listing of folders on the server as a list of (flags, delimiter, name) tuples.

                     Specifying directory will limit returned folders to the given base directory. The directory
                     and any child directories will returned.

                     Specifying pattern will limit returned folders to those with matching names. The  wildcards
                     are  supported  in pattern. * matches zero or more of any character and % matches 0 or more
                     characters except the folder delimiter.

                     Calling list_folders with no arguments will recursively list all folders available for  the
                     logged in user.

                     Folder  names  are  always  returned  as  unicode strings, and decoded from modified UTF-7,
                     except if folder_decode is not set.

              list_sub_folders(directory='', pattern='*')
                     Return a list of subscribed folders on the server as (flags, delimiter, name) tuples.

                     The default behaviour will list all subscribed folders. The directory and pattern arguments
                     are as per list_folders().

              login(username: str, password: str)
                     Login using username and password, returning the server response.

              logout()
                     Logout, returning the server response.

              move(messages, folder)
                     Atomically move messages to another folder.

                     Requires the MOVE capability, see RFC 6851.

                     Parametersmessages -- List of message UIDs to move.

                            • folder -- The destination folder name.

              multiappend(folder, msgs)
                     Append messages to folder using the MULTIAPPEND feature from RFC 3502.

                     msgs must be an iterable. Each item must be either a string  containing  the  full  message
                     including  headers,  or  a  dict containing the keys "msg" with the full message as before,
                     "flags" with a sequence of message flags to  set,  and  "date"  with  a  datetime  instance
                     specifying the internal date to set.  The keys "flags" and "date" are optional.

                     Returns the APPEND response from the server.

              namespace()
                     Return the namespace for the account as a (personal, other, shared) tuple.

                     Each  element  may  be  None if no namespace of that type exists, or a sequence of (prefix,
                     separator) pairs.

                     For convenience the tuple elements may be accessed positionally or using  attributes  named
                     personal, other and shared.

                     See RFC 2342 for more details.

              noop() Execute the NOOP command.

                     This  command returns immediately, returning any server side status updates. It can also be
                     used to reset any auto-logout timers.

                     The return value is the server command response  message  followed  by  a  list  of  status
                     responses. For example:

                        (b'NOOP completed.',
                         [(4, b'EXISTS'),
                          (3, b'FETCH', (b'FLAGS', (b'bar', b'sne'))),
                          (6, b'FETCH', (b'FLAGS', (b'sne',)))])

              oauth2_login(user: str, access_token: str, mech: str = 'XOAUTH2', vendor: str | None = None)
                     Authenticate using the OAUTH2 or XOAUTH2 methods.

                     Gmail  and  Yahoo  both  support  the  'XOAUTH2' mechanism, but Yahoo requires the 'vendor'
                     portion in the payload.

              oauthbearer_login(identity, access_token)
                     Authenticate using the OAUTHBEARER method.

                     This is supported by Gmail  and  is  meant  to  supersede  the  non-standard  'OAUTH2'  and
                     'XOAUTH2' mechanisms.

              plain_login(identity, password, authorization_identity=None)
                     Authenticate using the PLAIN method (requires server support).

              remove_flags(messages, flags, silent=False)
                     Remove one or more flags from messages in the currently selected folder.

                     flags should be a sequence of strings.

                     Returns the flags set for each modified message (see get_flags), or None if silent is true.

              remove_gmail_labels(messages, labels, silent=False)
                     Remove one or more labels from messages in the currently selected folder, or None if silent
                     is true.

                     labels should be a sequence of strings.

                     Returns the label set for each modified message (see get_gmail_labels).

                     This only works with IMAP servers that support the X-GM-LABELS attribute (eg. Gmail).

              rename_folder(old_name, new_name)
                     Change the name of a folder on the server.

              sasl_login(mech_name, mech_callable)
                     Authenticate using a provided SASL mechanism (requires server support).

                     The  mech_callable  will  be  called with one parameter (the server challenge as bytes) and
                     must return the corresponding client response  (as  bytes,  or  as  string  which  will  be
                     automatically encoded).

                     It will be called as many times as the server produces challenges, which will depend on the
                     specific  SASL  mechanism.  (If the mechanism is defined as "client-first", the server will
                     nevertheless produce a zero-length challenge.)

                     For example, PLAIN has just one step with empty challenge, so a  handler  might  look  like
                     this:

                        plain_mech = lambda _: "\0%s\0%s" % (username, password)

                        imap.sasl_login("PLAIN", plain_mech)

                     A more complex but still stateless handler might look like this:

                        def example_mech(challenge):
                            if challenge == b"Username:"
                                return username.encode("utf-8")
                            elif challenge == b"Password:"
                                return password.encode("utf-8")
                            else:
                                return b""

                        imap.sasl_login("EXAMPLE", example_mech)

                     A stateful handler might look like this:

                        class ScramSha256SaslMechanism():
                            def __init__(self, username, password):
                                ...

                            def __call__(self, challenge):
                                self.step += 1
                                if self.step == 1:
                                    response = ...
                                elif self.step == 2:
                                    response = ...
                                return response

                        scram_mech = ScramSha256SaslMechanism(username, password)

                        imap.sasl_login("SCRAM-SHA-256", scram_mech)

              search(criteria='ALL', charset=None)
                     Return a list of messages ids from the currently selected folder matching criteria.

                     criteria  should  be  a  sequence  of one or more criteria items. Each criteria item may be
                     either unicode or bytes. Example values:

                        [u'UNSEEN']
                        [u'SMALLER', 500]
                        [b'NOT', b'DELETED']
                        [u'TEXT', u'foo bar', u'FLAGGED', u'SUBJECT', u'baz']
                        [u'SINCE', date(2005, 4, 3)]

                     IMAPClient will perform conversion and quoting as required. The caller shouldn't do this.

                     It is also possible (but not recommended) to pass the combined criteria as a single string.
                     In this case IMAPClient  won't  perform  quoting,  allowing  lower-level  specification  of
                     criteria. Examples of this style:

                        u'UNSEEN'
                        u'SMALLER 500'
                        b'NOT DELETED'
                        u'TEXT "foo bar" FLAGGED SUBJECT "baz"'
                        b'SINCE 03-Apr-2005'

                     To support complex search expressions, criteria lists can be nested. IMAPClient will insert
                     parentheses  in  the  right  places.  The  following  will match messages that are both not
                     flagged and do not have "foo" in the subject:

                        ['NOT', ['SUBJECT', 'foo', 'FLAGGED']]

                     charset specifies the character set of the criteria. It defaults to US-ASCII as this is the
                     only charset that a server is required to support by the RFC. UTF-8 is  commonly  supported
                     however.

                     Any  criteria  specified using unicode will be encoded as per charset. Specifying a unicode
                     criteria that can not be encoded using charset will result in an error.

                     Any criteria specified using bytes will be sent as-is  but  should  use  an  encoding  that
                     matches charset (the character set given is still passed on to the server).

                     See RFC 3501#section-6.4.4 for more details.

                     Note  that  criteria  arguments  that are 8-bit will be transparently sent by IMAPClient as
                     IMAP literals to ensure adherence to IMAP standards.

                     The returned list of message ids will have a special modseq attribute. This is set  if  the
                     server  included  a  MODSEQ  value  to  the  search response (i.e. if a MODSEQ criteria was
                     included in the search).

              select_folder(folder, readonly=False)
                     Set the current folder on the server.

                     Future calls to methods such as search and fetch will act on the selected folder.

                     Returns a dictionary containing the SELECT response. At least the b'EXISTS',  b'FLAGS'  and
                     b'RECENT' keys are guaranteed to exist. An example:

                        {b'EXISTS': 3,
                         b'FLAGS': (b'\Answered', b'\Flagged', b'\Deleted', ... ),
                         b'RECENT': 0,
                         b'PERMANENTFLAGS': (b'\Answered', b'\Flagged', b'\Deleted', ... ),
                         b'READ-WRITE': True,
                         b'UIDNEXT': 11,
                         b'UIDVALIDITY': 1239278212}

              set_flags(messages, flags, silent=False)
                     Set the flags for messages in the currently selected folder.

                     flags should be a sequence of strings.

                     Returns the flags set for each modified message (see get_flags), or None if silent is true.

              set_gmail_labels(messages, labels, silent=False)
                     Set the labels for messages in the currently selected folder.

                     labels should be a sequence of strings.

                     Returns  the  label set for each modified message (see get_gmail_labels), or None if silent
                     is true.

                     This only works with IMAP servers that support the X-GM-LABELS attribute (eg. Gmail).

              set_quota(quotas)
                     Set one or more quotas on resources.

                     Parameters
                            quotas -- list of Quota objects

              setacl(folder, who, what)
                     Set an ACL (what) for user (who) for a folder.

                     Set what to an empty string to remove an ACL. Returns the server response string.

              shutdown() -> None
                     Close the connection to the IMAP server (without logging out)

                     In most cases, logout() should be used instead of this. The  logout  method  also  shutdown
                     down the connection.

              socket()
                     Returns socket used to connect to server.

                     The  socket  is  provided  for  polling  purposes  only.   It  can be used in, for example,
                     selectors.BaseSelector.register() and asyncio.loop.add_reader() to wait for data.

                     WARNING:
                        All other uses of the returned socket are unsupported.  This includes reading  from  and
                        writing to the socket, as they are likely to break internal bookkeeping of messages.

              sort(sort_criteria, criteria='ALL', charset='UTF-8')
                     Return  a  list  of message ids from the currently selected folder, sorted by sort_criteria
                     and optionally filtered by criteria.

                     sort_criteria may be specified as a sequence of strings or a single string. IMAPClient will
                     take care any required conversions. Valid sort_criteria values:

                        ['ARRIVAL']
                        ['SUBJECT', 'ARRIVAL']
                        'ARRIVAL'
                        'REVERSE SIZE'

                     The criteria and charset arguments are as per search().

                     See RFC 5256 for full details.

                     Note that SORT is an extension to the IMAP4 standard so it may not be supported by all IMAP
                     servers.

              starttls(ssl_context=None)
                     Switch to an SSL encrypted connection by sending a STARTTLS command.

                     The ssl_context argument is optional and should be  a  ssl.SSLContext  object.  If  no  SSL
                     context is given, a SSL context with reasonable default settings will be used.

                     You can enable checking of the hostname in the certificate presented by the server  against
                     the  hostname which was used for connecting, by setting the check_hostname attribute of the
                     SSL context to True.  The default SSL context has this setting enabled.

                     Raises Error if the SSL connection could not be established.

                     Raises AbortError if the server does not support STARTTLS or an SSL connection  is  already
                     established.

              subscribe_folder(folder)
                     Subscribe to folder, returning the server response string.

              thread(algorithm='REFERENCES', criteria='ALL', charset='UTF-8')
                     Return a list of messages threads from the currently selected folder which match criteria.

                     Each  returned  thread  is a list of messages ids. An example return value containing three
                     message threads:

                        ((1, 2), (3,), (4, 5, 6))

                     The optional algorithm argument specifies the threading algorithm to use.

                     The criteria and charset arguments are as per search().

                     See RFC 5256 for more details.

              uid_expunge(messages)
                     Expunge deleted messages with the specified message ids from the folder.

                     This requires the UIDPLUS capability.

                     See RFC 4315#section-2.1 section 2.1 for more details.

              unselect_folder()
                     Unselect the current folder and release associated resources.

                     Unlike close_folder, the UNSELECT command does not expunge the  mailbox,  keeping  messages
                     with Deleted flag set for example.

                     Returns the UNSELECT response string returned by the server.

              unsubscribe_folder(folder)
                     Unsubscribe to folder, returning the server response string.

              property welcome
                     access the server greeting message

              xlist_folders(directory='', pattern='*')
                     Execute the XLIST command, returning (flags, delimiter, name) tuples.

                     This  method returns special flags for each folder and a localized name for certain folders
                     (e.g. the name of the inbox may be localized and the flags can be  used  to  determine  the
                     actual inbox, even if the name has been localized.

                     A XLIST response could look something like:

                        [((b'\HasNoChildren', b'\Inbox'), b'/', u'Inbox'),
                         ((b'\Noselect', b'\HasChildren'), b'/', u'[Gmail]'),
                         ((b'\HasNoChildren', b'\AllMail'), b'/', u'[Gmail]/All Mail'),
                         ((b'\HasNoChildren', b'\Drafts'), b'/', u'[Gmail]/Drafts'),
                         ((b'\HasNoChildren', b'\Important'), b'/', u'[Gmail]/Important'),
                         ((b'\HasNoChildren', b'\Sent'), b'/', u'[Gmail]/Sent Mail'),
                         ((b'\HasNoChildren', b'\Spam'), b'/', u'[Gmail]/Spam'),
                         ((b'\HasNoChildren', b'\Starred'), b'/', u'[Gmail]/Starred'),
                         ((b'\HasNoChildren', b'\Trash'), b'/', u'[Gmail]/Trash')]

                     This       is      a      deprecated      Gmail-specific      IMAP      extension      (See
                     https://developers.google.com/gmail/imap_extensions#xlist_is_deprecated      for       more
                     information).

                     The directory and pattern arguments are as per list_folders().

       class imapclient.SocketTimeout(connect: float, read: float)
              Represents timeout configuration for an IMAP connection.

              Variablesconnect -- maximum time to wait for a connection attempt to remote server

                     • read -- maximum time to wait for performing a read/write operation

              As  an  example, SocketTimeout(connect=15, read=60) will make the socket timeout if the connection
              takes more than 15 seconds to establish but read/write operations can take up to 60  seconds  once
              the connection is done.

   Fetch Response Types
       Various  types  may  be  used in the data structures returned by IMAPClient.fetch() when certain response
       types are encountered during parsing.

       class imapclient.response_types.Address(name: bytes, route: bytes, mailbox: bytes, host: bytes)
              Represents electronic mail addresses. Used to store addresses in Envelope.

              Variablesname -- The address "personal name".

                     • route -- SMTP source route (rarely used).

                     • mailbox -- Mailbox name (what comes just before the @ sign).

                     • host -- The host/domain name.

              As an example, an address header that looks like:

                 Mary Smith <mary@foo.com>

              would be represented as:

                 Address(name=u'Mary Smith', route=None, mailbox=u'mary', host=u'foo.com')

              See RFC 2822 for more detail.

              See also Envelope for information about handling of "group syntax".

       class imapclient.response_types.BodyData(iterable=(), /)
              Returned when parsing BODY and BODYSTRUCTURE responses.

       class imapclient.response_types.Envelope(date: datetime | None, subject: bytes, from_: Tuple[Address,
       ...] | None, sender: Tuple[Address, ...] | None, reply_to: Tuple[Address, ...] | None, to: Tuple[Address,
       ...] | None, cc: Tuple[Address, ...] | None, bcc: Tuple[Address, ...] | None, in_reply_to: bytes,
       message_id: bytes)
              Represents envelope structures of messages. Returned when parsing ENVELOPE responses.

              Variablesdate -- A datetime instance that represents the "Date" header.

                     • subject -- A string that contains the "Subject" header.

                     • from_ -- A tuple of Address objects that represent one or more addresses from the  "From"
                       header, or None if header does not exist.

                     • sender -- As for from_ but represents the "Sender" header.

                     • reply_to -- As for from_ but represents the "Reply-To" header.

                     • to -- As for from_ but represents the "To" header.

                     • cc -- As for from_ but represents the "Cc" header.

                     • bcc -- As for from_ but represents the "Bcc" recipients.

                     • in_reply_to -- A string that contains the "In-Reply-To" header.

                     • message_id -- A string that contains the "Message-Id" header.

              A  particular  issue to watch out for is IMAP's handling of "group syntax" in address fields. This
              is often encountered as a recipient header of the form:

                 undisclosed-recipients:;

              but can also be expressed per this more general example:

                 A group: a@example.com, B <b@example.org>;

              This example would yield the following Address tuples:

                 Address(name=None, route=None, mailbox=u'A group', host=None)
                 Address(name=None, route=None, mailbox=u'a', host=u'example.com')
                 Address(name=u'B', route=None, mailbox=u'b', host=u'example.org')
                 Address(name=None, route=None, mailbox=None, host=None)

              The first Address, where host is None, indicates  the  start  of  the  group.  The  mailbox  field
              contains  the  group  name. The final Address, where both mailbox and host are None, indicates the
              end of the group.

              See RFC 3501#section-7.4.2 and RFC 2822 for further details.

       class imapclient.response_types.SearchIds(*args: Any)
              Contains a list of message ids as returned by IMAPClient.search().

              The modseq attribute will contain the MODSEQ value returned by the  server  (only  if  the  SEARCH
              command sent involved the MODSEQ criteria). See RFC 4551 for more details.

   Exceptions
       IMAPClient  wraps exceptions raised by imaplib to ease the error handling.  All the exceptions related to
       IMAP errors are defined in the module imapclient.exceptions. The  following  general  exceptions  may  be
       raised:

       • IMAPClientError: the base class for IMAPClient's exceptions and the most commonly used error.

       • IMAPClientAbortError:  raised  if  a  serious  error  has occurred that means the IMAP connection is no
         longer usable. The connection should be dropped without logout if this occurs.

       • IMAPClientReadOnlyError: raised if a modifying operation was attempted on a read-only folder.

       More specific exceptions existed for common known errors:

       exception imapclient.exceptions.CapabilityError
              The command tried by the user needs a capability not installed on the IMAP server

       exception imapclient.exceptions.IllegalStateError
              The command tried needs a different state to be executed. This means the user is not logged in  or
              the command needs a folder to be selected.

       exception imapclient.exceptions.InvalidCriteriaError
              A command using a search criteria failed, probably due to a syntax error in the criteria string.

       exception imapclient.exceptions.LoginError
              A connection has been established with the server but an error occurred during the authentication.

       exception imapclient.exceptions.ProtocolError
              The server replied with a response that violates the IMAP protocol.

       Exceptions  from  lower  layers  are  possible, such as networks error or unicode malformed exception. In
       particular:

       • socket.error

       • socket.timeout: raised if a timeout was specified when creating the IMAPClient instance and  a  network
         operation takes too long.

       • ssl.SSLError: the base class for network or SSL protocol errors when ssl=True or starttls() is used.

       • ssl.CertificateError:  raised  when  TLS  certification  verification  fails. This is not a subclass of
         SSLError.

   Utilities
       class imapclient.testable_imapclient.MockIMAP4(spec=None, wraps=None, name=None, spec_set=None,
       parent=None, _spec_state=None, _new_name='', _new_parent=None, _spec_as_instance=False, _eat_self=None,
       unsafe=False, **kwargs)

       class imapclient.testable_imapclient.TestableIMAPClient
              Wrapper of imapclient.IMAPClient that mocks all interaction with real IMAP server.

              This class should only be used in tests, where you can safely  interact  with  imapclient  without
              running commands on a real IMAP account.

   TLS Support
       This module contains IMAPClient's functionality related to Transport Layer Security (TLS a.k.a. SSL).

       class imapclient.tls.IMAP4_TLS(host: str, port: int, ssl_context: SSLContext | None, timeout: float |
       None = None)
              IMAP4 client class for TLS/SSL connections.

              Adapted from imaplib.IMAP4_SSL.

              open(host: str = '', port: int = 993, timeout: float | None = None) -> None

                     Setup connection to remote server on "host:port"
                            (default: localhost:standard IMAP4 port).

                     This connection will be used by the routines:
                            read, readline, send, shutdown.

              read(size: int) -> bytes
                     Read 'size' bytes from remote.

              readline() -> bytes
                     Read line from remote.

              send(data: Buffer) -> None
                     Send data to remote.

              shutdown() -> None
                     Close I/O established in "open".

   Thread Safety
       Instances  of  IMAPClient  are  NOT thread safe. They should not be shared and accessed concurrently from
       multiple threads.

CONTRIBUTOR GUIDE

   Contributing to IMAPClient
       The best way to contribute changes to IMAPClient is to fork  the  official  repository  on  Github,  make
       changes in a branch in your personal fork and then submit a pull request.

       Discussion on Github before undertaking development is highly encouraged for potentially major changes.

       Although  not  essential, it will make the project maintainers much happier if change submissions include
       appropriate updates to unit tests, live tests and documentation. Please ask if you're unsure how  of  how
       the tests work.

       Please read on if you plan on submitting changes to IMAPClient.

   Source Code
       The    official    source    code    repository   for   IMAPClient   can   be   found   on   Github   at:
       https://github.com/mjs/imapclient

       Any major feature work will also be found as branches of this repository.

   Branches
       Development for the next major release happens on the master branch.

       There is also a branch for each major release series (for example: 1.x). When appropriate and when  there
       will  be  future  releases  for  a  series, changes may be selectively merged between master and a stable
       release branch.

   Release Tags
       Each released version is available in the IMAPClient repository as a Git tag (e.g. "0.9.1").

   Unit Tests
   Running Unit Tests
       To run the tests, from the root of the package source run:

          python -m unittest --verbose

   Testing Against Multiple Python Versions
       When submitting a Pull Request to IMAPClient, tests are  automatically  run  against  all  the  supported
       Python versions.

       It is possible to run these tests locally using tox. Once installed, the tox command will use the tox.ini
       file  in  the  root  of  the project source and run the unit tests against the Python versions officially
       supported by IMAPClient (provided these versions of Python are installed!).

       To avoid having to install all Python versions directly on a host, the tox-all script  can  be  used.  It
       will  run  the unit tests inside a Docker container which contains all supported Python versions. As long
       as Docker is installed and your user account can sudo to root the following should work:

          ./tox-all

       The script passes any arguments on to tox. For example to run just the tests just against Python 3.7 do:

          ./tox-all -e py37

   Writing Unit Tests
       Protocol level unit tests should not act against a real IMAP server but should use canned  data  instead.
       The  IMAPClientTest  base  class should typically be used as the base class for any tests - it provides a
       mock IMAPClient instance at self.client. See the tests in tests/test_imapclient.py for examples of how to
       write unit tests using this approach.

   Documentation
       The source for the project's documentation can be found under doc/src in the source distribution.

       In order to build the documentation you'll need install Sphinx. Running pip  install  '.[doc]'  from  the
       root of the project source will do this.

       Once Sphinx is installed, the documentation can be rebuilt using:

          python setup.py build_sphinx

EXTERNAL DOCUMENTATION

       The  Unofficial  IMAP  Protocol  Wiki  is  very  useful  when writing IMAP related software and is highly
       recommended.

AUTHORS

       IMAPClient was created by Menno Finlay-Smits <inbox@menno.io>. The project is now maintained  by  Nicolas
       Le Manchet and Menno Finlay-Smits.

       Many thanks go to the following people for their help with this project:

       • Maxime Lorant

       • Mathieu Agopian

       • Chris Arndt

       • Jp Calderone

       • John Louis del Rosario

       • Dave Eckhardt

       • Eben Freeman

       • Helder Guerreiro

       • Mark Hammond

       • Johannes Heckel

       • Thomas Jost

       • Lukasz Mierzwa

       • Naveen Nathan

       • Brian Neal

       • Phil Peterson

       • Aviv Salem

       • Andrew Scheller

       • Thomas Steinacher

       • Zac Witte

       • Hans-Peter Jansen

       • Carson Ip

       • Jonny Hatch

       • Jasper Spaans

       • Fabio Manganiello

       • Samir M

       • Devin Bayer

       • Mantas Mikulėnas

       • @zrose584

       • Michał Górny

       • François Deppierraz

       • Jasper Spaans

       • Boni Lindsley

       • Tobias Kölling

       • @pinoatrome

       • Shoaib Ahmed

       • John Villalovos

       • Claude Paroz

       • Stefan Wójcik

       • Andrzej Bartosiński

       • @axoroll7

RELEASE HISTORY

       From release 3.0.0 onwards, release notes are maintained on Github.

       Release notes for older versions can be found in these docs.

AUTHOR

       Menno Smits

COPYRIGHT

       2024, Menno Smits

3.0.1                                             Jul 01, 2024                                     IMAPCLIENT(7)