OpenSim.Modules.EMail/src/MailKit/IMailFolder.cs

5078 lines
269 KiB
C#

//
// IMailFolder.cs
//
// Author: Jeffrey Stedfast <jestedfa@microsoft.com>
//
// Copyright (c) 2013-2020 .NET Foundation and Contributors
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using MimeKit;
using MailKit.Search;
namespace MailKit {
/// <summary>
/// An interface for a mailbox folder as used by <see cref="IMailStore"/>.
/// </summary>
/// <remarks>
/// Implemented by message stores such as <see cref="MailKit.Net.Imap.ImapClient"/>
/// </remarks>
public interface IMailFolder : IEnumerable<MimeMessage>
{
/// <summary>
/// Gets an object that can be used to synchronize access to the folder.
/// </summary>
/// <remarks>
/// Gets an object that can be used to synchronize access to the folder.
/// </remarks>
/// <value>The sync root.</value>
object SyncRoot { get; }
/// <summary>
/// Get the parent folder.
/// </summary>
/// <remarks>
/// Root-level folders do not have a parent folder.
/// </remarks>
/// <value>The parent folder.</value>
IMailFolder ParentFolder { get; }
/// <summary>
/// Get the folder attributes.
/// </summary>
/// <remarks>
/// Gets the folder attributes.
/// </remarks>
/// <value>The folder attributes.</value>
FolderAttributes Attributes { get; }
/// <summary>
/// Get the annotation access level.
/// </summary>
/// <remarks>
/// If annotations are supported, this property can be used to determine whether or not
/// the <see cref="IMailFolder"/> supports reading and writing annotations.
/// </remarks>
AnnotationAccess AnnotationAccess { get; }
/// <summary>
/// Get the supported annotation scopes.
/// </summary>
/// <remarks>
/// If annotations are supported, this property can be used to determine which
/// annotation scopes are supported by the <see cref="IMailFolder"/>.
/// </remarks>
AnnotationScope AnnotationScopes { get; }
/// <summary>
/// Get the maximum size of annotation values supported by the folder.
/// </summary>
/// <remarks>
/// If annotations are supported, this property can be used to determine the
/// maximum size of annotation values supported by the <see cref="IMailFolder"/>.
/// </remarks>
uint MaxAnnotationSize { get; }
/// <summary>
/// Get the permanent flags.
/// </summary>
/// <remarks>
/// <para>The permanent flags are the message flags that will persist between sessions.</para>
/// <para>If the <see cref="MessageFlags.UserDefined"/> flag is set, then the folder allows
/// storing of user-defined (custom) message flags.</para>
/// </remarks>
/// <value>The permanent flags.</value>
MessageFlags PermanentFlags { get; }
/// <summary>
/// Get the accepted flags.
/// </summary>
/// <remarks>
/// The accepted flags are the message flags that will be accepted and persist
/// for the current session. For the set of flags that will persist between
/// sessions, see the <see cref="PermanentFlags"/> property.
/// </remarks>
/// <value>The accepted flags.</value>
MessageFlags AcceptedFlags { get; }
/// <summary>
/// Get the directory separator.
/// </summary>
/// <remarks>
/// Gets the directory separator.
/// </remarks>
/// <value>The directory separator.</value>
char DirectorySeparator { get; }
/// <summary>
/// Get the read/write access of the folder.
/// </summary>
/// <remarks>
/// Gets the read/write access of the folder.
/// </remarks>
/// <value>The read/write access.</value>
FolderAccess Access { get; }
/// <summary>
/// Get whether or not the folder is a namespace folder.
/// </summary>
/// <remarks>
/// Gets whether or not the folder is a namespace folder.
/// </remarks>
/// <value><c>true</c> if the folder is a namespace folder; otherwise, <c>false</c>.</value>
bool IsNamespace { get; }
/// <summary>
/// Get the full name of the folder.
/// </summary>
/// <remarks>
/// This is the equivalent of the full path of a file on a file system.
/// </remarks>
/// <value>The full name of the folder.</value>
string FullName { get; }
/// <summary>
/// Get the name of the folder.
/// </summary>
/// <remarks>
/// This is the equivalent of the file name of a file on the file system.
/// </remarks>
/// <value>The name of the folder.</value>
string Name { get; }
/// <summary>
/// Get the unique identifier for the folder, if available.
/// </summary>
/// <remarks>
/// <para>Gets a unique identifier for the folder, if available. This is useful for clients
/// implementing a message cache that want to track the folder after it is renamed by another
/// client.</para>
/// <note type="note">This property will only be available if the server supports the
/// <a href="https://tools.ietf.org/html/rfc8474">OBJECTID</a> extension.</note>
/// </remarks>
/// <value>The unique folder identifier.</value>
string Id { get; }
/// <summary>
/// Get whether or not the folder is subscribed.
/// </summary>
/// <remarks>
/// Gets whether or not the folder is subscribed.
/// </remarks>
/// <value><c>true</c> if the folder is subscribed; otherwise, <c>false</c>.</value>
bool IsSubscribed { get; }
/// <summary>
/// Get whether or not the folder is currently open.
/// </summary>
/// <remarks>
/// Gets whether or not the folder is currently open.
/// </remarks>
/// <value><c>true</c> if the folder is currently open; otherwise, <c>false</c>.</value>
bool IsOpen { get; }
/// <summary>
/// Get whether or not the folder exists.
/// </summary>
/// <remarks>
/// Gets whether or not the folder exists.
/// </remarks>
/// <value><c>true</c> if the folder exists; otherwise, <c>false</c>.</value>
bool Exists { get; }
/// <summary>
/// Get whether or not the folder supports mod-sequences.
/// </summary>
/// <remarks>
/// <para>Gets whether or not the folder supports mod-sequences.</para>
/// <para>If mod-sequences are not supported by the folder, then all of the APIs that take a modseq
/// argument will throw <see cref="System.NotSupportedException"/> and should not be used.</para>
/// </remarks>
/// <value><c>true</c> if the folder supports mod-sequences; otherwise, <c>false</c>.</value>
[Obsolete ("Use Supports(FolderFeature.ModSequences) instead.")]
bool SupportsModSeq { get; }
/// <summary>
/// Get the highest mod-sequence value of all messages in the mailbox.
/// </summary>
/// <remarks>
/// Gets the highest mod-sequence value of all messages in the mailbox.
/// </remarks>
/// <value>The highest mod-sequence value.</value>
ulong HighestModSeq { get; }
/// <summary>
/// Get the Unique ID validity.
/// </summary>
/// <remarks>
/// <para>UIDs are only valid so long as the UID validity value remains unchanged. If and when
/// the folder's <see cref="UidValidity"/> is changed, a client MUST discard its cache of UIDs
/// along with any summary information that it may have and re-query the folder.</para>
/// <para>The <see cref="UidValidity"/> will only be set after the folder has been opened.</para>
/// </remarks>
/// <value>The UID validity.</value>
uint UidValidity { get; }
/// <summary>
/// Get the UID that the next message that is added to the folder will be assigned.
/// </summary>
/// <remarks>
/// This value will only be set after the folder has been opened.
/// </remarks>
/// <value>The next UID.</value>
UniqueId? UidNext { get; }
/// <summary>
/// Get the maximum size of a message that can be appended to the folder.
/// </summary>
/// <remarks>
/// <para>Gets the maximum size of a message that can be appended to the folder.</para>
/// <note type="note">If the value is not set, then the limit is unspecified.</note>
/// </remarks>
/// <value>The append limit.</value>
uint? AppendLimit { get; }
/// <summary>
/// Get the size of the folder.
/// </summary>
/// <remarks>
/// <para>Gets the size of the folder in bytes.</para>
/// <note type="note">If the value is not set, then the size is unspecified.</note>
/// </remarks>
/// <value>The size.</value>
ulong? Size { get; }
/// <summary>
/// Get the index of the first unread message in the folder.
/// </summary>
/// <remarks>
/// This value will only be set after the folder has been opened.
/// </remarks>
/// <value>The index of the first unread message.</value>
int FirstUnread { get; }
/// <summary>
/// Get the number of unread messages in the folder.
/// </summary>
/// <remarks>
/// <para>Gets the number of unread messages in the folder.</para>
/// <note type="note">This value will only be set after calling
/// <see cref="Status(StatusItems, System.Threading.CancellationToken)"/>
/// with <see cref="StatusItems.Unread"/>.</note>
/// </remarks>
/// <value>The number of unread messages.</value>
int Unread { get; }
/// <summary>
/// Get the number of recently delivered messages in the folder.
/// </summary>
/// <remarks>
/// <para>Gets the number of recently delivered messages in the folder.</para>
/// <note type="note">
/// This value will only be set after calling
/// <see cref="Status(StatusItems, System.Threading.CancellationToken)"/>
/// with <see cref="StatusItems.Recent"/>.</note>
/// </remarks>
/// <value>The number of recently delivered messages.</value>
int Recent { get; }
/// <summary>
/// Get the total number of messages in the folder.
/// </summary>
/// <remarks>
/// Gets the total number of messages in the folder.
/// </remarks>
/// <value>The total number of messages.</value>
int Count { get; }
/// <summary>
/// Get the threading algorithms supported by the folder.
/// </summary>
/// <remarks>
/// Get the threading algorithms supported by the folder.
/// </remarks>
/// <value>The supported threading algorithms.</value>
HashSet<ThreadingAlgorithm> ThreadingAlgorithms { get; }
/// <summary>
/// Determine whether or not an <see cref="IMailFolder"/> supports a feature.
/// </summary>
/// <remarks>
/// Determines whether or not an <see cref="IMailFolder"/> supports a feature.
/// </remarks>
/// <param name="feature">The desired feature.</param>
/// <returns><c>true</c> if the feature is supported; otherwise, <c>false</c>.</returns>
bool Supports (FolderFeature feature);
/// <summary>
/// Opens the folder using the requested folder access.
/// </summary>
/// <remarks>
/// <para>This variant of the <see cref="Open(FolderAccess,System.Threading.CancellationToken)"/>
/// method is meant for quick resynchronization of the folder. Before calling this method,
/// the <see cref="IMailStore.EnableQuickResync(CancellationToken)"/> method MUST be called.</para>
/// <para>You should also make sure to add listeners to the <see cref="MessagesVanished"/> and
/// <see cref="MessageFlagsChanged"/> events to get notifications of changes since
/// the last time the folder was opened.</para>
/// </remarks>
/// <returns>The <see cref="FolderAccess"/> state of the folder.</returns>
/// <param name="access">The requested folder access.</param>
/// <param name="uidValidity">The last known <see cref="UidValidity"/> value.</param>
/// <param name="highestModSeq">The last known <see cref="HighestModSeq"/> value.</param>
/// <param name="uids">The last known list of unique message identifiers.</param>
/// <param name="cancellationToken">The cancellation token.</param>
FolderAccess Open (FolderAccess access, uint uidValidity, ulong highestModSeq, IList<UniqueId> uids, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously opens the folder using the requested folder access.
/// </summary>
/// <remarks>
/// <para>This variant of the <see cref="OpenAsync(FolderAccess,System.Threading.CancellationToken)"/>
/// method is meant for quick resynchronization of the folder. Before calling this method,
/// the <see cref="IMailStore.EnableQuickResync(CancellationToken)"/> method MUST be called.</para>
/// <para>You should also make sure to add listeners to the <see cref="MessagesVanished"/> and
/// <see cref="MessageFlagsChanged"/> events to get notifications of changes since
/// the last time the folder was opened.</para>
/// </remarks>
/// <returns>The <see cref="FolderAccess"/> state of the folder.</returns>
/// <param name="access">The requested folder access.</param>
/// <param name="uidValidity">The last known <see cref="UidValidity"/> value.</param>
/// <param name="highestModSeq">The last known <see cref="HighestModSeq"/> value.</param>
/// <param name="uids">The last known list of unique message identifiers.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<FolderAccess> OpenAsync (FolderAccess access, uint uidValidity, ulong highestModSeq, IList<UniqueId> uids, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Open the folder using the requested folder access.
/// </summary>
/// <remarks>
/// Opens the folder using the requested folder access.
/// </remarks>
/// <returns>The <see cref="FolderAccess"/> state of the folder.</returns>
/// <param name="access">The requested folder access.</param>
/// <param name="cancellationToken">The cancellation token.</param>
FolderAccess Open (FolderAccess access, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously open the folder using the requested folder access.
/// </summary>
/// <remarks>
/// Asynchronously opens the folder using the requested folder access.
/// </remarks>
/// <returns>The <see cref="FolderAccess"/> state of the folder.</returns>
/// <param name="access">The requested folder access.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<FolderAccess> OpenAsync (FolderAccess access, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Close the folder, optionally expunging the messages marked for deletion.
/// </summary>
/// <remarks>
/// Closes the folder, optionally expunging the messages marked for deletion.
/// </remarks>
/// <param name="expunge">If set to <c>true</c>, expunge.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void Close (bool expunge = false, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously close the folder, optionally expunging the messages marked for deletion.
/// </summary>
/// <remarks>
/// Asynchronously closes the folder, optionally expunging the messages marked for deletion.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="expunge">If set to <c>true</c>, expunge.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task CloseAsync (bool expunge = false, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Create a new subfolder with the given name.
/// </summary>
/// <remarks>
/// Creates a new subfolder with the given name.
/// </remarks>
/// <returns>The created folder.</returns>
/// <param name="name">The name of the folder to create.</param>
/// <param name="isMessageFolder"><c>true</c> if the folder will be used to contain messages; otherwise <c>false</c>.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IMailFolder Create (string name, bool isMessageFolder, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously create a new subfolder with the given name.
/// </summary>
/// <remarks>
/// Asynchronously creates a new subfolder with the given name.
/// </remarks>
/// <returns>The created folder.</returns>
/// <param name="name">The name of the folder to create.</param>
/// <param name="isMessageFolder"><c>true</c> if the folder will be used to contain messages; otherwise <c>false</c>.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IMailFolder> CreateAsync (string name, bool isMessageFolder, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Create a new subfolder with the given name.
/// </summary>
/// <remarks>
/// Creates a new subfolder with the given name.
/// </remarks>
/// <returns>The created folder.</returns>
/// <param name="name">The name of the folder to create.</param>
/// <param name="specialUses">A list of special uses for the folder being created.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IMailFolder Create (string name, IEnumerable<SpecialFolder> specialUses, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously create a new subfolder with the given name.
/// </summary>
/// <remarks>
/// Asynchronously creates a new subfolder with the given name.
/// </remarks>
/// <returns>The created folder.</returns>
/// <param name="name">The name of the folder to create.</param>
/// <param name="specialUses">A list of special uses for the folder being created.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IMailFolder> CreateAsync (string name, IEnumerable<SpecialFolder> specialUses, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Create a new subfolder with the given name.
/// </summary>
/// <remarks>
/// Creates a new subfolder with the given name.
/// </remarks>
/// <returns>The created folder.</returns>
/// <param name="name">The name of the folder to create.</param>
/// <param name="specialUse">The special use for the folder being created.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IMailFolder Create (string name, SpecialFolder specialUse, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously create a new subfolder with the given name.
/// </summary>
/// <remarks>
/// Asynchronously creates a new subfolder with the given name.
/// </remarks>
/// <returns>The created folder.</returns>
/// <param name="name">The name of the folder to create.</param>
/// <param name="specialUse">The special use for the folder being created.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IMailFolder> CreateAsync (string name, SpecialFolder specialUse, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Rename the folder.
/// </summary>
/// <remarks>
/// Renames the folder.
/// </remarks>
/// <param name="parent">The new parent folder.</param>
/// <param name="name">The new name of the folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void Rename (IMailFolder parent, string name, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously rename the folder.
/// </summary>
/// <remarks>
/// Asynchronously renames the folder.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="parent">The new parent folder.</param>
/// <param name="name">The new name of the folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RenameAsync (IMailFolder parent, string name, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Delete the folder.
/// </summary>
/// <remarks>
/// Deletes the folder.
/// </remarks>
/// <param name="cancellationToken">The cancellation token.</param>
void Delete (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously delete the folder.
/// </summary>
/// <remarks>
/// Asynchronously deletes the folder.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
Task DeleteAsync (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Subscribe to the folder.
/// </summary>
/// <remarks>
/// Subscribes to the folder.
/// </remarks>
/// <param name="cancellationToken">The cancellation token.</param>
void Subscribe (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously subscribe to the folder.
/// </summary>
/// <remarks>
/// Asynchronously subscribes to the folder.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
Task SubscribeAsync (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Unsubscribe from the folder.
/// </summary>
/// <remarks>
/// Unsubscribes from the folder.
/// </remarks>
/// <param name="cancellationToken">The cancellation token.</param>
void Unsubscribe (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously unsubscribe from the folder.
/// </summary>
/// <remarks>
/// Asynchronously unsubscribes from the folder.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
Task UnsubscribeAsync (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Get the subfolders.
/// </summary>
/// <remarks>
/// <para>Gets the subfolders as well as queries the server for the status of the requested items.</para>
/// <para>When the <paramref name="items"/> argument is non-empty, this has the equivalent functionality
/// of calling <see cref="GetSubfolders(bool,System.Threading.CancellationToken)"/> and then calling
/// <see cref="Status(StatusItems,System.Threading.CancellationToken)"/> on each of the returned folders.</para>
/// <note type="tip">Using this method is potentially more efficient than querying the status of each returned folder.</note>
/// </remarks>
/// <returns>The subfolders.</returns>
/// <param name="items">The status items to pre-populate.</param>
/// <param name="subscribedOnly">If set to <c>true</c>, only subscribed folders will be listed.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMailFolder> GetSubfolders (StatusItems items, bool subscribedOnly = false, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously get the subfolders.
/// </summary>
/// <remarks>
/// <para>Asynchronously gets the subfolders as well as queries the server for the status of the requested items.</para>
/// <para>When the <paramref name="items"/> argument is non-empty, this has the equivalent functionality
/// of calling <see cref="GetSubfoldersAsync(bool,System.Threading.CancellationToken)"/> and then calling
/// <see cref="StatusAsync(StatusItems,System.Threading.CancellationToken)"/> on each of the returned folders.</para>
/// </remarks>
/// <returns>The subfolders.</returns>
/// <param name="items">The status items to pre-populate.</param>
/// <param name="subscribedOnly">If set to <c>true</c>, only subscribed folders will be listed.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMailFolder>> GetSubfoldersAsync (StatusItems items, bool subscribedOnly = false, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Get the subfolders.
/// </summary>
/// <remarks>
/// Gets the subfolders.
/// </remarks>
/// <returns>The subfolders.</returns>
/// <param name="subscribedOnly">If set to <c>true</c>, only subscribed folders will be listed.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMailFolder> GetSubfolders (bool subscribedOnly = false, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously get the subfolders.
/// </summary>
/// <remarks>
/// Asynchronously gets the subfolders.
/// </remarks>
/// <returns>The subfolders.</returns>
/// <param name="subscribedOnly">If set to <c>true</c>, only subscribed folders will be listed.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMailFolder>> GetSubfoldersAsync (bool subscribedOnly = false, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Get the specified subfolder.
/// </summary>
/// <remarks>
/// Gets the specified subfolder.
/// </remarks>
/// <returns>The subfolder.</returns>
/// <param name="name">The name of the subfolder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IMailFolder GetSubfolder (string name, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously get the specified subfolder.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified subfolder.
/// </remarks>
/// <returns>The subfolder.</returns>
/// <param name="name">The name of the subfolder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IMailFolder> GetSubfolderAsync (string name, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Force the server to flush its state for the folder.
/// </summary>
/// <remarks>
/// Forces the server to flush its state for the folder.
/// </remarks>
/// <param name="cancellationToken">The cancellation token.</param>
void Check (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously force the server to flush its state for the folder.
/// </summary>
/// <remarks>
/// Asynchronously forces the server to flush its state for the folder.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
Task CheckAsync (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Update the values of the specified items.
/// </summary>
/// <remarks>
/// <para>Updates the values of the specified items.</para>
/// <para>The <see cref="Status(StatusItems, System.Threading.CancellationToken)"/> method
/// MUST NOT be used on a folder that is already in the opened state. Instead, other ways
/// of getting the desired information should be used.</para>
/// <para>For example, a common use for the <see cref="Status(StatusItems,System.Threading.CancellationToken)"/>
/// method is to get the number of unread messages in the folder. When the folder is open, however, it is
/// possible to use the <see cref="IMailFolder.Search(MailKit.Search.SearchQuery, System.Threading.CancellationToken)"/>
/// method to query for the list of unread messages.</para>
/// </remarks>
/// <param name="items">The items to update.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void Status (StatusItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously update the values of the specified items.
/// </summary>
/// <remarks>
/// <para>Updates the values of the specified items.</para>
/// <para>The <see cref="Status(StatusItems, System.Threading.CancellationToken)"/> method
/// MUST NOT be used on a folder that is already in the opened state. Instead, other ways
/// of getting the desired information should be used.</para>
/// <para>For example, a common use for the <see cref="Status(StatusItems,System.Threading.CancellationToken)"/>
/// method is to get the number of unread messages in the folder. When the folder is open, however, it is
/// possible to use the <see cref="IMailFolder.Search(MailKit.Search.SearchQuery, System.Threading.CancellationToken)"/>
/// method to query for the list of unread messages.</para>
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="items">The items to update.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task StatusAsync (StatusItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Get the complete access control list for the folder.
/// </summary>
/// <remarks>
/// Gets the complete access control list for the folder.
/// </remarks>
/// <returns>The access control list.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
AccessControlList GetAccessControlList (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously get the complete access control list for the folder.
/// </summary>
/// <remarks>
/// Asynchronously gets the complete access control list for the folder.
/// </remarks>
/// <returns>The access control list.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
Task<AccessControlList> GetAccessControlListAsync (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Get the access rights for a particular identifier.
/// </summary>
/// <remarks>
/// Gets the access rights for a particular identifier.
/// </remarks>
/// <returns>The access rights.</returns>
/// <param name="name">The identifier name.</param>
/// <param name="cancellationToken">The cancellation token.</param>
AccessRights GetAccessRights (string name, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously get the access rights for a particular identifier.
/// </summary>
/// <remarks>
/// Asynchronously gets the access rights for a particular identifier.
/// </remarks>
/// <returns>The access rights.</returns>
/// <param name="name">The identifier name.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<AccessRights> GetAccessRightsAsync (string name, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Get the access rights for the current authenticated user.
/// </summary>
/// <remarks>
/// Gets the access rights for the current authenticated user.
/// </remarks>
/// <returns>The access rights.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
AccessRights GetMyAccessRights (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously get the access rights for the current authenticated user.
/// </summary>
/// <remarks>
/// Asynchronously gets the access rights for the current authenticated user.
/// </remarks>
/// <returns>The access rights.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
Task<AccessRights> GetMyAccessRightsAsync (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add access rights for the specified identity.
/// </summary>
/// <remarks>
/// Adds the given access rights for the specified identity.
/// </remarks>
/// <param name="name">The identity name.</param>
/// <param name="rights">The access rights.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add access rights for the specified identity.
/// </summary>
/// <remarks>
/// Asynchronously adds the given access rights for the specified identity.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="name">The identity name.</param>
/// <param name="rights">The access rights.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove access rights for the specified identity.
/// </summary>
/// <remarks>
/// Removes the given access rights for the specified identity.
/// </remarks>
/// <param name="name">The identity name.</param>
/// <param name="rights">The access rights.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove access rights for the specified identity.
/// </summary>
/// <remarks>
/// Asynchronously removes the given access rights for the specified identity.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="name">The identity name.</param>
/// <param name="rights">The access rights.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the access rights for the specified identity.
/// </summary>
/// <remarks>
/// Sets the access rights for the specified identity.
/// </remarks>
/// <param name="name">The identity name.</param>
/// <param name="rights">The access rights.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetAccessRights (string name, AccessRights rights, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the access rights for the sepcified identity.
/// </summary>
/// <remarks>
/// Asynchronously sets the access rights for the specified identity.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="name">The identity name.</param>
/// <param name="rights">The access rights.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetAccessRightsAsync (string name, AccessRights rights, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove all access rights for the given identity.
/// </summary>
/// <remarks>
/// Removes all access rights for the given identity.
/// </remarks>
/// <param name="name">The identity name.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveAccess (string name, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove all access rights for the given identity.
/// </summary>
/// <remarks>
/// Asynchronously removes all access rights for the given identity.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="name">The identity name.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveAccessAsync (string name, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Get the quota information for the folder.
/// </summary>
/// <remarks>
/// <para>Gets the quota information for the folder.</para>
/// <para>To determine if a quotas are supported, check the
/// <see cref="IMailStore.SupportsQuotas"/> property.</para>
/// </remarks>
/// <returns>The folder quota.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
FolderQuota GetQuota (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously get the quota information for the folder.
/// </summary>
/// <remarks>
/// <para>Asynchronously gets the quota information for the folder.</para>
/// <para>To determine if a quotas are supported, check the
/// <see cref="IMailStore.SupportsQuotas"/> property.</para>
/// </remarks>
/// <returns>The folder quota.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
Task<FolderQuota> GetQuotaAsync (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the quota limits for the folder.
/// </summary>
/// <remarks>
/// <para>Sets the quota limits for the folder.</para>
/// <para>To determine if a quotas are supported, check the
/// <see cref="IMailStore.SupportsQuotas"/> property.</para>
/// </remarks>
/// <returns>The updated folder quota.</returns>
/// <param name="messageLimit">If not <c>null</c>, sets the maximum number of messages to allow.</param>
/// <param name="storageLimit">If not <c>null</c>, sets the maximum storage size (in kilobytes).</param>
/// <param name="cancellationToken">The cancellation token.</param>
FolderQuota SetQuota (uint? messageLimit, uint? storageLimit, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the quota limits for the folder.
/// </summary>
/// <remarks>
/// <para>Asynchronously sets the quota limits for the folder.</para>
/// <para>To determine if a quotas are supported, check the
/// <see cref="IMailStore.SupportsQuotas"/> property.</para>
/// </remarks>
/// <returns>The updated folder quota.</returns>
/// <param name="messageLimit">If not <c>null</c>, sets the maximum number of messages to allow.</param>
/// <param name="storageLimit">If not <c>null</c>, sets the maximum storage size (in kilobytes).</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<FolderQuota> SetQuotaAsync (uint? messageLimit, uint? storageLimit, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Gets the specified metadata.
/// </summary>
/// <remarks>
/// Gets the specified metadata.
/// </remarks>
/// <returns>The requested metadata value.</returns>
/// <param name="tag">The metadata tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
string GetMetadata (MetadataTag tag, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously gets the specified metadata.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified metadata.
/// </remarks>
/// <returns>The requested metadata value.</returns>
/// <param name="tag">The metadata tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<string> GetMetadataAsync (MetadataTag tag, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Gets the specified metadata.
/// </summary>
/// <remarks>
/// Gets the specified metadata.
/// </remarks>
/// <returns>The requested metadata.</returns>
/// <param name="tags">The metadata tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
MetadataCollection GetMetadata (IEnumerable<MetadataTag> tags, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously gets the specified metadata.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified metadata.
/// </remarks>
/// <returns>The requested metadata.</returns>
/// <param name="tags">The metadata tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<MetadataCollection> GetMetadataAsync (IEnumerable<MetadataTag> tags, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Gets the specified metadata.
/// </summary>
/// <remarks>
/// Gets the specified metadata.
/// </remarks>
/// <returns>The requested metadata.</returns>
/// <param name="options">The metadata options.</param>
/// <param name="tags">The metadata tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
MetadataCollection GetMetadata (MetadataOptions options, IEnumerable<MetadataTag> tags, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously gets the specified metadata.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified metadata.
/// </remarks>
/// <returns>The requested metadata.</returns>
/// <param name="options">The metadata options.</param>
/// <param name="tags">The metadata tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<MetadataCollection> GetMetadataAsync (MetadataOptions options, IEnumerable<MetadataTag> tags, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Sets the specified metadata.
/// </summary>
/// <remarks>
/// Sets the specified metadata.
/// </remarks>
/// <param name="metadata">The metadata.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetMetadata (MetadataCollection metadata, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously sets the specified metadata.
/// </summary>
/// <remarks>
/// Asynchronously sets the specified metadata.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="metadata">The metadata.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetMetadataAsync (MetadataCollection metadata, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Expunge the folder, permanently removing all messages marked for deletion.
/// </summary>
/// <remarks>
/// <para>Expunges the folder, permanently removing all messages marked for deletion.</para>
/// <note type="note">Normally, an <see cref="MessageExpunged"/> event will be emitted for each
/// message that is expunged. However, if the mail store supports the quick
/// resynchronization feature and it has been enabled via the
/// <see cref="IMailStore.EnableQuickResync(CancellationToken)"/> method, then
/// the <see cref="MessagesVanished"/> event will be emitted rather than the
/// <see cref="MessageExpunged"/> event.</note>
/// </remarks>
/// <param name="cancellationToken">The cancellation token.</param>
void Expunge (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously expunge the folder, permanently removing all messages marked for deletion.
/// </summary>
/// <remarks>
/// <para>Asynchronously expunges the folder, permanently removing all messages marked for deletion.</para>
/// <note type="note">Normally, an <see cref="MessageExpunged"/> event will be emitted for
/// each message that is expunged. However, if the mail store supports the quick
/// resynchronization feature and it has been enabled via the
/// <see cref="IMailStore.EnableQuickResync(CancellationToken)"/> method, then
/// the <see cref="MessagesVanished"/> event will be emitted rather than the
/// <see cref="MessageExpunged"/> event.</note>
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="cancellationToken">The cancellation token.</param>
Task ExpungeAsync (CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Expunge the specified uids, permanently removing them from the folder.
/// </summary>
/// <remarks>
/// <para>Expunges the specified uids, permanently removing them from the folder.</para>
/// <note type="note">Normally, an <see cref="MessageExpunged"/> event will be emitted for
/// each message that is expunged. However, if the mail store supports the quick
/// resynchronization feature and it has been enabled via the
/// <see cref="IMailStore.EnableQuickResync(CancellationToken)"/> method, then
/// the <see cref="MessagesVanished"/> event will be emitted rather than the
/// <see cref="MessageExpunged"/> event.</note>
/// </remarks>
/// <param name="uids">The message uids.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void Expunge (IList<UniqueId> uids, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously expunge the specified uids, permanently removing them from the folder.
/// </summary>
/// <remarks>
/// <para>Asynchronously expunges the specified uids, permanently removing them from the folder.</para>
/// <note type="note">Normally, an <see cref="MessageExpunged"/> event will be emitted for
/// each message that is expunged. However, if the mail store supports the quick
/// resynchronization feature and it has been enabled via the
/// <see cref="IMailStore.EnableQuickResync(CancellationToken)"/> method, then
/// the <see cref="MessagesVanished"/> event will be emitted rather than the
/// <see cref="MessageExpunged"/> event.</note>
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The message uids.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task ExpungeAsync (IList<UniqueId> uids, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Append the specified message to the folder.
/// </summary>
/// <remarks>
/// Appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Append (MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously append the specified message to the folder.
/// </summary>
/// <remarks>
/// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> AppendAsync (MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Append the specified message to the folder.
/// </summary>
/// <remarks>
/// Appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Append (MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously append the specified message to the folder.
/// </summary>
/// <remarks>
/// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> AppendAsync (MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Append the specified message to the folder.
/// </summary>
/// <remarks>
/// Appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="annotations">The message annotations.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Append (MimeMessage message, MessageFlags flags, DateTimeOffset? date, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously append the specified message to the folder.
/// </summary>
/// <remarks>
/// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="annotations">The message annotations.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> AppendAsync (MimeMessage message, MessageFlags flags, DateTimeOffset? date, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Append the specified message to the folder.
/// </summary>
/// <remarks>
/// Appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Append (FormatOptions options, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously append the specified message to the folder.
/// </summary>
/// <remarks>
/// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> AppendAsync (FormatOptions options, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Append the specified message to the folder.
/// </summary>
/// <remarks>
/// Appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Append (FormatOptions options, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously append the specified message to the folder.
/// </summary>
/// <remarks>
/// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> AppendAsync (FormatOptions options, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Append the specified message to the folder.
/// </summary>
/// <remarks>
/// Appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="annotations">The message annotations.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Append (FormatOptions options, MimeMessage message, MessageFlags flags, DateTimeOffset? date, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously append the specified message to the folder.
/// </summary>
/// <remarks>
/// Asynchronously appends the specified message to the folder and returns the UniqueId assigned to the message.
/// </remarks>
/// <returns>The UID of the appended message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="annotations">The message annotations.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> AppendAsync (FormatOptions options, MimeMessage message, MessageFlags flags, DateTimeOffset? date, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Append the specified messages to the folder.
/// </summary>
/// <remarks>
/// Appends the specified messages to the folder and returns the UniqueIds assigned to the messages.
/// </remarks>
/// <returns>The UIDs of the appended messages, if available; otherwise an empty array.</returns>
/// <param name="messages">The list of messages to append to the folder.</param>
/// <param name="flags">The message flags to use for each message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
IList<UniqueId> Append (IList<MimeMessage> messages, IList<MessageFlags> flags, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously append the specified messages to the folder.
/// </summary>
/// <remarks>
/// Asynchronously appends the specified messages to the folder and returns the UniqueIds assigned to the messages.
/// </remarks>
/// <returns>The UIDs of the appended messages, if available; otherwise an empty array.</returns>
/// <param name="messages">The list of messages to append to the folder.</param>
/// <param name="flags">The message flags to use for each message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<IList<UniqueId>> AppendAsync (IList<MimeMessage> messages, IList<MessageFlags> flags, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Append the specified messages to the folder.
/// </summary>
/// <remarks>
/// Appends the specified messages to the folder and returns the UniqueIds assigned to the messages.
/// </remarks>
/// <returns>The UIDs of the appended messages, if available; otherwise an empty array.</returns>
/// <param name="messages">The list of messages to append to the folder.</param>
/// <param name="flags">The message flags to use for each of the messages.</param>
/// <param name="dates">The received dates to use for each of the messages.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
IList<UniqueId> Append (IList<MimeMessage> messages, IList<MessageFlags> flags, IList<DateTimeOffset> dates, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously append the specified messages to the folder.
/// </summary>
/// <remarks>
/// Asynchronously appends the specified messages to the folder and returns the UniqueIds assigned to the messages.
/// </remarks>
/// <returns>The UIDs of the appended messages, if available; otherwise an empty array.</returns>
/// <param name="messages">The list of messages to append to the folder.</param>
/// <param name="flags">The message flags to use for each of the messages.</param>
/// <param name="dates">The received dates to use for each of the messages.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<IList<UniqueId>> AppendAsync (IList<MimeMessage> messages, IList<MessageFlags> flags, IList<DateTimeOffset> dates, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Append the specified messages to the folder.
/// </summary>
/// <remarks>
/// Appends the specified messages to the folder and returns the UniqueIds assigned to the messages.
/// </remarks>
/// <returns>The UIDs of the appended messages, if available; otherwise an empty array.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="messages">The list of messages to append to the folder.</param>
/// <param name="flags">The message flags to use for each message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
IList<UniqueId> Append (FormatOptions options, IList<MimeMessage> messages, IList<MessageFlags> flags, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously append the specified messages to the folder.
/// </summary>
/// <remarks>
/// Asynchronously appends the specified messages to the folder and returns the UniqueIds assigned to the messages.
/// </remarks>
/// <returns>The UIDs of the appended messages, if available; otherwise an empty array.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="messages">The list of messages to append to the folder.</param>
/// <param name="flags">The message flags to use for each message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<IList<UniqueId>> AppendAsync (FormatOptions options, IList<MimeMessage> messages, IList<MessageFlags> flags, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Append the specified messages to the folder.
/// </summary>
/// <remarks>
/// Appends the specified messages to the folder and returns the UniqueIds assigned to the messages.
/// </remarks>
/// <returns>The UIDs of the appended messages, if available; otherwise an empty array.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="messages">The list of messages to append to the folder.</param>
/// <param name="flags">The message flags to use for each of the messages.</param>
/// <param name="dates">The received dates to use for each of the messages.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
IList<UniqueId> Append (FormatOptions options, IList<MimeMessage> messages, IList<MessageFlags> flags, IList<DateTimeOffset> dates, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously append the specified messages to the folder.
/// </summary>
/// <remarks>
/// Asynchronously appends the specified messages to the folder and returns the UniqueIds assigned to the messages.
/// </remarks>
/// <returns>The UIDs of the appended messages, if available; otherwise an empty array.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="messages">The list of messages to append to the folder.</param>
/// <param name="flags">The message flags to use for each of the messages.</param>
/// <param name="dates">The received dates to use for each of the messages.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<IList<UniqueId>> AppendAsync (FormatOptions options, IList<MimeMessage> messages, IList<MessageFlags> flags, IList<DateTimeOffset> dates, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="uid">The UID of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Replace (UniqueId uid, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="uid">The UID of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> ReplaceAsync (UniqueId uid, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="uid">The UID of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Replace (UniqueId uid, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="uid">The UID of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> ReplaceAsync (UniqueId uid, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="uid">The UID of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Replace (FormatOptions options, UniqueId uid, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="uid">The UID of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> ReplaceAsync (FormatOptions options, UniqueId uid, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="uid">The UID of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Replace (FormatOptions options, UniqueId uid, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="uid">The UID of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> ReplaceAsync (FormatOptions options, UniqueId uid, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="index">The index of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Replace (int index, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="index">The index of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>;
Task<UniqueId?> ReplaceAsync (int index, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="index">The index of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Replace (int index, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="index">The index of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> ReplaceAsync (int index, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="index">The index of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Replace (FormatOptions options, int index, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="index">The index of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> ReplaceAsync (FormatOptions options, int index, MimeMessage message, MessageFlags flags = MessageFlags.None, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="index">The index of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
UniqueId? Replace (FormatOptions options, int index, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously replace a message in the folder.
/// </summary>
/// <remarks>
/// Replaces the specified message in the folder and returns the UniqueId assigned to the new message.
/// </remarks>
/// <returns>The UID of the new message, if available; otherwise, <c>null</c>.</returns>
/// <param name="options">The formatting options.</param>
/// <param name="index">The index of the message to be replaced.</param>
/// <param name="message">The message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="date">The received date of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<UniqueId?> ReplaceAsync (FormatOptions options, int index, MimeMessage message, MessageFlags flags, DateTimeOffset date, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Copy the specified message to the destination folder.
/// </summary>
/// <remarks>
/// Copies the specified message to the destination folder.
/// </remarks>
/// <returns>The UID of the message in the destination folder, if available; otherwise, <c>null</c>.</returns>
/// <param name="uid">The UID of the message to copy.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
UniqueId? CopyTo (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously copy the specified message to the destination folder.
/// </summary>
/// <remarks>
/// Asynchronously copies the specified message to the destination folder.
/// </remarks>
/// <returns>The UID of the message in the destination folder, if available; otherwise, <c>null</c>.</returns>
/// <param name="uid">The UID of the message to copy.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<UniqueId?> CopyToAsync (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Copy the specified messages to the destination folder.
/// </summary>
/// <remarks>
/// Copies the specified messages to the destination folder.
/// </remarks>
/// <returns>The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping.</returns>
/// <param name="uids">The UIDs of the messages to copy.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
UniqueIdMap CopyTo (IList<UniqueId> uids, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously copy the specified messages to the destination folder.
/// </summary>
/// <remarks>
/// Asynchronously copies the specified messages to the destination folder.
/// </remarks>
/// <returns>The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping.</returns>
/// <param name="uids">The UIDs of the messages to copy.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<UniqueIdMap> CopyToAsync (IList<UniqueId> uids, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Move the specified message to the destination folder.
/// </summary>
/// <remarks>
/// Moves the specified message to the destination folder.
/// </remarks>
/// <returns>The UID of the message in the destination folder, if available; otherwise, <c>null</c>.</returns>
/// <param name="uid">The UID of the message to move.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
UniqueId? MoveTo (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously move the specified message to the destination folder.
/// </summary>
/// <remarks>
/// Asynchronously moves the specified message to the destination folder.
/// </remarks>
/// <returns>The UID of the message in the destination folder, if available; otherwise, <c>null</c>.</returns>
/// <param name="uid">The UID of the message to move.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<UniqueId?> MoveToAsync (UniqueId uid, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Move the specified messages to the destination folder.
/// </summary>
/// <remarks>
/// Moves the specified messages to the destination folder.
/// </remarks>
/// <returns>The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping.</returns>
/// <param name="uids">The UIDs of the messages to copy.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
UniqueIdMap MoveTo (IList<UniqueId> uids, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously move the specified messages to the destination folder.
/// </summary>
/// <remarks>
/// Asynchronously moves the specified messages to the destination folder.
/// </remarks>
/// <returns>The UID mapping of the messages in the destination folder, if available; otherwise an empty mapping.</returns>
/// <param name="uids">The UIDs of the messages to copy.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<UniqueIdMap> MoveToAsync (IList<UniqueId> uids, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Copy the specified message to the destination folder.
/// </summary>
/// <remarks>
/// Copies the specified message to the destination folder.
/// </remarks>
/// <param name="index">The index of the message to copy.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void CopyTo (int index, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously copy the specified message to the destination folder.
/// </summary>
/// <remarks>
/// Asynchronously copies the specified message to the destination folder.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The indexes of the message to copy.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task CopyToAsync (int index, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Copy the specified messages to the destination folder.
/// </summary>
/// <remarks>
/// Copies the specified messages to the destination folder.
/// </remarks>
/// <param name="indexes">The indexes of the messages to copy.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void CopyTo (IList<int> indexes, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously copy the specified messages to the destination folder.
/// </summary>
/// <remarks>
/// Asynchronously copies the specified messages to the destination folder.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages to copy.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task CopyToAsync (IList<int> indexes, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Move the specified message to the destination folder.
/// </summary>
/// <remarks>
/// Moves the specified message to the destination folder.
/// </remarks>
/// <param name="index">The index of the message to move.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void MoveTo (int index, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously move the specified message to the destination folder.
/// </summary>
/// <remarks>
/// Asynchronously moves the specified message to the destination folder.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The index of the message to move.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task MoveToAsync (int index, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Move the specified messages to the destination folder.
/// </summary>
/// <remarks>
/// Moves the specified messages to the destination folder.
/// </remarks>
/// <param name="indexes">The indexes of the messages to move.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void MoveTo (IList<int> indexes, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously move the specified messages to the destination folder.
/// </summary>
/// <remarks>
/// Asynchronously moves the specified messages to the destination folder.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages to move.</param>
/// <param name="destination">The destination folder.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task MoveToAsync (IList<int> indexes, IMailFolder destination, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message UIDs.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message UIDs.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <example>
/// <code language="c#" source="Examples\ImapExamples.cs" region="DownloadBodyParts"/>
/// </example>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<UniqueId> uids, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message UIDs.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message
/// UIDs.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<UniqueId> uids, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message UIDs.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message UIDs.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<UniqueId> uids, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message UIDs.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message
/// UIDs.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<UniqueId> uids, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message UIDs.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message UIDs.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<UniqueId> uids, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message UIDs.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message
/// UIDs.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<UniqueId> uids, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message UIDs that have a
/// higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message UIDs that
/// have a higher mod-sequence value than the one specified.</para>
/// <para>If the mail store supports quick resynchronization and the application has
/// enabled this feature via <see cref="MailStore.EnableQuickResync(CancellationToken)"/>,
/// then this method will emit <see cref="MessagesVanished"/> events for messages that
/// have vanished since the specified mod-sequence value.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<UniqueId> uids, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message UIDs that have a
/// higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message UIDs that
/// have a higher mod-sequence value than the one specified.</para>
/// <para>If the mail store supports quick resynchronization and the application has
/// enabled this feature via <see cref="MailStore.EnableQuickResync(CancellationToken)"/>,
/// then this method will emit <see cref="MessagesVanished"/> events for messages that
/// have vanished since the specified mod-sequence value.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<UniqueId> uids, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message UIDs that have a
/// higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message UIDs that
/// have a higher mod-sequence value than the one specified.</para>
/// <para>If the mail store supports quick resynchronization and the application has
/// enabled this feature via <see cref="MailStore.EnableQuickResync(CancellationToken)"/>,
/// then this method will emit <see cref="MessagesVanished"/> events for messages that
/// have vanished since the specified mod-sequence value.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<UniqueId> uids, ulong modseq, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message UIDs that have a
/// higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message UIDs that
/// have a higher mod-sequence value than the one specified.</para>
/// <para>If the mail store supports quick resynchronization and the application has
/// enabled this feature via <see cref="MailStore.EnableQuickResync(CancellationToken)"/>,
/// then this method will emit <see cref="MessagesVanished"/> events for messages that
/// have vanished since the specified mod-sequence value.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<UniqueId> uids, ulong modseq, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message UIDs that have a
/// higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message UIDs that
/// have a higher mod-sequence value than the one specified.</para>
/// <para>If the mail store supports quick resynchronization and the application has
/// enabled this feature via <see cref="MailStore.EnableQuickResync(CancellationToken)"/>,
/// then this method will emit <see cref="MessagesVanished"/> events for messages that
/// have vanished since the specified mod-sequence value.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<UniqueId> uids, ulong modseq, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message UIDs that have a
/// higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message UIDs that
/// have a higher mod-sequence value than the one specified.</para>
/// <para>If the mail store supports quick resynchronization and the application has
/// enabled this feature via <see cref="MailStore.EnableQuickResync(CancellationToken)"/>,
/// then this method will emit <see cref="MessagesVanished"/> events for messages that
/// have vanished since the specified mod-sequence value.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="uids">The UIDs.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<UniqueId> uids, ulong modseq, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message indexes.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message indexes.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<int> indexes, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message indexes.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message
/// indexes.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<int> indexes, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message indexes.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message indexes.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<int> indexes, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message indexes.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message
/// indexes.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<int> indexes, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message indexes.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message indexes.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<int> indexes, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message indexes.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message
/// indexes.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<int> indexes, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message indexes that have a
/// higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message indexes that
/// have a higher mod-sequence value than the one specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<int> indexes, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message indexes that have a
/// higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message
/// indexes that have a higher mod-sequence value than the one specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<int> indexes, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message indexes that have a
/// higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message indexes that
/// have a higher mod-sequence value than the one specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<int> indexes, ulong modseq, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message indexes
/// that have a higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message
/// indexes that have a higher mod-sequence value than the one specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<int> indexes, ulong modseq, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the specified message indexes that
/// have a higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the specified message indexes that
/// have a higher mod-sequence value than the one specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (IList<int> indexes, ulong modseq, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the specified message indexes
/// that have a higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the specified message
/// indexes that have a higher mod-sequence value than the one specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="indexes">The indexes.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (IList<int> indexes, ulong modseq, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the messages between the two indexes, inclusive.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the messages between the two
/// indexes, inclusive.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (int min, int max, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the messages between the two indexes, inclusive.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the messages between
/// the two indexes, inclusive.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (int min, int max, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the messages between the two indexes, inclusive.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the messages between the two
/// indexes, inclusive.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (int min, int max, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the messages between the two indexes, inclusive.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the messages between
/// the two indexes, inclusive.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (int min, int max, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the messages between the two indexes, inclusive.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the messages between the two
/// indexes, inclusive.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (int min, int max, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the messages between the two indexes, inclusive.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the messages between
/// the two indexes, inclusive.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (int min, int max, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the messages between the two indexes (inclusive)
/// that have a higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the messages between the two
/// indexes (inclusive) that have a higher mod-sequence value than the one
/// specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (int min, int max, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the messages between the two indexes
/// (inclusive) that have a higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the messages between
/// the two indexes (inclusive) that have a higher mod-sequence value than the
/// one specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (int min, int max, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the messages between the two indexes (inclusive)
/// that have a higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the messages between the two
/// indexes (inclusive) that have a higher mod-sequence value than the one
/// specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (int min, int max, ulong modseq, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the messages between the two indexes
/// (inclusive) that have a higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the messages between
/// the two indexes (inclusive) that have a higher mod-sequence value than the
/// one specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (int min, int max, ulong modseq, MessageSummaryItems items, IEnumerable<HeaderId> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Fetch the message summaries for the messages between the two indexes (inclusive)
/// that have a higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Fetches the message summaries for the messages between the two
/// indexes (inclusive) that have a higher mod-sequence value than the one
/// specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<IMessageSummary> Fetch (int min, int max, ulong modseq, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously fetch the message summaries for the messages between the two indexes
/// (inclusive) that have a higher mod-sequence value than the one specified.
/// </summary>
/// <remarks>
/// <para>Asynchronously fetches the message summaries for the messages between
/// the two indexes (inclusive) that have a higher mod-sequence value than the
/// one specified.</para>
/// <para>It should be noted that if another client has modified any message
/// in the folder, the mail service may choose to return information that was
/// not explicitly requested. It is therefore important to be prepared to
/// handle both additional fields on a <see cref="IMessageSummary"/> for
/// messages that were requested as well as summaries for messages that were
/// not requested at all.</para>
/// </remarks>
/// <returns>An enumeration of summaries for the requested messages.</returns>
/// <param name="min">The minimum index.</param>
/// <param name="max">The maximum index, or <c>-1</c> to specify no upper bound.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="items">The message summary items to fetch.</param>
/// <param name="headers">The desired header fields.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<IMessageSummary>> FetchAsync (int min, int max, ulong modseq, MessageSummaryItems items, IEnumerable<string> headers, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Get the specified message headers.
/// </summary>
/// <remarks>
/// Gets the specified message headers.
/// </remarks>
/// <returns>The message headers.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
HeaderList GetHeaders (UniqueId uid, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get the specified message headers.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified message headers.
/// </remarks>
/// <returns>The message headers.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<HeaderList> GetHeadersAsync (UniqueId uid, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get the specified body part headers.
/// </summary>
/// <remarks>
/// Gets the specified body part headers.
/// </remarks>
/// <returns>The body part headers.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="part">The body part.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
HeaderList GetHeaders (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get the specified body part headers.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified body part headers.
/// </remarks>
/// <returns>The body part headers.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="part">The body part.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<HeaderList> GetHeadersAsync (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get the specified message headers.
/// </summary>
/// <remarks>
/// Gets the specified message headers.
/// </remarks>
/// <returns>The message headers.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
HeaderList GetHeaders (int index, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get the specified message headers.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified message headers.
/// </remarks>
/// <returns>The message headers.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<HeaderList> GetHeadersAsync (int index, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get the specified body part headers.
/// </summary>
/// <remarks>
/// Gets the specified body part headers.
/// </remarks>
/// <returns>The body part headers.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="part">The body part.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
HeaderList GetHeaders (int index, BodyPart part, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get the specified body part headers.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified body part headers.
/// </remarks>
/// <returns>The body part headers.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="part">The body part.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<HeaderList> GetHeadersAsync (int index, BodyPart part, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get the specified message.
/// </summary>
/// <remarks>
/// Gets the specified message.
/// </remarks>
/// <returns>The message.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
MimeMessage GetMessage (UniqueId uid, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get the specified message.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified message.
/// </remarks>
/// <returns>The message.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<MimeMessage> GetMessageAsync (UniqueId uid, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get the specified message.
/// </summary>
/// <remarks>
/// Gets the specified message.
/// </remarks>
/// <returns>The message.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
MimeMessage GetMessage (int index, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get the specified message.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified message.
/// </remarks>
/// <returns>The message.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<MimeMessage> GetMessageAsync (int index, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get the specified body part.
/// </summary>
/// <remarks>
/// Gets the specified body part.
/// </remarks>
/// <example>
/// <code language="c#" source="Examples\ImapExamples.cs" region="DownloadBodyParts"/>
/// </example>
/// <returns>The body part.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="part">The body part.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
MimeEntity GetBodyPart (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get the specified body part.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified body part.
/// </remarks>
/// <returns>The body part.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="part">The body part.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<MimeEntity> GetBodyPartAsync (UniqueId uid, BodyPart part, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get the specified body part.
/// </summary>
/// <remarks>
/// Gets the specified body part.
/// </remarks>
/// <returns>The body part.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="part">The body part.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
MimeEntity GetBodyPart (int index, BodyPart part, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get the specified body part.
/// </summary>
/// <remarks>
/// Asynchronously gets the specified body part.
/// </remarks>
/// <returns>The body part.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="part">The body part.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<MimeEntity> GetBodyPartAsync (int index, BodyPart part, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get a substream of the specified message.
/// </summary>
/// <remarks>
/// Gets a substream of the message. If the starting offset is beyond
/// the end of the message, an empty stream is returned. If the number of
/// bytes desired extends beyond the end of the message, a truncated stream
/// will be returned.
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Stream GetStream (UniqueId uid, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get a substream of the specified message.
/// </summary>
/// <remarks>
/// Asynchronously gets a substream of the message. If the starting offset is beyond
/// the end of the message, an empty stream is returned. If the number of
/// bytes desired extends beyond the end of the message, a truncated stream
/// will be returned.
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<Stream> GetStreamAsync (UniqueId uid, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get a substream of the specified message.
/// </summary>
/// <remarks>
/// Gets a substream of the message. If the starting offset is beyond
/// the end of the message, an empty stream is returned. If the number of
/// bytes desired extends beyond the end of the message, a truncated stream
/// will be returned.
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Stream GetStream (int index, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get a substream of the specified message.
/// </summary>
/// <remarks>
/// Asynchronously gets a substream of the message. If the starting offset is beyond
/// the end of the message, an empty stream is returned. If the number of
/// bytes desired extends beyond the end of the message, a truncated stream
/// will be returned.
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<Stream> GetStreamAsync (int index, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get a substream of the specified body part.
/// </summary>
/// <remarks>
/// Gets a substream of the body part. If the starting offset is beyond
/// the end of the body part, an empty stream is returned. If the number of
/// bytes desired extends beyond the end of the body part, a truncated stream
/// will be returned.
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="part">The desired body part.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Stream GetStream (UniqueId uid, BodyPart part, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get a substream of the specified body part.
/// </summary>
/// <remarks>
/// Asynchronously gets a substream of the body part. If the starting offset is beyond
/// the end of the body part, an empty stream is returned. If the number of
/// bytes desired extends beyond the end of the body part, a truncated stream
/// will be returned.
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="part">The desired body part.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<Stream> GetStreamAsync (UniqueId uid, BodyPart part, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get a substream of the specified body part.
/// </summary>
/// <remarks>
/// Gets a substream of the body part. If the starting offset is beyond
/// the end of the body part, an empty stream is returned. If the number of
/// bytes desired extends beyond the end of the body part, a truncated stream
/// will be returned.
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="part">The desired body part.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Stream GetStream (int index, BodyPart part, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get a substream of the specified body part.
/// </summary>
/// <remarks>
/// Asynchronously gets a substream of the body part. If the starting offset is beyond
/// the end of the body part, an empty stream is returned. If the number of
/// bytes desired extends beyond the end of the body part, a truncated stream
/// will be returned.
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="part">The desired body part.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<Stream> GetStreamAsync (int index, BodyPart part, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get a substream of the specified message.
/// </summary>
/// <remarks>
/// <para>Gets a substream of the specified message.</para>
/// <para>For more information about how to construct the <paramref name="section"/>,
/// see Section 6.4.5 of RFC3501.</para>
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="section">The desired section of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Stream GetStream (UniqueId uid, string section, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get a substream of the specified message.
/// </summary>
/// <remarks>
/// <para>Asynchronously gets a substream of the specified message.</para>
/// <para>For more information about how to construct the <paramref name="section"/>,
/// see Section 6.4.5 of RFC3501.</para>
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="section">The desired section of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<Stream> GetStreamAsync (UniqueId uid, string section, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get a substream of the specified message.
/// </summary>
/// <remarks>
/// <para>Gets a substream of the specified message. If the starting offset is beyond
/// the end of the specified section of the message, an empty stream is returned. If
/// the number of bytes desired extends beyond the end of the section, a truncated
/// stream will be returned.</para>
/// <para>For more information about how to construct the <paramref name="section"/>,
/// see Section 6.4.5 of RFC3501.</para>
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="section">The desired section of the message.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Stream GetStream (UniqueId uid, string section, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get a substream of the specified message.
/// </summary>
/// <remarks>
/// <para>Asynchronously gets a substream of the specified message. If the starting
/// offset is beyond the end of the specified section of the message, an empty stream
/// is returned. If the number of bytes desired extends beyond the end of the section,
/// a truncated stream will be returned.</para>
/// <para>For more information about how to construct the <paramref name="section"/>,
/// see Section 6.4.5 of RFC3501.</para>
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="section">The desired section of the message.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<Stream> GetStreamAsync (UniqueId uid, string section, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get a substream of the specified message.
/// </summary>
/// <remarks>
/// <para>Gets a substream of the specified message.</para>
/// <para>For more information about how to construct the <paramref name="section"/>,
/// see Section 6.4.5 of RFC3501.</para>
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="section">The desired section of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Stream GetStream (int index, string section, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get a substream of the specified message.
/// </summary>
/// <remarks>
/// <para>Asynchronously gets a substream of the specified message.</para>
/// <para>For more information about how to construct the <paramref name="section"/>,
/// see Section 6.4.5 of RFC3501.</para>
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="section">The desired section of the message.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<Stream> GetStreamAsync (int index, string section, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Get a substream of the specified message.
/// </summary>
/// <remarks>
/// <para>Gets a substream of the specified message. If the starting offset is beyond
/// the end of the specified section of the message, an empty stream is returned. If
/// the number of bytes desired extends beyond the end of the section, a truncated
/// stream will be returned.</para>
/// <para>For more information about how to construct the <paramref name="section"/>,
/// see Section 6.4.5 of RFC3501.</para>
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="section">The desired section of the message.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Stream GetStream (int index, string section, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Asynchronously get a substream of the specified message.
/// </summary>
/// <remarks>
/// <para>Asynchronously gets a substream of the specified message. If the starting
/// offset is beyond the end of the specified section of the message, an empty stream
/// is returned. If the number of bytes desired extends beyond the end of the section,
/// a truncated stream will be returned.</para>
/// <para>For more information about how to construct the <paramref name="section"/>,
/// see Section 6.4.5 of RFC3501.</para>
/// </remarks>
/// <returns>The stream.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="section">The desired section of the message.</param>
/// <param name="offset">The starting offset of the first desired byte.</param>
/// <param name="count">The number of bytes desired.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="progress">The progress reporting mechanism.</param>
Task<Stream> GetStreamAsync (int index, string section, int offset, int count, CancellationToken cancellationToken = default (CancellationToken), ITransferProgress progress = null);
/// <summary>
/// Add a set of flags to the specified message.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified message.
/// </remarks>
/// <param name="uid">The UID of the message.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddFlags (UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified message.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uid">The UIDs of the message.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddFlagsAsync (UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified message.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified message.
/// </remarks>
/// <param name="uid">The UID of the message.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddFlags (UniqueId uid, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified message.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uid">The UIDs of the message.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddFlagsAsync (UniqueId uid, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified messages.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified messages.
/// </remarks>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddFlags (IList<UniqueId> uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddFlagsAsync (IList<UniqueId> uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified messages.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified messages.
/// </remarks>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddFlags (IList<UniqueId> uids, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddFlagsAsync (IList<UniqueId> uids, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified message.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified message.
/// </remarks>
/// <param name="uid">The UID of the message.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveFlags (UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified message.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveFlagsAsync (UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified message.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified message.
/// </remarks>
/// <param name="uid">The UID of the message.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveFlags (UniqueId uid, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified message.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveFlagsAsync (UniqueId uid, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified messages.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified messages.
/// </remarks>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveFlags (IList<UniqueId> uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveFlagsAsync (IList<UniqueId> uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified messages.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified messages.
/// </remarks>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveFlags (IList<UniqueId> uids, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveFlagsAsync (IList<UniqueId> uids, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified message.
/// </summary>
/// <remarks>
/// Sets the flags of the specified message.
/// </remarks>
/// <param name="uid">The UID of the message.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetFlags (UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified message.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetFlagsAsync (UniqueId uid, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified message.
/// </summary>
/// <remarks>
/// Sets the flags of the specified message.
/// </remarks>
/// <param name="uid">The UID of the message.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetFlags (UniqueId uid, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified message.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetFlagsAsync (UniqueId uid, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified messages.
/// </summary>
/// <remarks>
/// Sets the flags of the specified messages.
/// </remarks>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetFlags (IList<UniqueId> uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetFlagsAsync (IList<UniqueId> uids, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified messages.
/// </summary>
/// <remarks>
/// Sets the flags of the specified messages.
/// </remarks>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetFlags (IList<UniqueId> uids, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetFlagsAsync (IList<UniqueId> uids, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> AddFlags (IList<UniqueId> uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> AddFlagsAsync (IList<UniqueId> uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> AddFlags (IList<UniqueId> uids, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> AddFlagsAsync (IList<UniqueId> uids, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> RemoveFlags (IList<UniqueId> uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> RemoveFlagsAsync (IList<UniqueId> uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> RemoveFlags (IList<UniqueId> uids, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> RemoveFlagsAsync (IList<UniqueId> uids, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Sets the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> SetFlags (IList<UniqueId> uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> SetFlagsAsync (IList<UniqueId> uids, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Sets the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> SetFlags (IList<UniqueId> uids, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> SetFlagsAsync (IList<UniqueId> uids, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified message.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified message.
/// </remarks>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddFlags (int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified message.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddFlagsAsync (int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified message.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified message.
/// </remarks>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddFlags (int index, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified message.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddFlagsAsync (int index, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified messages.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified messages.
/// </remarks>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddFlags (IList<int> indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddFlagsAsync (IList<int> indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified messages.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified messages.
/// </remarks>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddFlags (IList<int> indexes, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddFlagsAsync (IList<int> indexes, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified message.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified message.
/// </remarks>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveFlags (int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified message.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveFlagsAsync (int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified message.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified message.
/// </remarks>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveFlags (int index, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified message.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveFlagsAsync (int index, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified messages.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified messages.
/// </remarks>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveFlags (IList<int> indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveFlagsAsync (IList<int> indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified messages.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified messages.
/// </remarks>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveFlags (IList<int> indexes, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveFlagsAsync (IList<int> indexes, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified message.
/// </summary>
/// <remarks>
/// Sets the flags of the specified message.
/// </remarks>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetFlags (int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified message.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetFlagsAsync (int index, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified message.
/// </summary>
/// <remarks>
/// Sets the flags of the specified message.
/// </remarks>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetFlags (int index, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified message.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetFlagsAsync (int index, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified messages.
/// </summary>
/// <remarks>
/// Sets the flags of the specified messages.
/// </remarks>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetFlags (IList<int> indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetFlagsAsync (IList<int> indexes, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified messages.
/// </summary>
/// <remarks>
/// Sets the flags of the specified messages.
/// </remarks>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetFlags (IList<int> indexes, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetFlagsAsync (IList<int> indexes, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<int> AddFlags (IList<int> indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<int>> AddFlagsAsync (IList<int> indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<int> AddFlags (IList<int> indexes, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of flags to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to add.</param>
/// <param name="keywords">A set of user-defined flags to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<int>> AddFlagsAsync (IList<int> indexes, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<int> RemoveFlags (IList<int> indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<int>> RemoveFlagsAsync (IList<int> indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<int> RemoveFlags (IList<int> indexes, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of flags from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to remove.</param>
/// <param name="keywords">A set of user-defined flags to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<int>> RemoveFlagsAsync (IList<int> indexes, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Sets the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<int> SetFlags (IList<int> indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<int>> SetFlagsAsync (IList<int> indexes, ulong modseq, MessageFlags flags, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Sets the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<int> SetFlags (IList<int> indexes, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously sets the flags of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="flags">The message flags to set.</param>
/// <param name="keywords">A set of user-defined flags to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<int>> SetFlagsAsync (IList<int> indexes, ulong modseq, MessageFlags flags, HashSet<string> keywords, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of labels to the specified message.
/// </summary>
/// <remarks>
/// Adds a set of labels to the specified message.
/// </remarks>
/// <param name="uid">The UID of the message.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageFlagsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddLabels (UniqueId uid, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of labels to the specified message.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of labels to the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uid">The UIDs of the message.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddLabelsAsync (UniqueId uid, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of labels to the specified messages.
/// </summary>
/// <remarks>
/// Adds a set of labels to the specified messages.
/// </remarks>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddLabels (IList<UniqueId> uids, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of labels to the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of labels to the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddLabelsAsync (IList<UniqueId> uids, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of labels from the specified message.
/// </summary>
/// <remarks>
/// Removes a set of labels from the specified message.
/// </remarks>
/// <param name="uid">The UID of the message.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveLabels (UniqueId uid, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of labels from the specified message.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of labels from the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveLabelsAsync (UniqueId uid, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of labels from the specified messages.
/// </summary>
/// <remarks>
/// Removes a set of labels from the specified messages.
/// </remarks>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveLabels (IList<UniqueId> uids, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of labels from the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of labels from the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveLabelsAsync (IList<UniqueId> uids, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the labels of the specified message.
/// </summary>
/// <remarks>
/// Sets the labels of the specified message.
/// </remarks>
/// <param name="uid">The UID of the message.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetLabels (UniqueId uid, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the labels of the specified message.
/// </summary>
/// <remarks>
/// Asynchronously sets the labels of the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetLabelsAsync (UniqueId uid, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the labels of the specified messages.
/// </summary>
/// <remarks>
/// Sets the labels of the specified messages.
/// </remarks>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetLabels (IList<UniqueId> uids, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the labels of the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously sets the labels of the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetLabelsAsync (IList<UniqueId> uids, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of labels to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Adds a set of labels to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> AddLabels (IList<UniqueId> uids, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of labels to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of labels to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> AddLabelsAsync (IList<UniqueId> uids, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of labels from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Removes a set of labels from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> RemoveLabels (IList<UniqueId> uids, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of labels from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of labels from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> RemoveLabelsAsync (IList<UniqueId> uids, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the labels of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Sets the labels of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> SetLabels (IList<UniqueId> uids, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the labels of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously sets the labels of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> SetLabelsAsync (IList<UniqueId> uids, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of labels to the specified message.
/// </summary>
/// <remarks>
/// Adds a set of labels to the specified message.
/// </remarks>
/// <param name="index">The index of the message.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddLabels (int index, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of labels to the specified message.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of labels to the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddLabelsAsync (int index, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of labels to the specified messages.
/// </summary>
/// <remarks>
/// Adds a set of labels to the specified messages.
/// </remarks>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void AddLabels (IList<int> indexes, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of labels to the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of labels to the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task AddLabelsAsync (IList<int> indexes, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of labels from the specified message.
/// </summary>
/// <remarks>
/// Removes a set of labels from the specified message.
/// </remarks>
/// <param name="index">The index of the message.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveLabels (int index, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of labels from the specified message.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of labels from the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveLabelsAsync (int index, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of labels from the specified messages.
/// </summary>
/// <remarks>
/// Removes a set of labels from the specified messages.
/// </remarks>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void RemoveLabels (IList<int> indexes, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of labels from the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of labels from the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task RemoveLabelsAsync (IList<int> indexes, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the labels of the specified message.
/// </summary>
/// <remarks>
/// Sets the labels of the specified message.
/// </remarks>
/// <param name="index">The index of the message.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetLabels (int index, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the labels of the specified message.
/// </summary>
/// <remarks>
/// Asynchronously sets the labels of the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The index of the message.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetLabelsAsync (int index, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the labels of the specified messages.
/// </summary>
/// <remarks>
/// Sets the labels of the specified messages.
/// </remarks>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void SetLabels (IList<int> indexes, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the labels of the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously sets the labels of the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task SetLabelsAsync (IList<int> indexes, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Add a set of labels to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Adds a set of labels to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<int> AddLabels (IList<int> indexes, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously add a set of labels to the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously adds a set of labels to the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to add.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<int>> AddLabelsAsync (IList<int> indexes, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Remove a set of labels from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Removes a set of labels from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<int> RemoveLabels (IList<int> indexes, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously remove a set of labels from the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously removes a set of labels from the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to remove.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<int>> RemoveLabelsAsync (IList<int> indexes, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Set the labels of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Sets the labels of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<int> SetLabels (IList<int> indexes, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously set the labels of the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously sets the labels of the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="labels">The labels to set.</param>
/// <param name="silent">If set to <c>true</c>, no <see cref="MessageLabelsChanged"/> events will be emitted.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<int>> SetLabelsAsync (IList<int> indexes, ulong modseq, IList<string> labels, bool silent, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Store the annotations for the specified message.
/// </summary>
/// <remarks>
/// Stores the annotations for the specified message.
/// </remarks>
/// <param name="uid">The UID of the message.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void Store (UniqueId uid, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously store the annotations for the specified message.
/// </summary>
/// <remarks>
/// Asynchronously stores the annotations for the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uid">The UID of the message.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task StoreAsync (UniqueId uid, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Store the annotations for the specified messages.
/// </summary>
/// <remarks>
/// Stores the annotations for the specified messages.
/// </remarks>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void Store (IList<UniqueId> uids, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously store the annotations for the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously stores the annotations for the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task StoreAsync (IList<UniqueId> uids, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Store the annotations for the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Stores the annotations for the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> Store (IList<UniqueId> uids, ulong modseq, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously store the annotations for the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously stores the annotations for the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The unique IDs of the messages that were not updated.</returns>
/// <param name="uids">The UIDs of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> StoreAsync (IList<UniqueId> uids, ulong modseq, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Store the annotations for the specified message.
/// </summary>
/// <remarks>
/// Stores the annotations for the specified message.
/// </remarks>
/// <param name="index">The index of the message.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void Store (int index, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously store the annotations for the specified message.
/// </summary>
/// <remarks>
/// Asynchronously stores the annotations for the specified message.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="index">The indexes of the message.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task StoreAsync (int index, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Store the annotations for the specified messages.
/// </summary>
/// <remarks>
/// Stores the annotations for the specified messages.
/// </remarks>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
void Store (IList<int> indexes, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously store the annotations for the specified messages.
/// </summary>
/// <remarks>
/// Asynchronously stores the annotations for the specified messages.
/// </remarks>
/// <returns>An asynchronous task context.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task StoreAsync (IList<int> indexes, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Store the annotations for the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Stores the annotations for the specified messages only if their mod-sequence value is less than the specified value.
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<int> Store (IList<int> indexes, ulong modseq, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously store the annotations for the specified messages only if their mod-sequence value is less than the specified value.
/// </summary>
/// <remarks>
/// Asynchronously stores the annotations for the specified messages only if their mod-sequence value is less than the specified value.s
/// </remarks>
/// <returns>The indexes of the messages that were not updated.</returns>
/// <param name="indexes">The indexes of the messages.</param>
/// <param name="modseq">The mod-sequence value.</param>
/// <param name="annotations">The annotations to store.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<int>> StoreAsync (IList<int> indexes, ulong modseq, IList<Annotation> annotations, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Search the folder for messages matching the specified query.
/// </summary>
/// <remarks>
/// The returned array of unique identifiers can be used with methods such as
/// <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of matching UIDs.</returns>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> Search (SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously search the folder for messages matching the specified query.
/// </summary>
/// <remarks>
/// The returned array of unique identifiers can be used with methods such as
/// <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of matching UIDs.</returns>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> SearchAsync (SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Search the subset of UIDs in the folder for messages matching the specified query.
/// </summary>
/// <remarks>
/// The returned array of unique identifiers can be used with methods such as
/// <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of matching UIDs.</returns>
/// <param name="uids">The subset of UIDs</param>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> Search (IList<UniqueId> uids, SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously search the subset of UIDs in the folder for messages matching the specified query.
/// </summary>
/// <remarks>
/// The returned array of unique identifiers can be used with methods such as
/// <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of matching UIDs.</returns>
/// <param name="uids">The subset of UIDs</param>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> SearchAsync (IList<UniqueId> uids, SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Search the folder for messages matching the specified query.
/// </summary>
/// <remarks>
/// Searches the folder for messages matching the specified query,
/// returning only the specified search results.
/// </remarks>
/// <returns>The search results.</returns>
/// <param name="options">The search options.</param>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
SearchResults Search (SearchOptions options, SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously search the folder for messages matching the specified query.
/// </summary>
/// <remarks>
/// Asynchronously searches the folder for messages matching the specified query,
/// returning only the specified search results.
/// </remarks>
/// <returns>The search results.</returns>
/// <param name="options">The search options.</param>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<SearchResults> SearchAsync (SearchOptions options, SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Search the subset of UIDs in the folder for messages matching the specified query.
/// </summary>
/// <remarks>
/// Searches the fsubset of UIDs in the folder for messages matching the specified query,
/// returning only the specified search results.
/// </remarks>
/// <returns>The search results.</returns>
/// <param name="options">The search options.</param>
/// <param name="uids">The subset of UIDs</param>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
SearchResults Search (SearchOptions options, IList<UniqueId> uids, SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously search the subset of UIDs in the folder for messages matching the specified query.
/// </summary>
/// <remarks>
/// Asynchronously searches the fsubset of UIDs in the folder for messages matching the specified query,
/// returning only the specified search results.
/// </remarks>
/// <returns>The search results.</returns>
/// <param name="options">The search options.</param>
/// <param name="uids">The subset of UIDs</param>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<SearchResults> SearchAsync (SearchOptions options, IList<UniqueId> uids, SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Sort messages matching the specified query.
/// </summary>
/// <remarks>
/// The returned array of unique identifiers will be sorted in the preferred order and
/// can be used with <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of matching UIDs in the specified sort order.</returns>
/// <param name="query">The search query.</param>
/// <param name="orderBy">The sort order.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> Sort (SearchQuery query, IList<OrderBy> orderBy, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously sort messages matching the specified query.
/// </summary>
/// <remarks>
/// The returned array of unique identifiers will be sorted in the preferred order and
/// can be used with <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of matching UIDs in the specified sort order.</returns>
/// <param name="query">The search query.</param>
/// <param name="orderBy">The sort order.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> SortAsync (SearchQuery query, IList<OrderBy> orderBy, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Sort messages matching the specified query.
/// </summary>
/// <remarks>
/// The returned array of unique identifiers will be sorted in the preferred order and
/// can be used with <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of matching UIDs in the specified sort order.</returns>
/// <param name="uids">The subset of UIDs</param>
/// <param name="query">The search query.</param>
/// <param name="orderBy">The sort order.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<UniqueId> Sort (IList<UniqueId> uids, SearchQuery query, IList<OrderBy> orderBy, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously sort messages matching the specified query.
/// </summary>
/// <remarks>
/// The returned array of unique identifiers will be sorted in the preferred order and
/// can be used with <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of matching UIDs in the specified sort order.</returns>
/// <param name="uids">The subset of UIDs</param>
/// <param name="query">The search query.</param>
/// <param name="orderBy">The sort order.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<UniqueId>> SortAsync (IList<UniqueId> uids, SearchQuery query, IList<OrderBy> orderBy, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Sort messages matching the specified query.
/// </summary>
/// <remarks>
/// Searches the folder for messages matching the specified query, returning the search results in the specified sort order.
/// </remarks>
/// <returns>The search results.</returns>
/// <param name="options">The search options.</param>
/// <param name="query">The search query.</param>
/// <param name="orderBy">The sort order.</param>
/// <param name="cancellationToken">The cancellation token.</param>
SearchResults Sort (SearchOptions options, SearchQuery query, IList<OrderBy> orderBy, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously sort messages matching the specified query.
/// </summary>
/// <remarks>
/// Asynchronously searches the folder for messages matching the specified query, returning the search results in the specified sort order.
/// </remarks>
/// <returns>The search results.</returns>
/// <param name="options">The search options.</param>
/// <param name="query">The search query.</param>
/// <param name="orderBy">The sort order.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<SearchResults> SortAsync (SearchOptions options, SearchQuery query, IList<OrderBy> orderBy, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Sort messages matching the specified query.
/// </summary>
/// <remarks>
/// Searches the folder for messages matching the specified query, returning the search results in the specified sort order.
/// </remarks>
/// <returns>The search results.</returns>
/// <param name="options">The search options.</param>
/// <param name="uids">The subset of UIDs</param>
/// <param name="query">The search query.</param>
/// <param name="orderBy">The sort order.</param>
/// <param name="cancellationToken">The cancellation token.</param>
SearchResults Sort (SearchOptions options, IList<UniqueId> uids, SearchQuery query, IList<OrderBy> orderBy, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously sort messages matching the specified query.
/// </summary>
/// <remarks>
/// Asynchronously searches the folder for messages matching the specified query,
/// returning the search results in the specified sort order.
/// </remarks>
/// <returns>The search results.</returns>
/// <param name="options">The search options.</param>
/// <param name="uids">The subset of UIDs</param>
/// <param name="query">The search query.</param>
/// <param name="orderBy">The sort order.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<SearchResults> SortAsync (SearchOptions options, IList<UniqueId> uids, SearchQuery query, IList<OrderBy> orderBy, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Thread the messages in the folder that match the search query using the specified threading algorithm.
/// </summary>
/// <remarks>
/// The <see cref="MessageThread.UniqueId"/> can be used with methods such as
/// <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of message threads.</returns>
/// <param name="algorithm">The threading algorithm to use.</param>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<MessageThread> Thread (ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously thread the messages in the folder that match the search query using the specified threading algorithm.
/// </summary>
/// <remarks>
/// The <see cref="MessageThread.UniqueId"/> can be used with methods such as
/// <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of message threads.</returns>
/// <param name="algorithm">The threading algorithm to use.</param>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<MessageThread>> ThreadAsync (ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Thread the messages in the folder that match the search query using the specified threading algorithm.
/// </summary>
/// <remarks>
/// The <see cref="MessageThread.UniqueId"/> can be used with methods such as
/// <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of message threads.</returns>
/// <param name="uids">The subset of UIDs</param>
/// <param name="algorithm">The threading algorithm to use.</param>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
IList<MessageThread> Thread (IList<UniqueId> uids, ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Asynchronously thread the messages in the folder that match the search query using the specified threading algorithm.
/// </summary>
/// <remarks>
/// The <see cref="MessageThread.UniqueId"/> can be used with methods such as
/// <see cref="IMailFolder.GetMessage(UniqueId,CancellationToken,ITransferProgress)"/>.
/// </remarks>
/// <returns>An array of message threads.</returns>
/// <param name="uids">The subset of UIDs</param>
/// <param name="algorithm">The threading algorithm to use.</param>
/// <param name="query">The search query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
Task<IList<MessageThread>> ThreadAsync (IList<UniqueId> uids, ThreadingAlgorithm algorithm, SearchQuery query, CancellationToken cancellationToken = default (CancellationToken));
/// <summary>
/// Occurs when the folder is opened.
/// </summary>
/// <remarks>
/// Emitted when the folder is opened.
/// </remarks>
event EventHandler<EventArgs> Opened;
/// <summary>
/// Occurs when the folder is closed.
/// </summary>
/// <remarks>
/// Emitted when the folder is closed.
/// </remarks>
event EventHandler<EventArgs> Closed;
/// <summary>
/// Occurs when the folder is deleted.
/// </summary>
/// <remarks>
/// Emitted when the folder is deleted.
/// </remarks>
event EventHandler<EventArgs> Deleted;
/// <summary>
/// Occurs when the folder is renamed.
/// </summary>
/// <remarks>
/// Emitted when the folder is renamed.
/// </remarks>
event EventHandler<FolderRenamedEventArgs> Renamed;
/// <summary>
/// Occurs when the folder is subscribed.
/// </summary>
/// <remarks>
/// Emitted when the folder is subscribed.
/// </remarks>
event EventHandler<EventArgs> Subscribed;
/// <summary>
/// Occurs when the folder is unsubscribed.
/// </summary>
/// <remarks>
/// Emitted when the folder is unsubscribed.
/// </remarks>
event EventHandler<EventArgs> Unsubscribed;
/// <summary>
/// Occurs when a message is expunged from the folder.
/// </summary>
/// <remarks>
/// Emitted when a message is expunged from the folder.
/// </remarks>
/// <example>
/// <code language="c#" source="Examples\ImapIdleExample.cs"/>
/// </example>
event EventHandler<MessageEventArgs> MessageExpunged;
/// <summary>
/// Occurs when messages vanish from the folder.
/// </summary>
/// <remarks>
/// Emitted when a messages vanish from the folder.
/// </remarks>
event EventHandler<MessagesVanishedEventArgs> MessagesVanished;
/// <summary>
/// Occurs when flags changed on a message.
/// </summary>
/// <remarks>
/// Emitted when flags changed on a message.
/// </remarks>
/// <example>
/// <code language="c#" source="Examples\ImapIdleExample.cs"/>
/// </example>
event EventHandler<MessageFlagsChangedEventArgs> MessageFlagsChanged;
/// <summary>
/// Occurs when labels changed on a message.
/// </summary>
/// <remarks>
/// Emitted when labels changed on a message.
/// </remarks>
event EventHandler<MessageLabelsChangedEventArgs> MessageLabelsChanged;
/// <summary>
/// Occurs when annotations changed on a message.
/// </summary>
/// <remarks>
/// Emitted when annotations changed on a message.
/// </remarks>
event EventHandler<AnnotationsChangedEventArgs> AnnotationsChanged;
/// <summary>
/// Occurs when a message summary is fetched from the folder.
/// </summary>
/// <remarks>
/// <para>Emitted when a message summary is fetched from the folder.</para>
/// <para>When multiple message summaries are being fetched from a remote folder,
/// it is possible that the connection will drop or some other exception will
/// occur, causing the Fetch method to fail, requiring the client to request the
/// same set of message summaries again after it reconnects. This is obviously
/// inefficient. To alleviate this potential problem, this event will be emitted
/// as soon as the <see cref="IMailFolder"/> successfully retrieves the complete
/// <see cref="IMessageSummary"/> for each requested message.</para>
/// <note type="note">The <a href="Overload_MailKit_IMailFolder_Fetch.htm">Fetch</a>
/// methods will return a list of all message summaries that any information was
/// retrieved for, regardless of whether or not all of the requested items were fetched,
/// therefore there may be a discrepency between the number of times this event is
/// emitetd and the number of summary items returned from the Fetch method.</note>
/// </remarks>
event EventHandler<MessageSummaryFetchedEventArgs> MessageSummaryFetched;
/// <summary>
/// Occurs when metadata changes.
/// </summary>
/// <remarks>
/// The <see cref="MetadataChanged"/> event is emitted when metadata changes.
/// </remarks>
event EventHandler<MetadataChangedEventArgs> MetadataChanged;
/// <summary>
/// Occurs when the mod-sequence changed on a message.
/// </summary>
/// <remarks>
/// Emitted when the mod-sequence changed on a message.
/// </remarks>
event EventHandler<ModSeqChangedEventArgs> ModSeqChanged;
/// <summary>
/// Occurs when the highest mod-sequence changes.
/// </summary>
/// <remarks>
/// The <see cref="HighestModSeqChanged"/> event is emitted whenever the <see cref="HighestModSeq"/> value changes.
/// </remarks>
event EventHandler<EventArgs> HighestModSeqChanged;
/// <summary>
/// Occurs when the next UID changes.
/// </summary>
/// <remarks>
/// Emitted when the <see cref="UidNext"/> property changes.
/// </remarks>
event EventHandler<EventArgs> UidNextChanged;
/// <summary>
/// Occurs when the UID validity changes.
/// </summary>
/// <remarks>
/// Emitted when the <see cref="UidValidity"/> property changes.
/// </remarks>
event EventHandler<EventArgs> UidValidityChanged;
/// <summary>
/// Occurs when the ID changes.
/// </summary>
/// <remarks>
/// Emitted when the <see cref="Id"/> property changes.
/// </remarks>
event EventHandler<EventArgs> IdChanged;
/// <summary>
/// Occurs when the size of the folder changes.
/// </summary>
/// <remarks>
/// Emitted when the <see cref="Size"/> property changes.
/// </remarks>
event EventHandler<EventArgs> SizeChanged;
/// <summary>
/// Occurs when the message count changes.
/// </summary>
/// <remarks>
/// Emitted when the <see cref="Count"/> property changes.
/// </remarks>
/// <example>
/// <code language="c#" source="Examples\ImapIdleExample.cs"/>
/// </example>
event EventHandler<EventArgs> CountChanged;
/// <summary>
/// Occurs when the recent message count changes.
/// </summary>
/// <remarks>
/// Emitted when the <see cref="Recent"/> property changes.
/// </remarks>
event EventHandler<EventArgs> RecentChanged;
/// <summary>
/// Occurs when the message unread count changes.
/// </summary>
/// <remarks>
/// Emitted when the <see cref="Unread"/> property changes.
/// </remarks>
event EventHandler<EventArgs> UnreadChanged;
}
}