/// <summary> /// Fetches 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 IMAP server 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="fields">The desired header fields.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <exception cref="System.ArgumentOutOfRangeException"> /// <para><paramref name="min"/> is out of range.</para> /// <para>-or-</para> /// <para><paramref name="max"/> is out of range.</para> /// </exception> /// <exception cref="System.ArgumentNullException"> /// <paramref name="fields"/> is <c>null</c>. /// </exception> /// <exception cref="System.ArgumentException"> /// <paramref name="fields"/> is empty. /// </exception> /// <exception cref="System.ObjectDisposedException"> /// The <see cref="ImapClient"/> has been disposed. /// </exception> /// <exception cref="ServiceNotConnectedException"> /// The <see cref="ImapClient"/> is not connected. /// </exception> /// <exception cref="ServiceNotAuthenticatedException"> /// The <see cref="ImapClient"/> is not authenticated. /// </exception> /// <exception cref="FolderNotOpenException"> /// The <see cref="ImapFolder"/> is not currently open. /// </exception> /// <exception cref="System.NotSupportedException"> /// The <see cref="ImapFolder"/> does not support mod-sequences. /// </exception> /// <exception cref="System.OperationCanceledException"> /// The operation was canceled via the cancellation token. /// </exception> /// <exception cref="System.IO.IOException"> /// An I/O error occurred. /// </exception> /// <exception cref="ImapProtocolException"> /// The server's response contained unexpected tokens. /// </exception> /// <exception cref="ImapCommandException"> /// The server replied with a NO or BAD response. /// </exception> public override IList<IMessageSummary> Fetch (int min, int max, ulong modseq, MessageSummaryItems items, HashSet<string> fields, CancellationToken cancellationToken = default (CancellationToken)) { if (min < 0 || min >= Count) throw new ArgumentOutOfRangeException ("min"); if (max != -1 && max < min) throw new ArgumentOutOfRangeException ("max"); if (fields == null) throw new ArgumentNullException ("fields"); if (fields.Count == 0) throw new ArgumentException ("The set of header fields cannot be empty.", "fields"); if (!SupportsModSeq) throw new NotSupportedException ("The ImapFolder does not support mod-sequences."); CheckState (true, false); var query = FormatSummaryItems (ref items, fields); var command = string.Format ("FETCH {0} {1} (CHANGEDSINCE {2})\r\n", GetFetchRange (min, max), query, modseq); var ic = new ImapCommand (Engine, cancellationToken, this, command); var ctx = new FetchSummaryContext (items); ic.RegisterUntaggedHandler ("FETCH", FetchSummaryItems); ic.UserData = ctx; Engine.QueueCommand (ic); Engine.Wait (ic); ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) throw ImapCommandException.Create ("FETCH", ic); return AsReadOnly (ctx.Results.Values); }
/// <summary> /// Fetches 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 IMAP server 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> /// <exception cref="System.ArgumentOutOfRangeException"> /// <para><paramref name="min"/> is out of range.</para> /// <para>-or-</para> /// <para><paramref name="max"/> is out of range.</para> /// <para>-or-</para> /// <para><paramref name="items"/> is empty.</para> /// </exception> /// <exception cref="System.ObjectDisposedException"> /// The <see cref="ImapClient"/> has been disposed. /// </exception> /// <exception cref="ServiceNotConnectedException"> /// The <see cref="ImapClient"/> is not connected. /// </exception> /// <exception cref="ServiceNotAuthenticatedException"> /// The <see cref="ImapClient"/> is not authenticated. /// </exception> /// <exception cref="FolderNotOpenException"> /// The <see cref="ImapFolder"/> is not currently open. /// </exception> /// <exception cref="System.OperationCanceledException"> /// The operation was canceled via the cancellation token. /// </exception> /// <exception cref="System.IO.IOException"> /// An I/O error occurred. /// </exception> /// <exception cref="ImapProtocolException"> /// The server's response contained unexpected tokens. /// </exception> /// <exception cref="ImapCommandException"> /// The server replied with a NO or BAD response. /// </exception> public override IList<IMessageSummary> Fetch (int min, int max, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken)) { if (min < 0 || min > Count) throw new ArgumentOutOfRangeException ("min"); if (max != -1 && max < min) throw new ArgumentOutOfRangeException ("max"); if (items == MessageSummaryItems.None) throw new ArgumentOutOfRangeException ("items"); CheckState (true, false); if (min == Count) return new IMessageSummary[0]; var query = FormatSummaryItems (ref items, null); var command = string.Format ("FETCH {0} {1}\r\n", GetFetchRange (min, max), query); var ic = new ImapCommand (Engine, cancellationToken, this, command); var ctx = new FetchSummaryContext (items); ic.RegisterUntaggedHandler ("FETCH", FetchSummaryItems); ic.UserData = ctx; Engine.QueueCommand (ic); Engine.Wait (ic); ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) throw ImapCommandException.Create ("FETCH", ic); return AsReadOnly (ctx.Results.Values); }
/// <summary> /// Fetches 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 IMAP server 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> /// <exception cref="System.ArgumentNullException"> /// <paramref name="indexes"/> is <c>null</c>. /// </exception> /// <exception cref="System.ArgumentOutOfRangeException"> /// <paramref name="items"/> is empty. /// </exception> /// <exception cref="System.ArgumentException"> /// One or more of the <paramref name="indexes"/> is invalid. /// </exception> /// <exception cref="System.ObjectDisposedException"> /// The <see cref="ImapClient"/> has been disposed. /// </exception> /// <exception cref="ServiceNotConnectedException"> /// The <see cref="ImapClient"/> is not connected. /// </exception> /// <exception cref="ServiceNotAuthenticatedException"> /// The <see cref="ImapClient"/> is not authenticated. /// </exception> /// <exception cref="FolderNotOpenException"> /// The <see cref="ImapFolder"/> is not currently open. /// </exception> /// <exception cref="System.NotSupportedException"> /// The <see cref="ImapFolder"/> does not support mod-sequences. /// </exception> /// <exception cref="System.OperationCanceledException"> /// The operation was canceled via the cancellation token. /// </exception> /// <exception cref="System.IO.IOException"> /// An I/O error occurred. /// </exception> /// <exception cref="ImapProtocolException"> /// The server's response contained unexpected tokens. /// </exception> /// <exception cref="ImapCommandException"> /// The server replied with a NO or BAD response. /// </exception> public override IList<IMessageSummary> Fetch (IList<int> indexes, ulong modseq, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken)) { var set = ImapUtils.FormatIndexSet (indexes); if (items == MessageSummaryItems.None) throw new ArgumentOutOfRangeException ("items"); if (!SupportsModSeq) throw new NotSupportedException ("The ImapFolder does not support mod-sequences."); CheckState (true, false); if (indexes.Count == 0) return new IMessageSummary[0]; var query = FormatSummaryItems (ref items, null); var command = string.Format ("FETCH {0} {1} (CHANGEDSINCE {2})\r\n", set, query, modseq); var ic = new ImapCommand (Engine, cancellationToken, this, command); var ctx = new FetchSummaryContext (items); ic.RegisterUntaggedHandler ("FETCH", FetchSummaryItems); ic.UserData = ctx; Engine.QueueCommand (ic); Engine.Wait (ic); ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) throw ImapCommandException.Create ("FETCH", ic); return AsReadOnly (ctx.Results.Values); }
/// <summary> /// Fetches 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 IMAP server 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="fields">The desired header fields.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <exception cref="System.ArgumentNullException"> /// <para><paramref name="indexes"/> is <c>null</c>.</para> /// <para>-or-</para> /// <para><paramref name="fields"/> is <c>null</c>.</para> /// </exception> /// <exception cref="System.ArgumentException"> /// <para>One or more of the <paramref name="indexes"/> is invalid.</para> /// <para>-or-</para> /// <para><paramref name="fields"/> is empty.</para> /// </exception> /// <exception cref="System.ObjectDisposedException"> /// The <see cref="ImapClient"/> has been disposed. /// </exception> /// <exception cref="ServiceNotConnectedException"> /// The <see cref="ImapClient"/> is not connected. /// </exception> /// <exception cref="ServiceNotAuthenticatedException"> /// The <see cref="ImapClient"/> is not authenticated. /// </exception> /// <exception cref="FolderNotOpenException"> /// The <see cref="ImapFolder"/> is not currently open. /// </exception> /// <exception cref="System.OperationCanceledException"> /// The operation was canceled via the cancellation token. /// </exception> /// <exception cref="System.IO.IOException"> /// An I/O error occurred. /// </exception> /// <exception cref="ImapProtocolException"> /// The server's response contained unexpected tokens. /// </exception> /// <exception cref="ImapCommandException"> /// The server replied with a NO or BAD response. /// </exception> public override IList<IMessageSummary> Fetch (IList<int> indexes, MessageSummaryItems items, HashSet<string> fields, CancellationToken cancellationToken = default (CancellationToken)) { var set = ImapUtils.FormatIndexSet (indexes); if (fields == null) throw new ArgumentNullException ("fields"); if (fields.Count == 0) throw new ArgumentException ("The set of header fields cannot be empty.", "fields"); CheckState (true, false); if (indexes.Count == 0) return new IMessageSummary[0]; var query = FormatSummaryItems (ref items, fields); var command = string.Format ("FETCH {0} {1}\r\n", set, query); var ic = new ImapCommand (Engine, cancellationToken, this, command); var ctx = new FetchSummaryContext (items); ic.RegisterUntaggedHandler ("FETCH", FetchSummaryItems); ic.UserData = ctx; Engine.QueueCommand (ic); Engine.Wait (ic); ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) throw ImapCommandException.Create ("FETCH", ic); return AsReadOnly (ctx.Results.Values); }
/// <summary> /// Fetches 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 IMAP server supports the QRESYNC extension and the application has /// enabled this feature via <see cref="ImapClient.EnableQuickResync(CancellationToken)"/>, /// then this method will emit <see cref="MailFolder.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 IMAP server 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="fields">The desired header fields.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <exception cref="System.ArgumentNullException"> /// <para><paramref name="uids"/> is <c>null</c>.</para> /// <para>-or-</para> /// <para><paramref name="fields"/> is <c>null</c>.</para> /// </exception> /// <exception cref="System.ArgumentException"> /// <para>One or more of the <paramref name="uids"/> is invalid.</para> /// <para>-or-</para> /// <para><paramref name="fields"/> is empty.</para> /// </exception> /// <exception cref="System.ObjectDisposedException"> /// The <see cref="ImapClient"/> has been disposed. /// </exception> /// <exception cref="ServiceNotConnectedException"> /// The <see cref="ImapClient"/> is not connected. /// </exception> /// <exception cref="ServiceNotAuthenticatedException"> /// The <see cref="ImapClient"/> is not authenticated. /// </exception> /// <exception cref="FolderNotOpenException"> /// The <see cref="ImapFolder"/> is not currently open. /// </exception> /// <exception cref="System.NotSupportedException"> /// The <see cref="ImapFolder"/> does not support mod-sequences. /// </exception> /// <exception cref="System.OperationCanceledException"> /// The operation was canceled via the cancellation token. /// </exception> /// <exception cref="System.IO.IOException"> /// An I/O error occurred. /// </exception> /// <exception cref="ImapProtocolException"> /// The server's response contained unexpected tokens. /// </exception> /// <exception cref="ImapCommandException"> /// The server replied with a NO or BAD response. /// </exception> public override IList<IMessageSummary> Fetch (IList<UniqueId> uids, ulong modseq, MessageSummaryItems items, HashSet<string> fields, CancellationToken cancellationToken = default (CancellationToken)) { var set = ImapUtils.FormatUidSet (uids); if (fields == null) throw new ArgumentNullException ("fields"); if (fields.Count == 0) throw new ArgumentException ("The set of header fields cannot be empty.", "fields"); if (!SupportsModSeq) throw new NotSupportedException ("The ImapFolder does not support mod-sequences."); CheckState (true, false); if (uids.Count == 0) return new IMessageSummary[0]; var query = FormatSummaryItems (ref items, fields); var vanished = Engine.QResyncEnabled ? " VANISHED" : string.Empty; var command = string.Format ("UID FETCH {0} {1} (CHANGEDSINCE {2}{3})\r\n", set, query, modseq, vanished); var ic = new ImapCommand (Engine, cancellationToken, this, command); var ctx = new FetchSummaryContext (items); ic.RegisterUntaggedHandler ("FETCH", FetchSummaryItems); ic.UserData = ctx; Engine.QueueCommand (ic); Engine.Wait (ic); ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) throw ImapCommandException.Create ("FETCH", ic); return AsReadOnly (ctx.Results.Values); }
/// <summary> /// Fetches 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 IMAP server 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> /// <exception cref="System.ArgumentNullException"> /// <paramref name="uids"/> is <c>null</c>. /// </exception> /// <exception cref="System.ArgumentOutOfRangeException"> /// <paramref name="items"/> is empty. /// </exception> /// <exception cref="System.ArgumentException"> /// One or more of the <paramref name="uids"/> is invalid. /// </exception> /// <exception cref="System.ObjectDisposedException"> /// The <see cref="ImapClient"/> has been disposed. /// </exception> /// <exception cref="FolderNotOpenException"> /// The <see cref="ImapFolder"/> is not currently open. /// </exception> /// <exception cref="ServiceNotConnectedException"> /// The <see cref="ImapClient"/> is not connected. /// </exception> /// <exception cref="ServiceNotAuthenticatedException"> /// The <see cref="ImapClient"/> is not authenticated. /// </exception> /// <exception cref="System.OperationCanceledException"> /// The operation was canceled via the cancellation token. /// </exception> /// <exception cref="System.IO.IOException"> /// An I/O error occurred. /// </exception> /// <exception cref="ImapProtocolException"> /// The server's response contained unexpected tokens. /// </exception> /// <exception cref="ImapCommandException"> /// The server replied with a NO or BAD response. /// </exception> public override IList<IMessageSummary> Fetch (IList<UniqueId> uids, MessageSummaryItems items, CancellationToken cancellationToken = default (CancellationToken)) { var set = ImapUtils.FormatUidSet (uids); if (items == MessageSummaryItems.None) throw new ArgumentOutOfRangeException ("items"); CheckState (true, false); if (uids.Count == 0) return new IMessageSummary[0]; var query = FormatSummaryItems (ref items, null); var command = string.Format ("UID FETCH {0} {1}\r\n", set, query); var ic = new ImapCommand (Engine, cancellationToken, this, command); var ctx = new FetchSummaryContext (items); ic.RegisterUntaggedHandler ("FETCH", FetchSummaryItems); ic.UserData = ctx; Engine.QueueCommand (ic); Engine.Wait (ic); ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) throw ImapCommandException.Create ("FETCH", ic); return AsReadOnly (ctx.Results.Values); }